From 18e2a2ce56308eaaab96466be239d5c394ad6835 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Wed, 6 Apr 2022 15:30:04 +0800 Subject: [PATCH] feat: impl reset_metrics --- .../src/emqx_plugin_libs_metrics.erl | 23 +++++++++++ .../test/emqx_plugin_libs_metrics_SUITE.erl | 38 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl index 241f8ff2a..98c4490ee 100644 --- a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl +++ b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl @@ -32,6 +32,7 @@ , create_metrics/3 , create_metrics/4 , clear_metrics/2 + , reset_metrics/2 , has_metrics/2 ]). @@ -116,6 +117,10 @@ create_metrics(Name, Id, Metrics, RateMetrics) -> clear_metrics(Name, Id) -> gen_server:call(Name, {delete_metrics, Id}). +-spec(reset_metrics(handler_name(), metric_id()) -> ok). +reset_metrics(Name, Id) -> + gen_server:call(Name, {reset_metrics, Id}). + -spec(has_metrics(handler_name(), metric_id()) -> boolean()). has_metrics(Name, Id) -> case get_ref(Name, Id) of @@ -143,6 +148,13 @@ get_counters(Name, Id) -> get(Name, Id, Index) end, get_indexes(Name, Id)). +-spec reset_counters(handler_name(), metric_id()) -> ok. +reset_counters(Name, Id) -> + Indexes = maps:values(get_indexes(Name, Id)), + Ref = get_ref(Name, Id), + [counters:put(Ref, Idx, 0) || Idx <- Indexes ], + ok. + -spec(get_metrics(handler_name(), metric_id()) -> metrics()). get_metrics(Name, Id) -> #{rate => get_rate(Name, Id), counters => get_counters(Name, Id)}. @@ -198,6 +210,17 @@ handle_call({delete_metrics, Id}, _From, _ -> maps:remove(Id, Rates) end}}; +handle_call({reset_metrics, Id}, _From, + State = #state{rates = Rates}) -> + {reply, reset_counters(get_self_name(), Id), + State#state{rates = case Rates of + undefined -> undefined; + _ -> ResetRate = + maps:map(fun(_Key, _Value) -> #rate{} end, + maps:get(Id, Rates, #{})), + maps:put(Id, ResetRate, Rates) + end}}; + handle_call(_Request, _From, State) -> {reply, ok, State}. diff --git a/apps/emqx_plugin_libs/test/emqx_plugin_libs_metrics_SUITE.erl b/apps/emqx_plugin_libs/test/emqx_plugin_libs_metrics_SUITE.erl index 25c253a9a..3ae480c22 100644 --- a/apps/emqx_plugin_libs/test/emqx_plugin_libs_metrics_SUITE.erl +++ b/apps/emqx_plugin_libs/test/emqx_plugin_libs_metrics_SUITE.erl @@ -85,6 +85,44 @@ t_get_metrics(_) -> ?assert(MaxA > 0), ?assert(MaxB > 0), ?assert(MaxC > 0)}), ok = emqx_plugin_libs_metrics:clear_metrics(?NAME, <<"testid">>). +t_reset_metrics(_) -> + Metrics = [a, b, c], + ok = emqx_plugin_libs_metrics:create_metrics(?NAME, <<"testid">>, Metrics), + %% all the metrics are set to zero at start + ?assertMatch(#{ + rate := #{ + a := #{current := 0.0, max := 0.0, last5m := 0.0}, + b := #{current := 0.0, max := 0.0, last5m := 0.0}, + c := #{current := 0.0, max := 0.0, last5m := 0.0} + }, + counters := #{ + a := 0, + b := 0, + c := 0 + } + }, emqx_plugin_libs_metrics:get_metrics(?NAME, <<"testid">>)), + ok = emqx_plugin_libs_metrics:inc(?NAME, <<"testid">>, a), + ok = emqx_plugin_libs_metrics:inc(?NAME, <<"testid">>, b), + ok = emqx_plugin_libs_metrics:inc(?NAME, <<"testid">>, c), + ok = emqx_plugin_libs_metrics:inc(?NAME, <<"testid">>, c), + ct:sleep(1500), + ok = emqx_plugin_libs_metrics:reset_metrics(?NAME, <<"testid">>), + ?LET(#{ + rate := #{ + a := #{current := CurrA, max := MaxA, last5m := _}, + b := #{current := CurrB, max := MaxB, last5m := _}, + c := #{current := CurrC, max := MaxC, last5m := _} + }, + counters := #{ + a := 0, + b := 0, + c := 0 + } + }, emqx_plugin_libs_metrics:get_metrics(?NAME, <<"testid">>), + {?assert(CurrA == 0), ?assert(CurrB == 0), ?assert(CurrC == 0), + ?assert(MaxA == 0), ?assert(MaxB == 0), ?assert(MaxC == 0)}), + ok = emqx_plugin_libs_metrics:clear_metrics(?NAME, <<"testid">>). + t_get_metrics_2(_) -> Metrics = [a, b, c], ok = emqx_plugin_libs_metrics:create_metrics(?NAME, <<"testid">>, Metrics,