diff --git a/apps/emqx_exhook/src/emqx_exhook.erl b/apps/emqx_exhook/src/emqx_exhook.erl index 1539dfdf1..288bad9f2 100644 --- a/apps/emqx_exhook/src/emqx_exhook.erl +++ b/apps/emqx_exhook/src/emqx_exhook.erl @@ -23,6 +23,9 @@ , call_fold/3 ]). +%% exported for `emqx_telemetry' +-export([get_basic_usage_info/0]). + %%-------------------------------------------------------------------- %% Dispatch APIs %%-------------------------------------------------------------------- @@ -81,3 +84,39 @@ deny_action_result('message.publish', Msg) -> %% TODO: Not support to deny a message %% maybe we can put the 'allow_publish' into message header Msg. + +%%-------------------------------------------------------------------- +%% APIs for `emqx_telemetry' +%%-------------------------------------------------------------------- + +-spec get_basic_usage_info() -> + #{ num_servers => non_neg_integer() + , servers => + [#{ driver => Driver + , hooks => [emqx_exhook_server:hookpoint()] + }] + } when Driver :: grpc. +get_basic_usage_info() -> + try + Servers = emqx_exhook_mgr:running(), + NumServers = length(Servers), + ServerInfo = + lists:map( + fun(ServerName) -> + Hooks = emqx_exhook_mgr:hooks(ServerName), + HookNames = lists:map(fun(#{name := Name}) -> Name end, Hooks), + #{ hooks => HookNames + , %% currently, only grpc driver exists. + driver => grpc + } + end, + Servers), + #{ num_servers => NumServers + , servers => ServerInfo + } + catch + _:_ -> + #{ num_servers => 0 + , servers => [] + } + end. diff --git a/apps/emqx_exhook/test/emqx_exhook_SUITE.erl b/apps/emqx_exhook/test/emqx_exhook_SUITE.erl index 543f0b9fc..5af8606a7 100644 --- a/apps/emqx_exhook/test/emqx_exhook_SUITE.erl +++ b/apps/emqx_exhook/test/emqx_exhook_SUITE.erl @@ -231,6 +231,38 @@ t_misc_test(_) -> _ = emqx_exhook_server:format(#{name => <<"test">>, hookspec => #{}}), ok. +t_get_basic_usage_info(_Config) -> + #{ num_servers := NumServers + , servers := Servers + } = emqx_exhook:get_basic_usage_info(), + ?assertEqual(1, NumServers), + ?assertMatch([_], Servers), + [#{driver := Driver, hooks := Hooks}] = Servers, + ?assertEqual(grpc, Driver), + ?assertEqual( + [ + 'client.authenticate', + 'client.authorize', + 'client.connack', + 'client.connect', + 'client.connected', + 'client.disconnected', + 'client.subscribe', + 'client.unsubscribe', + 'message.acked', + 'message.delivered', + 'message.dropped', + 'message.publish', + 'session.created', + 'session.discarded', + 'session.resumed', + 'session.subscribed', + 'session.takenover', + 'session.terminated', + 'session.unsubscribed' + ], + lists:sort(Hooks)). + %%-------------------------------------------------------------------- %% Utils %%--------------------------------------------------------------------