diff --git a/apps/emqx_exhook/src/emqx_exhook_api.erl b/apps/emqx_exhook/src/emqx_exhook_api.erl index 02264c143..2df2176d3 100644 --- a/apps/emqx_exhook/src/emqx_exhook_api.erl +++ b/apps/emqx_exhook/src/emqx_exhook_api.erl @@ -32,6 +32,14 @@ -define(BAD_REQUEST, 'BAD_REQUEST'). -define(BAD_RPC, 'BAD_RPC'). +-type rpc_result() :: {error, any()} + | any(). + +-dialyzer([{nowarn_function, [ fill_cluster_server_info/5 + , nodes_server_info/5 + , fill_server_hooks_info/4 + ]}]). + %%-------------------------------------------------------------------- %% schema %%-------------------------------------------------------------------- @@ -144,7 +152,7 @@ fields(node_metrics) -> fields(node_status) -> [ {node, mk(string(), #{})} - , {status, mk(enum([running, waiting, stopped, not_found, error]), #{})} + , {status, mk(enum([running, waiting, stopped, error]), #{})} ]; fields(hook_info) -> @@ -387,6 +395,7 @@ call_cluster(Module, Fun, Args) -> Nodes = mria_mnesia:running_nodes(), [{Node, rpc_call(Node, Module, Fun, Args)} || Node <- Nodes]. +-spec rpc_call(node(), atom(), atom(), list()) -> rpc_result(). rpc_call(Node, Module, Fun, Args) when Node =:= node() -> erlang:apply(Module, Fun, Args); diff --git a/apps/emqx_exhook/src/emqx_exhook_metrics.erl b/apps/emqx_exhook/src/emqx_exhook_metrics.erl index ce92bb4db..abe592a97 100644 --- a/apps/emqx_exhook/src/emqx_exhook_metrics.erl +++ b/apps/emqx_exhook/src/emqx_exhook_metrics.erl @@ -21,18 +21,17 @@ %% API -export([ init/0, succeed/2, failed/2 , update/1, new_metrics_info/0, servers_metrics/0 - , delete_server/1, server_metrics/1, hooks_metrics/1 - , metrics_aggregate/1, metrics_aggregate_by_key/2, hooks_metrics_aggregate/1 + , on_server_deleted/1, server_metrics/1, hooks_metrics/1 + , metrics_aggregate/1, metrics_aggregate_by_key/2 , metrics_aggregate_by/2 ]). --record(metrics, { - index :: index() - ,succeed = 0 :: non_neg_integer() - ,failed = 0 :: non_neg_integer() - ,rate = 0 :: non_neg_integer() - ,max_rate = 0 :: non_neg_integer() - ,window_rate :: integer() +-record(metrics, { index :: index() + , succeed = 0 :: non_neg_integer() + , failed = 0 :: non_neg_integer() + , rate = 0 :: non_neg_integer() + , max_rate = 0 :: non_neg_integer() + , window_rate :: integer() }). -type server_name() :: emqx_exhook_mgr:server_name(). @@ -69,7 +68,7 @@ new_metric_info() -> max_rate => 0 }. --spec succeed(server_name(), hookpoint()) -> integer(). +-spec succeed(server_name(), hookpoint()) -> ok. succeed(Server, Hook) -> inc(Server, Hook, #metrics.succeed, #metrics{index = {Server, Hook} @@ -77,7 +76,7 @@ succeed(Server, Hook) -> ,succeed = 1 }). --spec failed(server_name(), hookpoint()) -> integer(). +-spec failed(server_name(), hookpoint()) -> ok. failed(Server, Hook) -> inc(Server, Hook, #metrics.failed, #metrics{index = {Server, Hook} @@ -104,8 +103,8 @@ update(Interval) -> ets:foldl(Fun, true, ?HOOKS_METRICS). --spec delete_server(server_name()) -> true. -delete_server(Name) -> +-spec on_server_deleted(server_name()) -> true. +on_server_deleted(Name) -> ets:match_delete(?HOOKS_METRICS, {metrics, {Name, '_'}, '_', '_', '_', '_', '_'}). @@ -185,30 +184,17 @@ metrics_aggregate_by_key(Key, MetricsL) -> metrics_aggregate_by(fun(X) -> maps:get(Key, X, new_metrics_info()) end, MetricsL). --spec hooks_metrics_aggregate(list(hooks_metrics())) -> hooks_metrics(). -hooks_metrics_aggregate([]) -> - #{}; - -hooks_metrics_aggregate([H | _] = MapL) -> - Hooks = maps:keys(H), - - Fold = fun(Hook, Acc) -> - Metrics = metrics_aggregate_by_key(Hook, MapL), - Acc#{Hook => Metrics} - end, - - lists:foldl(Fold, #{}, Hooks). - %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- --spec inc(server_name(), hookpoint(), pos_integer(), #metrics{}) -> integer(). +-spec inc(server_name(), hookpoint(), pos_integer(), #metrics{}) -> ok. inc(Server, Hook, Pos, Default) -> Index = {Server, Hook}, - ets:update_counter(?HOOKS_METRICS, - Index, - [{#metrics.window_rate, 1}, {Pos, 1}], - Default). + _ = ets:update_counter(?HOOKS_METRICS, + Index, + [{#metrics.window_rate, 1}, {Pos, 1}], + Default), + ok. -spec new_metrics_info() -> metrics_info(). new_metrics_info() -> @@ -231,7 +217,8 @@ metrics_add(#{succeed := S1, failed := F1, rate := R1, max_rate := M1} , max_rate := M1 + M2 }. --spec metrics_aggregate_by(fun((any()) -> metrics_info()), list(metrics_info())) -> metrics_info(). +-spec metrics_aggregate_by(fun((X) -> metrics_info()), list(X)) -> metrics_info() + when X :: any(). metrics_aggregate_by(_, []) -> new_metric_info(); diff --git a/apps/emqx_exhook/src/emqx_exhook_mgr.erl b/apps/emqx_exhook/src/emqx_exhook_mgr.erl index 6123cd468..300858807 100644 --- a/apps/emqx_exhook/src/emqx_exhook_mgr.erl +++ b/apps/emqx_exhook/src/emqx_exhook_mgr.erl @@ -241,7 +241,7 @@ handle_call({update_config, {delete, ToDelete}, _}, _From, State) -> orders := maps:remove(ToDelete, Orders) }, - emqx_exhook_metrics:delete_server(ToDelete), + emqx_exhook_metrics:on_server_deleted(ToDelete), {reply, ok, State3};