From 86d20b060c66aa86d090f0559827941aea8553d8 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Fri, 18 Dec 2020 16:22:50 +0800 Subject: [PATCH] fix(metrics): counters not created before incr 'rule.matched' --- apps/emqx_rule_engine/src/emqx_rule_metrics.erl | 13 ++++++++++++- .../test/emqx_rule_metrics_SUITE.erl | 10 +++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl index 4a1ef7da7..90554d982 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl @@ -163,7 +163,18 @@ inc(Id, Metric) -> -spec inc(rule_id(), atom(), pos_integer()) -> ok. inc(Id, Metric, Val) -> - counters:add(couters_ref(Id), metrics_idx(Metric), Val), + case couters_ref(Id) of + not_found -> + %% this may occur when increasing a counter for + %% a rule that was created from a remove node. + case atom_to_list(Metric) of + "rules." ++ _ -> create_rule_metrics(Id); + _ -> create_metrics(Id) + end, + counters:add(couters_ref(Id), metrics_idx(Metric), Val); + Ref -> + counters:add(Ref, metrics_idx(Metric), Val) + end, inc_overall(Metric, Val). -spec(inc_overall(atom(), pos_integer()) -> ok). diff --git a/apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl index c006f704c..0fa8b6625 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl @@ -34,7 +34,8 @@ groups() -> [ t_action , t_rule , t_clear - , t_no_creation + , t_no_creation_1 + , t_no_creation_2 ]}, {speed, [sequence], [ rule_speed @@ -60,8 +61,11 @@ init_per_testcase(_, Config) -> end_per_testcase(_, _Config) -> ok. -t_no_creation(_) -> - ?assertError(_, emqx_rule_metrics:inc_actions_taken(<<"action:0">>)). +t_no_creation_1(_) -> + ?assertEqual(ok, emqx_rule_metrics:inc_rules_matched(<<"rule1">>)). + +t_no_creation_2(_) -> + ?assertEqual(ok, emqx_rule_metrics:inc_actions_taken(<<"action:0">>)). t_action(_) -> ?assertEqual(0, emqx_rule_metrics:get_actions_taken(<<"action:1">>)),