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

feat(exhook): provide meta data in `RequestMeta`

JimMoen 3 лет назад
Родитель
Сommit
bbd843c68b

+ 1 - 1
apps/emqx_exhook/docs/design-cn.md

@@ -50,7 +50,7 @@
 ```protobuff
 syntax = "proto3";
 
-package emqx.exhook.v1;
+package emqx.exhook.v2;
 
 service HookProvider {
 

+ 76 - 9
apps/emqx_exhook/priv/protos/exhook.proto

@@ -16,13 +16,15 @@
 
 syntax = "proto3";
 
-option csharp_namespace = "Emqx.Exhook.V1";
+option csharp_namespace = "Emqx.Exhook.V2";
 option go_package = "emqx.io/grpc/exhook";
 option java_multiple_files = true;
 option java_package = "io.emqx.exhook";
 option java_outer_classname = "EmqxExHookProto";
 
-package emqx.exhook.v1;
+// The exhook proto version should be fixed as `v2` in EMQX v5.x
+// to make sure the exhook proto version is compatible
+package emqx.exhook.v2;
 
 service HookProvider {
 
@@ -70,21 +72,21 @@ service HookProvider {
 }
 
 //------------------------------------------------------------------------------
-// Request & Response
+// Request
 //------------------------------------------------------------------------------
 
 message ProviderLoadedRequest {
 
   BrokerInfo broker = 1;
+
+  RequestMeta meta = 2;
 }
 
-message LoadedResponse {
+message ProviderUnloadedRequest {
 
-  repeated HookSpec hooks = 1;
+  RequestMeta meta = 1;
 }
 
-message ProviderUnloadedRequest { }
-
 message ClientConnectRequest {
 
   ConnInfo conninfo = 1;
@@ -93,6 +95,8 @@ message ClientConnectRequest {
   //
   // It should be empty on MQTT v3.1.1/v3.1 or others protocol
   repeated Property props = 2;
+
+  RequestMeta meta = 3;
 }
 
 message ClientConnackRequest {
@@ -102,11 +106,15 @@ message ClientConnackRequest {
   string result_code = 2;
 
   repeated Property props = 3;
+
+  RequestMeta meta = 4;
 }
 
 message ClientConnectedRequest {
 
   ClientInfo clientinfo = 1;
+
+  RequestMeta meta = 2;
 }
 
 message ClientDisconnectedRequest {
@@ -114,6 +122,8 @@ message ClientDisconnectedRequest {
   ClientInfo clientinfo = 1;
 
   string reason = 2;
+
+  RequestMeta meta = 3;
 }
 
 message ClientAuthenticateRequest {
@@ -121,6 +131,8 @@ message ClientAuthenticateRequest {
   ClientInfo clientinfo = 1;
 
   bool result = 2;
+
+  RequestMeta meta = 3;
 }
 
 message ClientAuthorizeRequest {
@@ -139,6 +151,8 @@ message ClientAuthorizeRequest {
   string topic = 3;
 
   bool result = 4;
+
+  RequestMeta meta = 5;
 }
 
 message ClientSubscribeRequest {
@@ -148,6 +162,8 @@ message ClientSubscribeRequest {
   repeated Property props = 2;
 
   repeated TopicFilter topic_filters = 3;
+
+  RequestMeta meta = 4;
 }
 
 message ClientUnsubscribeRequest {
@@ -157,11 +173,15 @@ message ClientUnsubscribeRequest {
   repeated Property props = 2;
 
   repeated TopicFilter topic_filters = 3;
+
+  RequestMeta meta = 4;
 }
 
 message SessionCreatedRequest {
 
   ClientInfo clientinfo = 1;
+
+  RequestMeta meta = 2;
 }
 
 message SessionSubscribedRequest {
@@ -171,6 +191,8 @@ message SessionSubscribedRequest {
   string topic = 2;
 
   SubOpts subopts = 3;
+
+  RequestMeta meta = 4;
 }
 
 message SessionUnsubscribedRequest {
@@ -178,21 +200,29 @@ message SessionUnsubscribedRequest {
   ClientInfo clientinfo = 1;
 
   string topic = 2;
+
+  RequestMeta meta = 3;
 }
 
 message SessionResumedRequest {
 
   ClientInfo clientinfo = 1;
+
+  RequestMeta meta = 2;
 }
 
 message SessionDiscardedRequest {
 
   ClientInfo clientinfo = 1;
+
+  RequestMeta meta = 2;
 }
 
 message SessionTakenoverRequest {
 
   ClientInfo clientinfo = 1;
+
+  RequestMeta meta = 2;
 }
 
 message SessionTerminatedRequest {
@@ -200,11 +230,15 @@ message SessionTerminatedRequest {
   ClientInfo clientinfo = 1;
 
   string reason = 2;
+
+  RequestMeta meta = 3;
 }
 
 message MessagePublishRequest {
 
   Message message = 1;
+
+  RequestMeta meta = 2;
 }
 
 message MessageDeliveredRequest {
@@ -212,6 +246,8 @@ message MessageDeliveredRequest {
   ClientInfo clientinfo = 1;
 
   Message message = 2;
+
+  RequestMeta meta = 3;
 }
 
 message MessageDroppedRequest {
@@ -219,6 +255,8 @@ message MessageDroppedRequest {
   Message message = 1;
 
   string reason = 2;
+
+  RequestMeta meta = 3;
 }
 
 message MessageAckedRequest {
@@ -226,13 +264,22 @@ message MessageAckedRequest {
   ClientInfo clientinfo = 1;
 
   Message message = 2;
+
+  RequestMeta meta = 3;
 }
 
 //------------------------------------------------------------------------------
-// Basic data types
+// Response
 //------------------------------------------------------------------------------
 
-message EmptySuccess { }
+// Responsed by `ProviderLoadedRequest`
+
+message LoadedResponse {
+
+  repeated HookSpec hooks = 1;
+}
+
+// Responsed by `ClientAuthenticateRequest` `ClientAuthorizeRequest` `MessagePublishRequest`
 
 message ValuedResponse {
 
@@ -261,6 +308,14 @@ message ValuedResponse {
   }
 }
 
+// no Response by other Requests
+
+message EmptySuccess { }
+
+//------------------------------------------------------------------------------
+// Basic data types
+//------------------------------------------------------------------------------
+
 message BrokerInfo {
 
   string version = 1;
@@ -272,6 +327,7 @@ message BrokerInfo {
   string datetime = 4;
 }
 
+
 message HookSpec {
 
   // The registered hooks name
@@ -430,3 +486,14 @@ message SubOpts {
   // connection with a ClientID equal to the ClientID of the publishing
   uint32 nl = 5;
 }
+
+message RequestMeta {
+
+  string node = 1;
+
+  string version = 2;
+
+  string sysdescr = 3;
+
+  string cluster_name = 4;
+}

+ 10 - 1
apps/emqx_exhook/src/emqx_exhook_handler.erl

@@ -57,7 +57,8 @@
     merge_responsed_bool/2,
     merge_responsed_message/2,
     assign_to_message/2,
-    clientinfo/1
+    clientinfo/1,
+    request_meta/0
 ]).
 
 -import(
@@ -455,3 +456,11 @@ merge_responsed_message(_Req, Resp) ->
 
 ret('CONTINUE') -> ok;
 ret('STOP_AND_RETURN') -> stop.
+
+request_meta() ->
+    #{
+        node => stringfy(node()),
+        version => emqx_sys:version(),
+        sysdescr => emqx_sys:sysdescr(),
+        cluster_name => emqx_sys:cluster_name()
+    }.

+ 9 - 6
apps/emqx_exhook/src/emqx_exhook_server.erl

@@ -19,7 +19,9 @@
 -include("emqx_exhook.hrl").
 -include_lib("emqx/include/logger.hrl").
 
--define(PB_CLIENT_MOD, emqx_exhook_v_1_hook_provider_client).
+%% The exhook proto version should be fixed as `v2` in EMQX v5.x
+%% to make sure the exhook proto version is compatible
+-define(PB_CLIENT_MOD, emqx_exhook_v_2_hook_provider_client).
 
 %% Load/Unload
 -export([
@@ -362,14 +364,15 @@ match_topic_filter(TopicName, TopicFilter) ->
 -spec do_call(binary(), atom(), atom(), map(), map()) -> {ok, map()} | {error, term()}.
 do_call(ChannName, Hookpoint, Fun, Req, ReqOpts) ->
     Options = ReqOpts#{channel => ChannName},
+    NReq = Req#{meta => emqx_exhook_handler:request_meta()},
     ?SLOG(debug, #{
         msg => "do_call",
         module => ?PB_CLIENT_MOD,
         function => Fun,
-        req => Req,
+        req => NReq,
         options => Options
     }),
-    case catch ?CALL_PB_CLIENT(ChanneName, Fun, Req, Options) of
+    case catch ?CALL_PB_CLIENT(ChanneName, Fun, NReq, Options) of
         {ok, Resp, Metadata} ->
             ?SLOG(debug, #{msg => "do_call_ok", resp => Resp, metadata => Metadata}),
             update_metrics(Hookpoint, ChannName, fun emqx_exhook_metrics:succeed/2),
@@ -379,7 +382,7 @@ do_call(ChannName, Hookpoint, Fun, Req, ReqOpts) ->
                 msg => "exhook_call_error",
                 module => ?PB_CLIENT_MOD,
                 function => Fun,
-                req => Req,
+                req => NReq,
                 options => Options,
                 code => Code,
                 packet => Msg
@@ -391,7 +394,7 @@ do_call(ChannName, Hookpoint, Fun, Req, ReqOpts) ->
                 msg => "exhook_call_error",
                 module => ?PB_CLIENT_MOD,
                 function => Fun,
-                req => Req,
+                req => NReq,
                 options => Options,
                 reason => Reason
             }),
@@ -402,7 +405,7 @@ do_call(ChannName, Hookpoint, Fun, Req, ReqOpts) ->
                 msg => "exhook_call_exception",
                 module => ?PB_CLIENT_MOD,
                 function => Fun,
-                req => Req,
+                req => NReq,
                 options => Options,
                 stacktrace => Stk
             }),