Jelajahi Sumber

feat(exhook): export basic usage info for telemetry

Thales Macedo Garitezi 3 tahun lalu
induk
melakukan
72b87a6a7e

+ 39 - 0
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.

+ 32 - 0
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
 %%--------------------------------------------------------------------