From c46aa151af89c8e6a3e3fca9a36c984c93ca06f4 Mon Sep 17 00:00:00 2001 From: ttt161 Date: Mon, 24 Aug 2026 10:45:38 +0300 Subject: [PATCH] add metrics for woody wrappers --- apps/ff_server/src/ff_server.erl | 9 ++++++++- apps/ff_server/src/ff_woody_wrapper.erl | 19 ++++++++++++------ apps/hellgate/src/hellgate.erl | 9 ++++++++- .../hg_proto/src/hg_woody_service_wrapper.erl | 20 ++++++++++++------- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/apps/ff_server/src/ff_server.erl b/apps/ff_server/src/ff_server.erl index a92fe25d..32e4e09a 100644 --- a/apps/ff_server/src/ff_server.erl +++ b/apps/ff_server/src/ff_server.erl @@ -131,4 +131,11 @@ wrap_handler(Handler, WrapperOpts) -> setup_metrics() -> ok = woody_ranch_prometheus_collector:setup(), - ok = woody_hackney_prometheus_collector:setup(). + ok = woody_hackney_prometheus_collector:setup(), + _ = prometheus_histogram:declare([ + {name, woody_wrapper_processing_duration_ms}, + {help, "Duration of processing handle_function in millisecond"}, + {buckets, [50, 150, 300, 500, 750, 1000]}, + {labels, [handler, function]} + ]), + ok. diff --git a/apps/ff_server/src/ff_woody_wrapper.erl b/apps/ff_server/src/ff_woody_wrapper.erl index a6c47de0..3e77e6eb 100644 --- a/apps/ff_server/src/ff_woody_wrapper.erl +++ b/apps/ff_server/src/ff_woody_wrapper.erl @@ -37,12 +37,19 @@ handle_function(Func, Args, WoodyContext0, #{handler := Handler} = Opts) -> WoodyContext = ensure_woody_deadline_set(WoodyContext0, Opts), {HandlerMod, HandlerOptions} = get_handler_opts(Handler), ok = op_context:save(op_context:key(fistful), create_context(WoodyContext, Opts)), - try - HandlerMod:handle_function( - Func, - Args, - HandlerOptions - ) + F = fun() -> HandlerMod:handle_function(Func, Args, HandlerOptions) end, + try timer:tc(F) of + {DurationMicro, Result} -> + DurationMs = DurationMicro div 1000, + HandlerBin = erlang:atom_to_binary(HandlerMod), + FuncBin = erlang:atom_to_binary(Func), + Labels = [HandlerBin, FuncBin], + ok = prometheus_histogram:observe( + woody_wrapper_processing_duration_ms, + Labels, + DurationMs + ), + Result after op_context:cleanup(fistful) end. diff --git a/apps/hellgate/src/hellgate.erl b/apps/hellgate/src/hellgate.erl index 64d934da..19df3675 100644 --- a/apps/hellgate/src/hellgate.erl +++ b/apps/hellgate/src/hellgate.erl @@ -111,4 +111,11 @@ stop(_State) -> setup_metrics() -> ok = woody_ranch_prometheus_collector:setup(), - ok = woody_hackney_prometheus_collector:setup(). + ok = woody_hackney_prometheus_collector:setup(), + _ = prometheus_histogram:declare([ + {name, woody_wrapper_processing_duration_ms}, + {help, "Duration of processing handle_function in millisecond"}, + {buckets, [50, 150, 300, 500, 750, 1000]}, + {labels, [handler, function]} + ]), + ok. diff --git a/apps/hg_proto/src/hg_woody_service_wrapper.erl b/apps/hg_proto/src/hg_woody_service_wrapper.erl index 761bc1b8..613cb000 100644 --- a/apps/hg_proto/src/hg_woody_service_wrapper.erl +++ b/apps/hg_proto/src/hg_woody_service_wrapper.erl @@ -33,13 +33,19 @@ handle_function(Func, Args, WoodyContext0, #{handler := Handler} = Opts) -> WoodyContext = ensure_woody_deadline_set(WoodyContext0, Opts), ok = op_context:save(op_context:key(hellgate), create_context(WoodyContext, Opts)), - try - Result = Handler:handle_function( - Func, - Args, - Opts - ), - {ok, Result} + F = fun() -> Handler:handle_function(Func, Args, Opts) end, + try timer:tc(F) of + {DurationMicro, Result} -> + DurationMs = DurationMicro div 1000, + HandlerBin = erlang:atom_to_binary(Handler), + FuncBin = erlang:atom_to_binary(Func), + Labels = [HandlerBin, FuncBin], + ok = prometheus_histogram:observe( + woody_wrapper_processing_duration_ms, + Labels, + DurationMs + ), + {ok, Result} catch throw:Reason -> raise(Reason)