Просмотр исходного кода

fix(rule): update rules without reset the metrics

Shawn 3 лет назад
Родитель
Сommit
50ee6ad2e2

+ 8 - 0
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

+ 8 - 5
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.
 

+ 1 - 1
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,