feat(rules): export basic usage info for telemetry

This commit is contained in:
Thales Macedo Garitezi 2022-04-04 16:14:42 -03:00
parent ed7035ec41
commit 8354095e4b
No known key found for this signature in database
GPG Key ID: DD279F8152A9B6DD
2 changed files with 94 additions and 0 deletions

View File

@ -58,6 +58,9 @@
, clear_metrics_for_rule/1
]).
%% exported for `emqx_telemetry'
-export([get_basic_usage_info/0]).
%% gen_server Callbacks
-export([ init/1
, handle_call/3
@ -201,6 +204,56 @@ unload_hooks_for_rule(#{id := Id, from := Topics}) ->
end
end, Topics).
%%------------------------------------------------------------------------------
%% Telemetry helper functions
%%------------------------------------------------------------------------------
-spec get_basic_usage_info() -> #{ num_rules => non_neg_integer()
, referenced_bridges =>
#{ BridgeType => non_neg_integer()
}
}
when BridgeType :: atom().
get_basic_usage_info() ->
try
Rules = get_rules(),
EnabledRules =
lists:filter(
fun(#{enable := Enabled}) -> Enabled end,
Rules),
NumRules = length(EnabledRules),
ReferencedBridges =
lists:foldl(
fun(#{outputs := Outputs}, Acc) ->
BridgeIDs = lists:filter(fun is_binary/1, Outputs),
tally_referenced_bridges(BridgeIDs, Acc)
end,
#{},
EnabledRules),
#{ num_rules => NumRules
, referenced_bridges => ReferencedBridges
}
catch
_:_ ->
#{ num_rules => 0
, referenced_bridges => #{}
}
end.
tally_referenced_bridges(BridgeIDs, Acc0) ->
lists:foldl(
fun(BridgeID, Acc) ->
{BridgeType, _BridgeName} = emqx_bridge:parse_bridge_id(BridgeID),
maps:update_with(
BridgeType,
fun(X) -> X + 1 end,
1,
Acc)
end,
Acc0,
BridgeIDs).
%%------------------------------------------------------------------------------
%% gen_server callbacks
%%------------------------------------------------------------------------------

View File

@ -1356,6 +1356,47 @@ t_sqlparse_nested_get(_Config) ->
payload => <<"{\"a\": {\"b\": 0}}">>
}})).
%%------------------------------------------------------------------------------
%% Test cases for telemetry functions
%%------------------------------------------------------------------------------
t_get_basic_usage_info_0(_Config) ->
?assertEqual(
#{ num_rules => 0
, referenced_bridges => #{}
},
emqx_rule_engine:get_basic_usage_info()),
ok.
t_get_basic_usage_info_1(_Config) ->
{ok, _} =
emqx_rule_engine:create_rule(
#{id => <<"rule:t_get_basic_usage_info:1">>,
sql => <<"select 1 from topic">>,
outputs =>
[ #{function => <<"erlang:hibernate">>, args => #{}}
, #{function => console}
, <<"http:my_http_bridge">>
, <<"http:my_http_bridge">>
]}),
{ok, _} =
emqx_rule_engine:create_rule(
#{id => <<"rule:t_get_basic_usage_info:2">>,
sql => <<"select 1 from topic">>,
outputs =>
[ <<"mqtt:my_mqtt_bridge">>
, <<"http:my_http_bridge">>
]}),
?assertEqual(
#{ num_rules => 2
, referenced_bridges =>
#{ mqtt => 1
, http => 3
}
},
emqx_rule_engine:get_basic_usage_info()),
ok.
%%------------------------------------------------------------------------------
%% Internal helpers
%%------------------------------------------------------------------------------