From e7f5372fae6d6394a49528244274cc0526ec2d23 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Fri, 1 Apr 2022 14:32:59 +0800 Subject: [PATCH] feat(exhook): add field `meta` for grpc proto --- apps/emqx_exhook/.gitignore | 4 +- apps/emqx_exhook/priv/protos/exhook.proto | 58 +++++++++++++++++++- apps/emqx_exhook/src/emqx_exhook.erl | 12 ++++ apps/emqx_exhook/src/emqx_exhook_handler.erl | 2 + apps/emqx_exhook/src/emqx_exhook_server.erl | 11 ++-- 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/apps/emqx_exhook/.gitignore b/apps/emqx_exhook/.gitignore index da1f0db23..b01539214 100644 --- a/apps/emqx_exhook/.gitignore +++ b/apps/emqx_exhook/.gitignore @@ -25,5 +25,5 @@ data/ *.class Mnesia.nonode@nohost/ src/emqx_exhook_pb.erl -src/emqx_exhook_v_1_hook_provider_client.erl -src/emqx_exhook_v_1_hook_provider_bhvr.erl +src/emqx_exhook_v_*_hook_provider_client.erl +src/emqx_exhook_v_*_hook_provider_bhvr.erl diff --git a/apps/emqx_exhook/priv/protos/exhook.proto b/apps/emqx_exhook/priv/protos/exhook.proto index 72ba26581..43666a6ad 100644 --- a/apps/emqx_exhook/priv/protos/exhook.proto +++ b/apps/emqx_exhook/priv/protos/exhook.proto @@ -22,6 +22,7 @@ option java_multiple_files = true; option java_package = "io.emqx.exhook"; option java_outer_classname = "EmqxExHookProto"; +// Proto package compatible, Don't need an updated version.. package emqx.exhook.v1; service HookProvider { @@ -76,6 +77,8 @@ service HookProvider { message ProviderLoadedRequest { BrokerInfo broker = 1; + + RequestMeta meta = 2; } message LoadedResponse { @@ -83,7 +86,11 @@ message LoadedResponse { repeated HookSpec hooks = 1; } -message ProviderUnloadedRequest { } +message ProviderUnloadedRequest { + + RequestMeta meta = 1; +} + message ClientConnectRequest { @@ -93,6 +100,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 +111,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 +127,8 @@ message ClientDisconnectedRequest { ClientInfo clientinfo = 1; string reason = 2; + + RequestMeta meta = 3; } message ClientAuthenticateRequest { @@ -121,6 +136,8 @@ message ClientAuthenticateRequest { ClientInfo clientinfo = 1; bool result = 2; + + RequestMeta meta = 3; } message ClientCheckAclRequest { @@ -139,6 +156,8 @@ message ClientCheckAclRequest { string topic = 3; bool result = 4; + + RequestMeta meta = 5; } message ClientSubscribeRequest { @@ -148,6 +167,8 @@ message ClientSubscribeRequest { repeated Property props = 2; repeated TopicFilter topic_filters = 3; + + RequestMeta meta = 4; } message ClientUnsubscribeRequest { @@ -157,11 +178,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 +196,8 @@ message SessionSubscribedRequest { string topic = 2; SubOpts subopts = 3; + + RequestMeta meta = 4; } message SessionUnsubscribedRequest { @@ -178,21 +205,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 SessionTakeoveredRequest { ClientInfo clientinfo = 1; + + RequestMeta meta = 2; } message SessionTerminatedRequest { @@ -200,11 +235,15 @@ message SessionTerminatedRequest { ClientInfo clientinfo = 1; string reason = 2; + + RequestMeta meta = 3; } message MessagePublishRequest { Message message = 1; + + RequestMeta meta = 2; } message MessageDeliveredRequest { @@ -212,6 +251,8 @@ message MessageDeliveredRequest { ClientInfo clientinfo = 1; Message message = 2; + + RequestMeta meta = 3; } message MessageDroppedRequest { @@ -219,6 +260,8 @@ message MessageDroppedRequest { Message message = 1; string reason = 2; + + RequestMeta meta = 3; } message MessageAckedRequest { @@ -226,6 +269,8 @@ message MessageAckedRequest { ClientInfo clientinfo = 1; Message message = 2; + + RequestMeta meta = 3; } //------------------------------------------------------------------------------ @@ -405,3 +450,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; +} diff --git a/apps/emqx_exhook/src/emqx_exhook.erl b/apps/emqx_exhook/src/emqx_exhook.erl index b27710e4a..777cfe27d 100644 --- a/apps/emqx_exhook/src/emqx_exhook.erl +++ b/apps/emqx_exhook/src/emqx_exhook.erl @@ -30,6 +30,11 @@ , call_fold/3 ]). +-export([request_meta/0]). + +-import(emqx_exhook_handler, [stringfy/1]). +%% TODO: move util functions to an independent module + %%-------------------------------------------------------------------- %% Mgmt APIs %%-------------------------------------------------------------------- @@ -116,3 +121,10 @@ deny_action_result('message.publish', Msg) -> %% TODO: Not support to deny a message %% maybe we can put the 'allow_publish' into message header Msg. + +request_meta() -> + #{ node => stringfy(node()) + , version => emqx_sys:version() + , sysdescr => emqx_sys:sysdescr() + , cluster_name => emqx_sys:cluster_name() + }. diff --git a/apps/emqx_exhook/src/emqx_exhook_handler.erl b/apps/emqx_exhook/src/emqx_exhook_handler.erl index f3964dc42..ec52d5aa9 100644 --- a/apps/emqx_exhook/src/emqx_exhook_handler.erl +++ b/apps/emqx_exhook/src/emqx_exhook_handler.erl @@ -288,6 +288,8 @@ stringfy(Term) when is_integer(Term) -> integer_to_binary(Term); stringfy(Term) when is_atom(Term) -> atom_to_binary(Term, utf8); +stringfy(Term) when is_list(Term) -> + list_to_binary(Term); stringfy(Term) -> unicode:characters_to_binary((io_lib:format("~0p", [Term]))). diff --git a/apps/emqx_exhook/src/emqx_exhook_server.erl b/apps/emqx_exhook/src/emqx_exhook_server.erl index d3953ade7..7a6fa9862 100644 --- a/apps/emqx_exhook/src/emqx_exhook_server.erl +++ b/apps/emqx_exhook/src/emqx_exhook_server.erl @@ -269,23 +269,24 @@ match_topic_filter(TopicName, TopicFilter) -> -spec do_call(string(), atom(), map(), map()) -> {ok, map()} | {error, term()}. do_call(ChannName, Fun, Req, ReqOpts) -> + NReq = Req#{meta => emqx_exhook:request_meta()}, Options = ReqOpts#{channel => ChannName}, - ?LOG(debug, "Call ~0p:~0p(~0p, ~0p)", [?PB_CLIENT_MOD, Fun, Req, Options]), - case catch apply(?PB_CLIENT_MOD, Fun, [Req, Options]) of + ?LOG(debug, "Call ~0p:~0p(~0p, ~0p)", [?PB_CLIENT_MOD, Fun, NReq, Options]), + case catch apply(?PB_CLIENT_MOD, Fun, [NReq, Options]) of {ok, Resp, _Metadata} -> ?LOG(debug, "Response {ok, ~0p, ~0p}", [Resp, _Metadata]), {ok, Resp}; {error, {Code, Msg}, _Metadata} -> ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) response errcode: ~0p, errmsg: ~0p", - [?PB_CLIENT_MOD, Fun, Req, Options, Code, Msg]), + [?PB_CLIENT_MOD, Fun, NReq, Options, Code, Msg]), {error, {Code, Msg}}; {error, Reason} -> ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) error: ~0p", - [?PB_CLIENT_MOD, Fun, Req, Options, Reason]), + [?PB_CLIENT_MOD, Fun, NReq, Options, Reason]), {error, Reason}; {'EXIT', {Reason, Stk}} -> ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) throw an exception: ~0p, stacktrace: ~0p", - [?PB_CLIENT_MOD, Fun, Req, Options, Reason, Stk]), + [?PB_CLIENT_MOD, Fun, NReq, Options, Reason, Stk]), {error, Reason} end.