diff --git a/res/prometheus/bridges.c b/res/prometheus/bridges.c
index 47dee9a221a8351c00738cd129088b07bac8bc92..0f09603e655ddf8b4e95e308deee41f1cd912e05 100644
--- a/res/prometheus/bridges.c
+++ b/res/prometheus/bridges.c
@@ -77,6 +77,7 @@ struct bridge_metric_defs {
  */
 static void bridges_scrape_cb(struct ast_str **response)
 {
+	struct ao2_container *bridge_cache;
 	struct ao2_container *bridges;
 	struct ao2_iterator it_bridges;
 	struct ast_bridge *bridge;
@@ -92,10 +93,17 @@ static void bridges_scrape_cb(struct ast_str **response)
 
 	ast_eid_to_str(eid_str, sizeof(eid_str), &ast_eid_default);
 
-	bridges = ast_bridges();
+	bridge_cache = ast_bridges();
+	if (!bridge_cache) {
+		return;
+	}
+
+	bridges = ao2_container_clone(bridge_cache, 0);
+	ao2_ref(bridge_cache, -1);
 	if (!bridges) {
 		return;
 	}
+
 	num_bridges = ao2_container_count(bridges);
 
 	/* Current endpoint count */
@@ -178,4 +186,4 @@ int bridge_metrics_init(void)
 	prometheus_callback_register(&bridges_callback);
 
 	return 0;
-}
\ No newline at end of file
+}
diff --git a/res/prometheus/channels.c b/res/prometheus/channels.c
index 97b7519c0dd56cb296377fc9660742d5ec3c1a62..930ae5485bbb80fc7a0c64fc1f6c29a21235b1f9 100644
--- a/res/prometheus/channels.c
+++ b/res/prometheus/channels.c
@@ -129,6 +129,7 @@ static struct prometheus_metric global_channel_metrics[] = {
  */
 static void channels_scrape_cb(struct ast_str **response)
 {
+	struct ao2_container *channel_cache;
 	struct ao2_container *channels;
 	struct ao2_iterator it_chans;
 	struct ast_channel_snapshot *snapshot;
@@ -145,7 +146,17 @@ static void channels_scrape_cb(struct ast_str **response)
 
 	ast_eid_to_str(eid_str, sizeof(eid_str), &ast_eid_default);
 
-	channels = ast_channel_cache_all();
+	channel_cache = ast_channel_cache_all();
+	if (!channel_cache) {
+		return;
+	}
+
+	channels = ao2_container_clone(channel_cache, 0);
+	ao2_ref(channel_cache, -1);
+	if (!channels) {
+		return;
+	}
+
 	num_channels = ao2_container_count(channels);
 
 	/* Channel count */
@@ -233,4 +244,4 @@ int channel_metrics_init(void)
 	prometheus_callback_register(&channels_callback);
 
 	return 0;
-}
\ No newline at end of file
+}
diff --git a/res/prometheus/endpoints.c b/res/prometheus/endpoints.c
index 5f758c564166cebc79f97ca3950c08dba9514c3f..a575198431bb8ce5b03a65d7cb0a665dafb60586 100644
--- a/res/prometheus/endpoints.c
+++ b/res/prometheus/endpoints.c
@@ -96,6 +96,7 @@ struct endpoint_metric_defs {
  */
 static void endpoints_scrape_cb(struct ast_str **response)
 {
+	struct ao2_container *endpoint_cache;
 	struct ao2_container *endpoints;
 	struct ao2_iterator it_endpoints;
 	struct stasis_message *message;
@@ -111,10 +112,16 @@ static void endpoints_scrape_cb(struct ast_str **response)
 
 	ast_eid_to_str(eid_str, sizeof(eid_str), &ast_eid_default);
 
-	endpoints = stasis_cache_dump(ast_endpoint_cache(), ast_endpoint_snapshot_type());
+	endpoint_cache = stasis_cache_dump(ast_endpoint_cache(), ast_endpoint_snapshot_type());
+	if (!endpoint_cache) {
+		return;
+	}
+	endpoints = ao2_container_clone(endpoint_cache, 0);
+	ao2_ref(endpoint_cache, -1);
 	if (!endpoints) {
 		return;
 	}
+
 	num_endpoints = ao2_container_count(endpoints);
 
 	/* Current endpoint count */