From 983ac8c4765c30d67d471cf95dea900a6d58071a Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Fri, 30 Aug 2024 12:41:37 -0400 Subject: [PATCH] Add prometheus tags for raft_cluster to non-QQ raft metrics By default Ra will use the cluster name as the metrics key. Currently atom values are ignored by the prometheus plugin's tag rendering functions, so if you have a QQ and Khepri running and request the `/metrics/per-object` or `/metrics/detailed` endpoints you'll see values that don't have labels set for the `ra_metrics` metrics: # TYPE rabbitmq_raft_term_total counter # HELP rabbitmq_raft_term_total Current Raft term number rabbitmq_raft_term_total{vhost="/",queue="qq"} 9 rabbitmq_raft_term_total 10 With this change we map the name of the Ra cluster to a "raft_cluster" tag, so instead an example metric might be: # TYPE rabbitmq_raft_term_total counter # HELP rabbitmq_raft_term_total Current Raft term number rabbitmq_raft_term_total{vhost="/",queue="qq"} 9 rabbitmq_raft_term_total{raft_cluster="rabbitmq_metadata"} 10 This affects metrics for Khepri and the stream coordinator. (cherry picked from commit 512f8838fd49e12cd7f3cd014175ba267ce9090c) --- .../prometheus_rabbitmq_core_metrics_collector.erl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/deps/rabbitmq_prometheus/src/collectors/prometheus_rabbitmq_core_metrics_collector.erl b/deps/rabbitmq_prometheus/src/collectors/prometheus_rabbitmq_core_metrics_collector.erl index 848e6c764fde..0e4ed2c1294c 100644 --- a/deps/rabbitmq_prometheus/src/collectors/prometheus_rabbitmq_core_metrics_collector.erl +++ b/deps/rabbitmq_prometheus/src/collectors/prometheus_rabbitmq_core_metrics_collector.erl @@ -640,6 +640,19 @@ get_data(Table, false, VHostsFilter) when Table == channel_exchange_metrics; _ -> [Result] end; +get_data(ra_metrics = Table, true, _) -> + ets:foldl( + fun ({#resource{kind = queue}, _, _, _, _, _, _} = Row, Acc) -> + %% Metrics for QQ records use the queue resource as the table + %% key. The queue name and vhost will be rendered as tags. + [Row | Acc]; + ({ClusterName, _, _, _, _, _, _} = Row, Acc) when is_atom(ClusterName) -> + %% Other Ra clusters like Khepri and the stream coordinator use + %% the cluster name as the metrics key. Transform this into a + %% value that can be rendered as a "raft_cluster" tag. + Row1 = setelement(1, Row, #{<<"raft_cluster">> => atom_to_binary(ClusterName, utf8)}), + [Row1 | Acc] + end, [], Table); get_data(exchange_metrics = Table, true, VHostsFilter) when is_map(VHostsFilter)-> ets:foldl(fun ({#resource{kind = exchange, virtual_host = VHost}, _, _, _, _, _} = Row, Acc) when