diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index 49ab90856..9302ee722 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -948,14 +948,14 @@ lookup_from_local_node(ChainName, AuthenticatorID) -> Metrics = emqx_plugin_libs_metrics:get_metrics(authn_metrics, AuthenticatorID), case lists:member(Provider, resource_provider()) of false -> - {ok, {NodeId, connected, Metrics}}; + {ok, {NodeId, connected, Metrics, #{}}}; true -> #{resource_id := ResourceId} = State, case emqx_resource:get_instance(ResourceId) of {error, not_found} -> {error, {NodeId, not_found_resource}}; - {ok, _, #{status := Status}} -> - {ok, {NodeId, Status, Metrics}} + {ok, _, #{status := Status, metrics := ResourceMetrics}} -> + {ok, {NodeId, Status, Metrics, ResourceMetrics}} end end; {error, Reason} -> @@ -966,15 +966,22 @@ lookup_from_all_nodes(ChainName, AuthenticatorID) -> Nodes = mria_mnesia:running_nodes(), case is_ok(emqx_authn_proto_v1:lookup_from_all_nodes(Nodes, ChainName, AuthenticatorID)) of {ok, ResList} -> - {StatusMap, MetricsMap, ErrorMap} = make_result_map(ResList), + {StatusMap, MetricsMap, ResourceMetricsMap, ErrorMap} = make_result_map(ResList), AggregateStatus = aggregate_status(maps:values(StatusMap)), AggregateMetrics = aggregate_metrics(maps:values(MetricsMap)), + AggregateResourceMetrics = aggregate_metrics(maps:values(ResourceMetricsMap)), Fun = fun(_, V1) -> restructure_map(V1) end, MKMap = fun(Name) -> fun({Key, Val}) -> #{node => Key, Name => Val} end end, HelpFun = fun(M, Name) -> lists:map(MKMap(Name), maps:to_list(M)) end, {200, #{ + node_resource_metrics => HelpFun(maps:map(Fun, ResourceMetricsMap), metrics), + resource_metrics => case maps:size(AggregateResourceMetrics) of + 0 -> #{}; + _ -> restructure_map(AggregateResourceMetrics) + end, node_metrics => HelpFun(maps:map(Fun, MetricsMap), metrics), metrics => restructure_map(AggregateMetrics), + node_status => HelpFun(StatusMap, status), status => AggregateStatus, node_error => HelpFun(maps:map(Fun, ErrorMap), reason) @@ -998,7 +1005,7 @@ aggregate_status(AllStatus) -> end. aggregate_metrics([]) -> - empty_metrics_and_status; + #{}; aggregate_metrics([HeadMetrics | AllMetrics]) -> CombinerFun = fun ComFun(_Key, Val1, Val2) -> @@ -1014,19 +1021,20 @@ aggregate_metrics([HeadMetrics | AllMetrics]) -> make_result_map(ResList) -> Fun = - fun(Elem, {StatusMap, MetricsMap, ErrorMap}) -> + fun(Elem, {StatusMap, MetricsMap, ResourceMetricsMap, ErrorMap}) -> case Elem of - {ok, {NodeId, Status, Metrics}} -> + {ok, {NodeId, Status, Metrics, ResourceMetrics}} -> { maps:put(NodeId, Status, StatusMap), maps:put(NodeId, Metrics, MetricsMap), + maps:put(NodeId, ResourceMetrics, ResourceMetricsMap), ErrorMap }; {error, {NodeId, Reason}} -> - {StatusMap, MetricsMap, maps:put(NodeId, Reason, ErrorMap)} + {StatusMap, MetricsMap, ResourceMetricsMap, maps:put(NodeId, Reason, ErrorMap)} end end, - lists:foldl(Fun, {maps:new(), maps:new(), maps:new()}, ResList). + lists:foldl(Fun, {maps:new(), maps:new(), maps:new(), maps:new()}, ResList). restructure_map(#{ counters := #{failed := Failed, matched := Match, success := Succ, ignore := Ignore}, @@ -1041,6 +1049,18 @@ restructure_map(#{ rate_last5m => Rate5m, rate_max => RateMax }; +restructure_map(#{ + counters := #{failed := Failed, matched := Match, success := Succ}, + rate := #{matched := #{current := Rate, last5m := Rate5m, max := RateMax}} + }) -> + #{ + matched => Match, + success => Succ, + failed => Failed, + rate => Rate, + rate_last5m => Rate5m, + rate_max => RateMax + }; restructure_map(Error) -> Error. diff --git a/apps/emqx_authn/src/emqx_authn_schema.erl b/apps/emqx_authn/src/emqx_authn_schema.erl index 7ac6422d9..9b318cd0c 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -89,13 +89,20 @@ backend(Name) -> fields("metrics_status_fields") -> [ + + {"resource_metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})}, + {"node_resource_metrics", + mk( + hoconsc:array(ref(?MODULE, "node_resource_metrics")), + #{desc => ?DESC("node_metrics")} + )}, {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})}, {"node_metrics", mk( hoconsc:array(ref(?MODULE, "node_metrics")), #{desc => ?DESC("node_metrics")} )}, - {"status", mk(status(), #{desc => ?DESC("status")})}, + {"status", mk(cluster_status(), #{desc => ?DESC("status")})}, {"node_status", mk( hoconsc:array(ref(?MODULE, "node_status")), @@ -117,11 +124,27 @@ fields("metrics") -> {"rate_max", mk(float(), #{desc => ?DESC("rate_max")})}, {"rate_last5m", mk(float(), #{desc => ?DESC("rate_last5m")})} ]; + +fields("resource_metrics") -> + [ + {"matched", mk(integer(), #{desc => ?DESC("matched")})}, + {"success", mk(integer(), #{desc => ?DESC("success")})}, + {"failed", mk(integer(), #{desc => ?DESC("failed")})}, + {"rate", mk(float(), #{desc => ?DESC("rate")})}, + {"rate_max", mk(float(), #{desc => ?DESC("rate_max")})}, + {"rate_last5m", mk(float(), #{desc => ?DESC("rate_last5m")})} + ]; fields("node_metrics") -> [ node_name(), {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})} ]; + +fields("node_resource_metrics") -> + [ + node_name(), + {"metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})} + ]; fields("node_status") -> [ node_name(), @@ -137,5 +160,8 @@ fields("node_error") -> status() -> hoconsc:enum([connected, disconnected, connecting]). +cluster_status() -> + hoconsc:enum([connected, disconnected, connecting, inconsistent]). + node_name() -> {"node", mk(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}.