refactor(mgmt_trace): Decorate RPCs
This commit is contained in:
parent
6e3b05d665
commit
4e9fb00a0e
|
@ -30,6 +30,7 @@
|
|||
-export_type([ badrpc/0
|
||||
, call_result/0
|
||||
, cast_result/0
|
||||
, multicall_result/1
|
||||
, multicall_result/0
|
||||
, erpc/1
|
||||
, erpc_multicall/1
|
||||
|
@ -48,7 +49,9 @@
|
|||
|
||||
-type cast_result() :: true.
|
||||
|
||||
-type multicall_result() :: {_Results :: [term()], _BadNodes :: [node()]}.
|
||||
-type multicall_result(Result) :: {[Result], _BadNodes :: [node()]}.
|
||||
|
||||
-type multicall_result() :: multicall_result(term()).
|
||||
|
||||
-type erpc(Ret) :: {ok, Ret}
|
||||
| {throw, _Err}
|
||||
|
|
|
@ -204,7 +204,7 @@ get_trace_filename(Name) ->
|
|||
end end,
|
||||
transaction(Tran).
|
||||
|
||||
-spec trace_file(File :: list()) ->
|
||||
-spec trace_file(File :: file:filename_all()) ->
|
||||
{ok, Node :: list(), Binary :: binary()} |
|
||||
{error, Node :: list(), Reason :: term()}.
|
||||
trace_file(File) ->
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
-export([validate_name/1]).
|
||||
|
||||
%% for rpc
|
||||
-export([read_trace_file/3
|
||||
-export([ read_trace_file/3
|
||||
, get_trace_size/0
|
||||
]).
|
||||
|
||||
|
@ -241,7 +241,7 @@ trace(get, _Params) ->
|
|||
List = lists:sort(fun(#{start_at := A}, #{start_at := B}) -> A > B end,
|
||||
emqx_trace:format(List0)),
|
||||
Nodes = mria_mnesia:running_nodes(),
|
||||
TraceSize = cluster_call(?MODULE, get_trace_size, [], 30000),
|
||||
TraceSize = wrap_rpc(emqx_mgmt_trace_proto_v1:get_trace_size(Nodes)),
|
||||
AllFileSize = lists:foldl(fun(F, Acc) -> maps:merge(Acc, F) end, #{}, TraceSize),
|
||||
Now = erlang:system_time(second),
|
||||
Traces =
|
||||
|
@ -333,13 +333,12 @@ group_trace_file(ZipDir, TraceLog, TraceFiles) ->
|
|||
end, [], TraceFiles).
|
||||
|
||||
collect_trace_file(TraceLog) ->
|
||||
cluster_call(emqx_trace, trace_file, [TraceLog], 60000).
|
||||
|
||||
cluster_call(Mod, Fun, Args, Timeout) ->
|
||||
Nodes = mria_mnesia:running_nodes(),
|
||||
{GoodRes, BadNodes} = rpc:multicall(Nodes, Mod, Fun, Args, Timeout),
|
||||
wrap_rpc(emqx_mgmt_trace_proto_v1:trace_file(Nodes, TraceLog)).
|
||||
|
||||
wrap_rpc({GoodRes, BadNodes}) ->
|
||||
BadNodes =/= [] andalso
|
||||
?SLOG(error, #{msg => "rpc_call_failed", bad_nodes => BadNodes, mfa => {Mod, Fun, Args}}),
|
||||
?SLOG(error, #{msg => "rpc_call_failed", bad_nodes => BadNodes}),
|
||||
GoodRes.
|
||||
|
||||
stream_log_file(get, #{bindings := #{name := Name}, query_string := Query}) ->
|
||||
|
@ -348,7 +347,7 @@ stream_log_file(get, #{bindings := #{name := Name}, query_string := Query}) ->
|
|||
Bytes = maps:get(<<"bytes">>, Query, 1000),
|
||||
case to_node(Node0) of
|
||||
{ok, Node} ->
|
||||
case rpc:call(Node, ?MODULE, read_trace_file, [Name, Position, Bytes]) of
|
||||
case emqx_mgmt_trace_proto_v1:read_trace_file(Node, Name, Position, Bytes) of
|
||||
{ok, Bin} ->
|
||||
Meta = #{<<"position">> => Position + byte_size(Bin), <<"bytes">> => Bytes},
|
||||
{200, #{meta => Meta, items => Bin}};
|
||||
|
@ -368,6 +367,7 @@ stream_log_file(get, #{bindings := #{name := Name}, query_string := Query}) ->
|
|||
{error, not_found} -> {400, #{code => 'NODE_ERROR', message => <<"Node not found">>}}
|
||||
end.
|
||||
|
||||
-spec get_trace_size() -> #{{node(), file:name_all()} => non_neg_integer()}.
|
||||
get_trace_size() ->
|
||||
TraceDir = emqx_trace:trace_dir(),
|
||||
Node = node(),
|
||||
|
@ -381,6 +381,12 @@ get_trace_size() ->
|
|||
end.
|
||||
|
||||
%% this is an rpc call for stream_log_file/2
|
||||
-spec read_trace_file( binary()
|
||||
, non_neg_integer()
|
||||
, non_neg_integer()
|
||||
) -> {ok, binary()}
|
||||
| {error, _}
|
||||
| {eof, non_neg_integer()}.
|
||||
read_trace_file(Name, Position, Limit) ->
|
||||
case emqx_trace:get_trace_filename(Name) of
|
||||
{error, _} = Error -> Error;
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
%%--------------------------------------------------------------------
|
||||
%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||
%%
|
||||
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||
%% you may not use this file except in compliance with the License.
|
||||
%% You may obtain a copy of the License at
|
||||
%%
|
||||
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||
%%
|
||||
%% Unless required by applicable law or agreed to in writing, software
|
||||
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
%% See the License for the specific language governing permissions and
|
||||
%% limitations under the License.
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
-module(emqx_mgmt_trace_proto_v1).
|
||||
|
||||
-behaviour(emqx_bpapi).
|
||||
|
||||
-export([ introduced_in/0
|
||||
|
||||
, trace_file/2
|
||||
, get_trace_size/1
|
||||
, read_trace_file/4
|
||||
]).
|
||||
|
||||
-include_lib("emqx/include/bpapi.hrl").
|
||||
|
||||
introduced_in() ->
|
||||
"5.0.0".
|
||||
|
||||
-spec get_trace_size([node()]) ->
|
||||
emqx_rpc:multicall_result(#{{node(), file:name_all()} => non_neg_integer()}).
|
||||
get_trace_size(Nodes) ->
|
||||
rpc:multicall(Nodes, emqx_mgmt_api_trace, get_trace_size, [], 30000).
|
||||
|
||||
-spec trace_file([node()], file:name_all()) ->
|
||||
emqx_rpc:multicall_result(
|
||||
{ok, Node :: list(), Binary :: binary()} |
|
||||
{error, Node :: list(), Reason :: term()}).
|
||||
trace_file(Nodes, File) ->
|
||||
rpc:multicall(Nodes, emqx_trace, trace_file, [File], 60000).
|
||||
|
||||
-spec read_trace_file(node(), binary(), non_neg_integer(), non_neg_integer()) ->
|
||||
{ok, binary()}
|
||||
| {error, _}
|
||||
| {eof, non_neg_integer()}
|
||||
| {badrpc, _}.
|
||||
read_trace_file(Node, Name, Position, Limit) ->
|
||||
rpc:call(Node, emqx_mgmt_api_trace, read_trace_file, [Name, Position, Limit]).
|
Loading…
Reference in New Issue