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 e437961b8..241f8ff2a 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 + , has_metrics/2 ]). -export([ get_metrics/2 @@ -115,6 +116,13 @@ create_metrics(Name, Id, Metrics, RateMetrics) -> clear_metrics(Name, Id) -> gen_server:call(Name, {delete_metrics, Id}). +-spec(has_metrics(handler_name(), metric_id()) -> boolean()). +has_metrics(Name, Id) -> + case get_ref(Name, Id) of + not_found -> false; + _ -> true + end. + -spec(get(handler_name(), metric_id(), atom() | integer()) -> number()). get(Name, Id, Metric) -> case get_ref(Name, Id) of diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 66e7f4377..1bf0088fe 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -54,7 +54,7 @@ -export([ load_hooks_for_rule/1 , unload_hooks_for_rule/1 - , add_metrics_for_rule/1 + , maybe_add_metrics_for_rule/1 , clear_metrics_for_rule/1 ]). @@ -134,7 +134,6 @@ update_rule(Params = #{id := RuleId}) when is_binary(RuleId) -> not_found -> {error, not_found}; {ok, #{created_at := CreatedAt}} -> - ok = delete_rule(RuleId), parse_and_insert(Params, CreatedAt) end. @@ -183,8 +182,12 @@ get_rule(Id) -> load_hooks_for_rule(#{from := Topics}) -> lists:foreach(fun emqx_rule_events:load/1, Topics). -add_metrics_for_rule(Id) -> - ok = emqx_plugin_libs_metrics:create_metrics(rule_metrics, Id, ?METRICS, ?RATE_METRICS). +maybe_add_metrics_for_rule(Id) -> + case emqx_plugin_libs_metrics:has_metrics(rule_metrics, Id) of + true -> ok; + false -> + ok = emqx_plugin_libs_metrics:create_metrics(rule_metrics, Id, ?METRICS, ?RATE_METRICS) + end. clear_metrics_for_rule(Id) -> ok = emqx_plugin_libs_metrics:clear_metrics(rule_metrics, Id). @@ -265,7 +268,7 @@ parse_and_insert(Params = #{id := RuleId, sql := Sql, outputs := Outputs}, Creat do_insert_rule(#{id := Id} = Rule) -> ok = load_hooks_for_rule(Rule), - ok = add_metrics_for_rule(Id), + ok = maybe_add_metrics_for_rule(Id), true = ets:insert(?RULE_TAB, {Id, maps:remove(id, Rule)}), ok. diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl index abd6a54c3..fc6c1a5ad 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl @@ -45,7 +45,7 @@ test(#{sql := Sql, context := Context}) -> test_rule(Sql, Select, Context, EventTopics) -> RuleId = iolist_to_binary(["sql_tester:", emqx_misc:gen_id(16)]), - ok = emqx_rule_engine:add_metrics_for_rule(RuleId), + ok = emqx_rule_engine:maybe_add_metrics_for_rule(RuleId), Rule = #{ id => RuleId, sql => Sql,