diff --git a/deps/rabbit/src/rabbit_khepri.erl b/deps/rabbit/src/rabbit_khepri.erl index 537021efa341..960aeeaf03fc 100644 --- a/deps/rabbit/src/rabbit_khepri.erl +++ b/deps/rabbit/src/rabbit_khepri.erl @@ -110,6 +110,7 @@ nodes/0, locally_known_nodes/0, get_ra_cluster_name/0, + get_server_id/1, get_store_id/0, transfer_leadership/1, @@ -677,6 +678,14 @@ locally_known_nodes() -> get_ra_cluster_name() -> ?RA_CLUSTER_NAME. +-spec get_server_id(Node) -> RaServerId when + Node :: node(), + RaServerId :: ra:server_id(). +%% @doc Returns the Ra server id of the Khepri member on the given node. + +get_server_id(Node) -> + {?RA_CLUSTER_NAME, Node}. + -spec get_store_id() -> StoreId when StoreId :: khepri:store_id(). %% @doc Returns the Khepri store identifier. 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 1f4534495e85..619644363f8f 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 @@ -18,6 +18,8 @@ -import(prometheus_text_format, [escape_label_value/1]). +-include_lib("stdlib/include/assert.hrl"). +-include_lib("kernel/include/logger.hrl"). -include_lib("rabbit_common/include/rabbit.hrl"). -behaviour(prometheus_collector). @@ -303,6 +305,12 @@ deregister_cleanup(_) -> ok. collect_mf('detailed', Callback) -> collect(true, ?DETAILED_METRIC_NAME_PREFIX, vhosts_filter_from_pdict(), enabled_mfs_from_pdict(?METRICS_RAW), Callback), collect(true, ?CLUSTER_METRIC_NAME_PREFIX, vhosts_filter_from_pdict(), enabled_mfs_from_pdict(?METRICS_CLUSTER), Callback), + case is_mf_enabled(khepri) of + true -> + collect_khepri_info(Callback); + false -> + ok + end, %% identity is here to enable filtering on a cluster name (as already happens in existing dashboards) emit_identity_info(<<"detailed">>, Callback), ok; @@ -339,6 +347,20 @@ totals(Callback) -> end || {Table, Name, Type, Help} <- ?TOTALS], ok. +collect_khepri_info(Callback) -> + ServerId = rabbit_khepri:get_server_id(node()), + maps:foreach( + fun (Name, #{type := Type, help := Help, values := #{ServerId := Value}}) -> + Callback( + create_mf( + <>, + Help, Type, [Value])); + (_Name, _Format) -> + ok + end, seshat:format(ra)). + emit_identity_info(Endpoint, Callback) -> add_metric_family(build_info(), Callback), add_metric_family(identity_info(Endpoint), Callback), @@ -871,12 +893,19 @@ sum('', B) -> sum(A, B) -> A + B. +is_mf_enabled(MF) -> + case get(prometheus_mf_filter) of + undefined -> + false; + MFNameSet -> + sets:is_element(MF, MFNameSet) + end. + enabled_mfs_from_pdict(AllMFs) -> case get(prometheus_mf_filter) of undefined -> []; - MFNames -> - MFNameSet = sets:from_list(MFNames), + MFNameSet -> [ MF || MF = {Table, _} <- AllMFs, sets:is_element(Table, MFNameSet) ] end. @@ -890,4 +919,3 @@ vhosts_filter_from_pdict() -> Enabled = maps:from_list([ {VHost, true} || VHost <- L ]), maps:merge(All, Enabled) end. - diff --git a/deps/rabbitmq_prometheus/src/rabbit_prometheus_handler.erl b/deps/rabbitmq_prometheus/src/rabbit_prometheus_handler.erl index 5f1c253cdffb..f7235b562ec1 100644 --- a/deps/rabbitmq_prometheus/src/rabbit_prometheus_handler.erl +++ b/deps/rabbitmq_prometheus/src/rabbit_prometheus_handler.erl @@ -170,7 +170,7 @@ put_filtering_options_into_process_dictionary(Request) -> end, case parse_metric_families(Families) of Fs when is_list(Fs) -> - put(prometheus_mf_filter, Fs); + put(prometheus_mf_filter, sets:from_list(Fs, [{version, 2}])); _ -> ok end, ok.