From 8598c5157917a7763082fb6341421deac37ece7c Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Mon, 18 Oct 2021 16:52:37 +0200 Subject: Pre-render prometheus labels This makes per-object metrics twice as fast. Depends on https://github.com/deadtrickster/prometheus.erl/pull/137 --- .../prometheus_rabbitmq_core_metrics_collector.erl | 37 ++++++++++++++-------- rabbitmq-components.mk | 2 +- workspace_helpers.bzl | 8 +++-- 3 files changed, 29 insertions(+), 18 deletions(-) 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 e663d1a374..8b46770ef8 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 @@ -25,10 +25,10 @@ %% as observed by RabbitMQ. %% Used by `/metrics` and `/metrics/per-object`. --define(METRIC_NAME_PREFIX, "rabbitmq_"). +-define(METRIC_NAME_PREFIX, <<"rabbitmq_">>). %% Used by `/metrics/detailed` endpoint --define(DETAILED_METRIC_NAME_PREFIX, "rabbitmq_detailed_"). +-define(DETAILED_METRIC_NAME_PREFIX, <<"rabbitmq_detailed_">>). %% ==The source of these metrics can be found in the rabbit_core_metrics module== %% The relevant files are: @@ -328,7 +328,8 @@ identity_info() -> }. add_metric_family({Name, Type, Help, Metrics}, Callback) -> - Callback(create_mf(?METRIC_NAME(Name), Help, Type, Metrics)). + MN = <>, + Callback(create_mf(MN, Help, Type, Metrics)). mf(Callback, Prefix, Contents, Data) -> [begin @@ -340,7 +341,7 @@ mf(Callback, Prefix, Contents, Data) -> end, Callback( create_mf( - [Prefix, prometheus_model_helpers:metric_name(Name)], + <>, Help, catch_boolean(Type), ?MODULE, @@ -357,7 +358,7 @@ mf(Callback, Prefix, Contents, Data) -> end, Callback( create_mf( - [Prefix, prometheus_model_helpers:metric_name(Name)], + <>, Help, catch_boolean(Type), ?MODULE, @@ -369,7 +370,7 @@ mf(Callback, Prefix, Contents, Data) -> mf_totals(Callback, Name, Type, Help, Size) -> Callback( create_mf( - ?METRIC_NAME(Name), + <>, Help, catch_boolean(Type), Size @@ -383,14 +384,18 @@ labels(Item) -> label(element(1, Item)). label(#resource{virtual_host = VHost, kind = exchange, name = Name}) -> - [{vhost, VHost}, {exchange, Name}]; + <<"vhost=\"", VHost/binary, "\",exchange=\"", Name/binary, "\"">>; label(#resource{virtual_host = VHost, kind = queue, name = Name}) -> - [{vhost, VHost}, {queue, Name}]; + <<"vhost=\"", VHost/binary, "\",queue=\"", Name/binary, "\"">>; label({P, {#resource{virtual_host = QVHost, kind = queue, name = QName}, #resource{virtual_host = EVHost, kind = exchange, name = EName}}}) when is_pid(P) -> %% channel_queue_exchange_metrics {channel_id, {queue_id, exchange_id}} - [{channel, P}, {queue_vhost, QVHost}, {queue, QName}, - {exchange_vhost, EVHost}, {exchange, EName}]; + <<"channel=\"", (iolist_to_binary(pid_to_list(P)))/binary, "\",", + "queue_vhost=\"", QVHost/binary, "\",", + "queue=\"", QName/binary, "\",", + "exchange_vhost=\"", EVHost/binary, "\",", + "exchange=\"", EName/binary, "\"" + >>; label({RemoteAddress, Username, Protocol}) when is_binary(RemoteAddress), is_binary(Username), is_atom(Protocol) -> lists:filter(fun({_, V}) -> @@ -398,13 +403,17 @@ label({RemoteAddress, Username, Protocol}) when is_binary(RemoteAddress), is_bin end, [{remote_address, RemoteAddress}, {username, Username}, {protocol, atom_to_binary(Protocol, utf8)}]); label({I1, I2}) -> - label(I1) ++ label(I2); + case {label(I1), label(I2)} of + {<<>>, L} -> L; + {L, <<>>} -> L; + {L1, L2} -> <> + end; label(P) when is_pid(P) -> - [{channel, P}]; + <<"channel=\"", (iolist_to_binary(pid_to_list(P)))/binary, "\"">>; label(A) when is_atom(A) -> case is_protocol(A) of - true -> [{protocol, atom_to_binary(A, utf8)}]; - false -> [] + true -> <<"protocol=\"", (atom_to_binary(A, utf8))/binary, "\"">>; + false -> <<>> end. is_protocol(P) -> diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk index 66afd1871f..7488f22f01 100644 --- a/rabbitmq-components.mk +++ b/rabbitmq-components.mk @@ -115,7 +115,7 @@ dep_cowboy = hex 2.8.0 dep_cowlib = hex 2.9.1 dep_jsx = hex 3.1.0 dep_looking_glass = git https://github.com/rabbitmq/looking_glass master -dep_prometheus = hex 4.8.1 +dep_prometheus = git https://github.com/deadtrickster/prometheus.erl 06425c21a39c1564164f1cc3fe5bdfa8b23b1f78 dep_ra = git https://github.com/rabbitmq/ra.git main dep_ranch = hex 2.1.0 dep_recon = hex 2.5.1 diff --git a/workspace_helpers.bzl b/workspace_helpers.bzl index fb08ceb90e..8e6516f360 100644 --- a/workspace_helpers.bzl +++ b/workspace_helpers.bzl @@ -174,9 +174,12 @@ erlang_lib( remote = "https://github.com/rabbitmq/osiris.git", ) - hex_pm_bazel_erlang_lib( + github_bazel_erlang_lib( name = "prometheus", - version = "4.8.1", + repo = "prometheus.erl", + org = "deadtrickster", + ref = "06425c21a39c1564164f1cc3fe5bdfa8b23b1f78", + version = "06425c21a39c1564164f1cc3fe5bdfa8b23b1f78", first_srcs = [ "src/prometheus_collector.erl", "src/prometheus_format.erl", @@ -186,7 +189,6 @@ erlang_lib( deps = [ "@quantile_estimator//:bazel_erlang_lib", ], - sha256 = "6edfbe928d271c7f657a6f2c46258738086584bd6cae4a000b8b9a6009ba23a5", ) github_bazel_erlang_lib( -- cgit v1.2.1