feat: impl api PUT /rules/{id}/reset_metrics

This commit is contained in:
EMQ-YangM 2022-03-31 16:50:26 +08:00
parent e801f5b3a2
commit 326634c287
4 changed files with 98 additions and 5 deletions

View File

@ -2,13 +2,15 @@
%% Unless you know what you are doing, DO NOT edit manually!!
{VSN,
[{"4.3.8",
[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
{"4.3.7",
[{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
@ -85,13 +87,15 @@
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
{<<".*">>,[]}],
[{"4.3.8",
[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
{"4.3.7",
[{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},

View File

@ -58,6 +58,13 @@
descr => "Delete a rule"
}).
-rest_api(#{name => reset_metrics,
method => 'PUT',
path => "/rules/:bin:id/reset_metrics",
func => reset_metrics,
descr => "reset a rule metrics"
}).
-rest_api(#{name => list_actions,
method => 'GET',
path => "/actions/",
@ -154,6 +161,7 @@
, list_rules/2
, show_rule/2
, delete_rule/2
, reset_metrics/2
]).
-export([ list_actions/2
@ -252,6 +260,10 @@ delete_rule(#{id := Id}, _Params) ->
ok = emqx_rule_engine:delete_rule(Id),
return(ok).
reset_metrics(#{id := Id}, _Params) ->
ok = emqx_rule_metrics:reset_metrics(Id),
return(ok).
%%------------------------------------------------------------------------------
%% Actions API
%%------------------------------------------------------------------------------

View File

@ -63,6 +63,7 @@
, create_metrics/1
, clear_rule_metrics/1
, clear_metrics/1
, reset_metrics/1
]).
-export([ get_rule_metrics/1
@ -127,6 +128,45 @@ clear_rule_metrics(Id) ->
clear_metrics(Id) ->
gen_server:call(?MODULE, {delete_metrics, Id}).
-spec(reset_metrics(rule_id()) -> ok).
reset_metrics(Id) ->
reset_speeds(Id),
reset_metrics(Id, rule_metrics()),
case emqx_rule_registry:get_rule(Id) of
not_found -> ok;
{ok, #rule{actions = Actions}} ->
[ reset_metrics(ActionId, action_metrics())
|| #action_instance{ id = ActionId} <- Actions],
ok
end.
reset_metrics(Id, Metrics) ->
case couters_ref(Id) of
not_found -> ok;
Ref -> [counters:put(Ref, metrics_idx(Idx), 0)
|| Idx <- Metrics],
ok
end.
reset_speeds(Id) ->
gen_server:call(?MODULE, {reset_speeds, Id}).
rule_metrics() ->
[ 'rules.matched'
, 'rules.failed'
, 'rules.passed'
, 'rules.exception'
, 'rules.no_result'
].
action_metrics() ->
[ 'actions.success'
, 'actions.error'
, 'actions.taken'
, 'actions.exception'
, 'actions.retry'
].
-spec(get(rule_id(), atom()) -> number()).
get(Id, Metric) ->
case couters_ref(Id) of
@ -288,6 +328,9 @@ handle_call({create_rule_metrics, Id}, _From,
_ -> RuleSpeeds#{Id => #rule_speed{}}
end}};
handle_call({reset_speeds, Id}, _From, State = #state{rule_speeds = RuleSpeedMap}) ->
{reply, ok, State#state{rule_speeds = maps:put(Id, #rule_speed{}, RuleSpeedMap)}};
handle_call({delete_metrics, Id}, _From,
State = #state{metric_ids = MIDs, rule_speeds = undefined}) ->
{reply, delete_counters(Id), State#state{metric_ids = sets:del_element(Id, MIDs)}};

View File

@ -49,6 +49,7 @@ groups() ->
[t_register_provider,
t_unregister_provider,
t_create_rule,
t_reset_metrics,
t_create_resource
]},
{actions, [],
@ -351,6 +352,39 @@ t_inspect_action(_Config) ->
emqx_rule_registry:remove_resource(ResId),
ok.
t_reset_metrics(_Config) ->
ok = emqx_rule_engine:load_providers(),
{ok, #resource{id = ResId}} = emqx_rule_engine:create_resource(
#{type => built_in,
config => #{},
description => <<"debug resource">>}),
{ok, #rule{id = Id}} = emqx_rule_engine:create_rule(
#{rawsql => "select clientid as c, username as u "
"from \"t1\" ",
actions => [#{name => 'inspect',
args => #{'$resource' => ResId, a=>1, b=>2}}],
type => built_in,
description => <<"Inspect rule">>
}),
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
{ok, _} = emqtt:connect(Client),
[ begin
emqtt:publish(Client, <<"t1">>, <<"{\"id\": 1, \"name\": \"ha\"}">>, 0),
timer:sleep(100)
end
|| _ <- lists:seq(1,10)],
emqx_rule_metrics:reset_metrics(Id),
?assertEqual(#{exception => 0,failed => 0,
matched => 0,no_result => 0,passed => 0,
speed => 0.0,speed_last5m => 0.0,speed_max => 0},
emqx_rule_metrics:get_rule_metrics(Id)),
?assertEqual(#{failed => 0,success => 0,taken => 0},
emqx_rule_metrics:get_action_metrics(ResId)),
emqtt:stop(Client),
emqx_rule_registry:remove_rule(Id),
emqx_rule_registry:remove_resource(ResId),
ok.
t_republish_action(_Config) ->
Qos0Received = emqx_metrics:val('messages.qos0.received'),
Received = emqx_metrics:val('messages.received'),