From 2a7bd74ef1b7509f0f670b324488b5f2d81a682e Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 11:08:44 +0800 Subject: [PATCH 1/7] feat: authn add new metrics --- apps/emqx/src/emqx_authentication.erl | 12 +++ .../i18n/emqx_authn_schema_i18n.conf | 11 +++ apps/emqx_authn/src/emqx_authn_api.erl | 79 ++++++++++--------- apps/emqx_authn/src/emqx_authn_schema.erl | 12 +++ apps/emqx_authn/src/emqx_authn_sup.erl | 3 +- apps/emqx_authn/test/emqx_authn_api_SUITE.erl | 68 +++++++++++++++- 6 files changed, 142 insertions(+), 43 deletions(-) diff --git a/apps/emqx/src/emqx_authentication.erl b/apps/emqx/src/emqx_authentication.erl index 92bb66dfd..0b5948955 100644 --- a/apps/emqx/src/emqx_authentication.erl +++ b/apps/emqx/src/emqx_authentication.erl @@ -609,6 +609,9 @@ handle_create_authenticator(Chain, Config, Providers) -> ?CHAINS_TAB, Chain#chain{authenticators = NAuthenticators} ), + + ok = emqx_plugin_libs_metrics:create_metrics(authn_metrics, AuthenticatorID, + [matched, success, failed, ignore], [matched]), {ok, serialize_authenticator(Authenticator)}; {error, Reason} -> {error, Reason} @@ -618,8 +621,10 @@ handle_create_authenticator(Chain, Config, Providers) -> do_authenticate([], _) -> {stop, {error, not_authorized}}; do_authenticate([#authenticator{id = ID, provider = Provider, state = State} | More], Credential) -> + emqx_plugin_libs_metrics:inc(authn_metrics, ID, matched), try Provider:authenticate(Credential, State) of ignore -> + ok = emqx_plugin_libs_metrics:inc(authn_metrics, ID, ignore), do_authenticate(More, Credential); Result -> %% {ok, Extra} @@ -627,6 +632,12 @@ do_authenticate([#authenticator{id = ID, provider = Provider, state = State} | M %% {continue, AuthCache} %% {continue, AuthData, AuthCache} %% {error, Reason} + case Result of + {ok, _} -> + emqx_plugin_libs_metrics:inc(authn_metrics, ID, success); + {error, _} -> + emqx_plugin_libs_metrics:inc(authn_metrics, ID, failed) + end, {stop, Result} catch Class:Reason:Stacktrace -> @@ -637,6 +648,7 @@ do_authenticate([#authenticator{id = ID, provider = Provider, state = State} | M stacktrace => Stacktrace, authenticator => ID }), + emqx_plugin_libs_metrics:inc(authn_metrics, ID, ignore), do_authenticate(More, Credential) end. diff --git a/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf b/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf index 6caa1808f..371939daa 100644 --- a/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf +++ b/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf @@ -76,6 +76,17 @@ emqx_authn_schema { } } + node_error { + desc { + en: """The error of node.""" + zh: """节点上产生的错误。""" + } + label: { + en: """Error in Node""" + zh: """节点产生的错误""" + } + } + matched { desc { en: """Count of this resource is queried.""" diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index 0e7f03ce7..49ab90856 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -902,6 +902,8 @@ create_authenticator(ConfKeyPath, ChainName, Config) -> raw_config := AuthenticatorsConfig }} -> {ok, AuthenticatorConfig} = find_config(ID, AuthenticatorsConfig), + ok = emqx_plugin_libs_metrics:create_metrics(authn_metrics, ID, + [matched, success, failed, ignore], [matched]), {200, maps:put(id, ID, convert_certs(fill_defaults(AuthenticatorConfig)))}; {error, {_PrePostConfigUpdate, emqx_authentication, Reason}} -> serialize_error(Reason); @@ -930,61 +932,55 @@ list_authenticator(_, ConfKeyPath, AuthenticatorID) -> serialize_error(Reason) end. +resource_provider() -> + [ + emqx_authn_mysql, + emqx_authn_pgsql, + emqx_authn_mongodb, + emqx_authn_redis, + emqx_authn_http + ]. + lookup_from_local_node(ChainName, AuthenticatorID) -> NodeId = node(self()), case emqx_authentication:lookup_authenticator(ChainName, AuthenticatorID) of {ok, #{provider := Provider, state := State}} -> + Metrics = emqx_plugin_libs_metrics:get_metrics(authn_metrics, AuthenticatorID), case lists:member(Provider, resource_provider()) of false -> - {error, {NodeId, resource_unsupport_metrics_and_status}}; + {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, metrics := Metrics}} -> + {ok, _, #{status := Status}} -> {ok, {NodeId, Status, Metrics}} end end; {error, Reason} -> - {error, {NodeId, Reason}} + {error, {NodeId, list_to_binary(io_lib:format("~p", [Reason]))}} end. -resource_provider() -> - [ - emqx_authn_mysql, - emqx_authn_pgsql, - emqx_authn_mongodb, - emqx_authn_redis, - emqx_authn_http - ]. - 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, _} = make_result_map(ResList), + {StatusMap, MetricsMap, ErrorMap} = make_result_map(ResList), AggregateStatus = aggregate_status(maps:values(StatusMap)), AggregateMetrics = aggregate_metrics(maps:values(MetricsMap)), 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, - case AggregateStatus of - empty_metrics_and_status -> - {400, #{ - code => <<"BAD_REQUEST">>, - message => <<"Resource Not Support Status">> - }}; - _ -> - {200, #{ - node_status => HelpFun(StatusMap, status), - node_metrics => HelpFun(maps:map(Fun, MetricsMap), metrics), - status => AggregateStatus, - metrics => restructure_map(AggregateMetrics) - }} - end; + {200, #{ + 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) + }}; {error, ErrL} -> - {500, #{ + {400, #{ code => <<"INTERNAL_ERROR">>, message => list_to_binary(io_lib:format("~p", [ErrL])) }} @@ -1019,27 +1015,28 @@ aggregate_metrics([HeadMetrics | AllMetrics]) -> make_result_map(ResList) -> Fun = fun(Elem, {StatusMap, MetricsMap, ErrorMap}) -> - case Elem of - {ok, {NodeId, Status, Metrics}} -> - { - maps:put(NodeId, Status, StatusMap), - maps:put(NodeId, Metrics, MetricsMap), - ErrorMap - }; - {error, {NodeId, Reason}} -> - {StatusMap, MetricsMap, maps:put(NodeId, Reason, ErrorMap)} - end + case Elem of + {ok, {NodeId, Status, Metrics}} -> + { + maps:put(NodeId, Status, StatusMap), + maps:put(NodeId, Metrics, MetricsMap), + ErrorMap + }; + {error, {NodeId, Reason}} -> + {StatusMap, MetricsMap, maps:put(NodeId, Reason, ErrorMap)} + end end, lists:foldl(Fun, {maps:new(), maps:new(), maps:new()}, ResList). restructure_map(#{ - counters := #{failed := Failed, matched := Match, success := Succ}, + counters := #{failed := Failed, matched := Match, success := Succ, ignore := Ignore}, rate := #{matched := #{current := Rate, last5m := Rate5m, max := RateMax}} }) -> #{ matched => Match, success => Succ, failed => Failed, + ignore => Ignore, rate => Rate, rate_last5m => Rate5m, rate_max => RateMax @@ -1083,6 +1080,7 @@ update_authenticator(ConfKeyPath, ChainName, AuthenticatorID, Config) -> delete_authenticator(ConfKeyPath, ChainName, AuthenticatorID) -> case update_config(ConfKeyPath, {delete_authenticator, ChainName, AuthenticatorID}) of {ok, _} -> + emqx_plugin_libs_metrics:clear_metrics(authn_metrics, AuthenticatorID), {204}; {error, {_PrePostConfigUpdate, emqx_authentication, Reason}} -> serialize_error(Reason); @@ -1439,10 +1437,12 @@ status_metrics_example() -> matched => 0, success => 0, failed => 0, + ignore => 0, rate => 0.0, rate_last5m => 0.0, rate_max => 0.0 }, + node_error => [], node_metrics => [ #{ node => node(), @@ -1450,6 +1450,7 @@ status_metrics_example() -> matched => 0, success => 0, failed => 0, + ignore => 0, rate => 0.0, rate_last5m => 0.0, rate_max => 0.0 diff --git a/apps/emqx_authn/src/emqx_authn_schema.erl b/apps/emqx_authn/src/emqx_authn_schema.erl index ef20e36cf..7ac6422d9 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -100,6 +100,11 @@ fields("metrics_status_fields") -> mk( hoconsc:array(ref(?MODULE, "node_status")), #{desc => ?DESC("node_status")} + )}, + {"node_error", + mk( + hoconsc:array(ref(?MODULE, "node_error")), + #{desc => ?DESC("node_error")} )} ]; fields("metrics") -> @@ -107,6 +112,7 @@ fields("metrics") -> {"matched", mk(integer(), #{desc => ?DESC("matched")})}, {"success", mk(integer(), #{desc => ?DESC("success")})}, {"failed", mk(integer(), #{desc => ?DESC("failed")})}, + {"ignore", 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")})} @@ -120,6 +126,12 @@ fields("node_status") -> [ node_name(), {"status", mk(status(), #{desc => ?DESC("node_status")})} + ]; + +fields("node_error") -> + [ + node_name(), + {"error", mk(string(), #{desc => ?DESC("node_error")})} ]. status() -> diff --git a/apps/emqx_authn/src/emqx_authn_sup.erl b/apps/emqx_authn/src/emqx_authn_sup.erl index d88acfacc..6dbe605fe 100644 --- a/apps/emqx_authn/src/emqx_authn_sup.erl +++ b/apps/emqx_authn/src/emqx_authn_sup.erl @@ -27,5 +27,6 @@ start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). init([]) -> - ChildSpecs = [], + Metrics = emqx_plugin_libs_metrics:child_spec(authn_metrics), + ChildSpecs = [Metrics], {ok, {{one_for_one, 10, 10}, ChildSpecs}}. diff --git a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl index e082c93b4..bcae2864e 100644 --- a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl @@ -129,7 +129,8 @@ t_aggregate_metrics(_) -> rate => 0.0, rate_last5m => 0.0, rate_max => 0.1, - success => 1 + success => 1, + ignore => 1 } }, 'emqx@node2.emqx.io' => #{ @@ -140,7 +141,8 @@ t_aggregate_metrics(_) -> rate => 0.0, rate_last5m => 0.0, rate_max => 0.1, - success => 1 + success => 1, + ignore => 2 } } }, @@ -154,7 +156,8 @@ t_aggregate_metrics(_) -> rate => 0.0, rate_last5m => 0.0, rate_max => 0.2, - success => 2 + success => 2, + ignore => 3 } }, Res @@ -299,6 +302,37 @@ test_authenticator_users(PathPrefix) -> emqx_authn_test_lib:built_in_database_example() ), + {ok, Client} = emqtt:start_link( + [ {username, <<"u_event">>} + , {clientid, <<"c_event">>} + , {proto_ver, v5} + , {properties, #{'Session-Expiry-Interval' => 60}} + ]), + + process_flag(trap_exit, true), + ?assertMatch({error, _}, emqtt:connect(Client)), + timer:sleep(300), + + + UsersUri0 = uri(PathPrefix ++ [?CONF_NS, "password_based:built_in_database", "status"]), + {ok, 200, PageData0} = request(get, UsersUri0), + case PathPrefix of + [] -> + #{ <<"metrics">> := #{ + <<"matched">> := 1, + <<"success">> := 0, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData0, [return_maps]); + ["listeners",'tcp:default'] -> + #{ <<"metrics">> := #{ + <<"matched">> := 3, + <<"success">> := 1, + <<"ignore">> := 2 + } + } = jiffy:decode(PageData0, [return_maps]) + end, + InvalidUsers = [ #{clientid => <<"u1">>, password => <<"p1">>}, #{user_id => <<"u2">>}, @@ -325,6 +359,34 @@ test_authenticator_users(PathPrefix) -> ValidUsers ), + {ok, Client1} = emqtt:start_link( + [ {username, <<"u1">>} + , {password, <<"p1">>} + , {clientid, <<"c_event">>} + , {proto_ver, v5} + , {properties, #{'Session-Expiry-Interval' => 60}} + ]), + {ok, _} = emqtt:connect(Client1), + timer:sleep(300), + UsersUri01 = uri(PathPrefix ++ [?CONF_NS, "password_based:built_in_database", "status"]), + {ok, 200, PageData01} = request(get, UsersUri01), + case PathPrefix of + [] -> + #{ <<"metrics">> := #{ + <<"matched">> := 2, + <<"success">> := 1, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData01, [return_maps]); + ["listeners",'tcp:default'] -> + #{ <<"metrics">> := #{ + <<"matched">> := 4, + <<"success">> := 2, + <<"ignore">> := 2 + } + } = jiffy:decode(PageData01, [return_maps]) + end, + {ok, 200, Page1Data} = request(get, UsersUri ++ "?page=1&limit=2"), #{ From 098598a0bee272c405a599f70929f8c5325983a3 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 12:32:11 +0800 Subject: [PATCH 2/7] fix: add resource_metrics, node_resource_metrics --- apps/emqx_authn/src/emqx_authn_api.erl | 38 +++++++++++++++++------ apps/emqx_authn/src/emqx_authn_schema.erl | 28 ++++++++++++++++- 2 files changed, 56 insertions(+), 10 deletions(-) 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"})}. From 6530604f40bf6a7bd36f89462f69db3cc656f3c7 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 14:38:45 +0800 Subject: [PATCH 3/7] fix: add authn authz metrics supervisor --- apps/emqx/src/emqx_authentication.erl | 4 ++- .../emqx/src/emqx_authn_authz_metrics_sup.erl | 36 +++++++++++++++++++ apps/emqx/src/emqx_kernel_sup.erl | 3 +- apps/emqx_authn/src/emqx_authn_api.erl | 1 - apps/emqx_authn/src/emqx_authn_sup.erl | 3 +- .../src/emqx_plugin_libs_metrics.erl | 20 ++++++----- 6 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 apps/emqx/src/emqx_authn_authz_metrics_sup.erl diff --git a/apps/emqx/src/emqx_authentication.erl b/apps/emqx/src/emqx_authentication.erl index 0b5948955..418e4fd78 100644 --- a/apps/emqx/src/emqx_authentication.erl +++ b/apps/emqx/src/emqx_authentication.erl @@ -580,7 +580,9 @@ handle_delete_authenticator(Chain, AuthenticatorID) -> end, case do_delete_authenticators(MatchFun, Chain) of [] -> {error, {not_found, {authenticator, AuthenticatorID}}}; - [AuthenticatorID] -> ok + [AuthenticatorID] -> + emqx_plugin_libs_metrics:clear_metrics(authn_metrics, AuthenticatorID), + ok end. handle_move_authenticator(Chain, AuthenticatorID, Position) -> diff --git a/apps/emqx/src/emqx_authn_authz_metrics_sup.erl b/apps/emqx/src/emqx_authn_authz_metrics_sup.erl new file mode 100644 index 000000000..569e4a69f --- /dev/null +++ b/apps/emqx/src/emqx_authn_authz_metrics_sup.erl @@ -0,0 +1,36 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2018-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_authn_authz_metrics_sup). + +-behaviour(supervisor). + +-export([start_link/0]). + +-export([init/1]). + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +init([]) -> + AuthnMetrics = emqx_plugin_libs_metrics:child_spec(emqx_authn_metrics, authn_metrics), + AuthzMetrics = emqx_plugin_libs_metrics:child_spec(eqmx_authz_metrics, authz_metrics), + {ok, { + {one_for_one, 10, 100}, + [ AuthnMetrics, + AuthzMetrics + ] + }}. diff --git a/apps/emqx/src/emqx_kernel_sup.erl b/apps/emqx/src/emqx_kernel_sup.erl index 654c5e223..3c8b5d1d3 100644 --- a/apps/emqx/src/emqx_kernel_sup.erl +++ b/apps/emqx/src/emqx_kernel_sup.erl @@ -35,7 +35,8 @@ init([]) -> child_spec(emqx_hooks, worker), child_spec(emqx_stats, worker), child_spec(emqx_metrics, worker), - child_spec(emqx_ctl, worker) + child_spec(emqx_ctl, worker), + child_spec(emqx_authn_authz_metrics_sup, supervisor) ] }}. diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index 9302ee722..e509ca532 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -1100,7 +1100,6 @@ update_authenticator(ConfKeyPath, ChainName, AuthenticatorID, Config) -> delete_authenticator(ConfKeyPath, ChainName, AuthenticatorID) -> case update_config(ConfKeyPath, {delete_authenticator, ChainName, AuthenticatorID}) of {ok, _} -> - emqx_plugin_libs_metrics:clear_metrics(authn_metrics, AuthenticatorID), {204}; {error, {_PrePostConfigUpdate, emqx_authentication, Reason}} -> serialize_error(Reason); diff --git a/apps/emqx_authn/src/emqx_authn_sup.erl b/apps/emqx_authn/src/emqx_authn_sup.erl index 6dbe605fe..d88acfacc 100644 --- a/apps/emqx_authn/src/emqx_authn_sup.erl +++ b/apps/emqx_authn/src/emqx_authn_sup.erl @@ -27,6 +27,5 @@ start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). init([]) -> - Metrics = emqx_plugin_libs_metrics:child_spec(authn_metrics), - ChildSpecs = [Metrics], + ChildSpecs = [], {ok, {{one_for_one, 10, 10}, ChildSpecs}}. diff --git a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl index d3cc3e63c..a438d3078 100644 --- a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl +++ b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl @@ -22,7 +22,8 @@ -export([ start_link/1, stop/1, - child_spec/1 + child_spec/1, + child_spec/2 ]). -export([ @@ -99,14 +100,17 @@ -spec child_spec(handler_name()) -> supervisor:child_spec(). child_spec(Name) -> + child_spec(emqx_plugin_libs_metrics, Name). + +child_spec(ChldName, Name) -> #{ - id => emqx_plugin_libs_metrics, - start => {emqx_plugin_libs_metrics, start_link, [Name]}, - restart => permanent, - shutdown => 5000, - type => worker, - modules => [emqx_plugin_libs_metrics] - }. + id => ChldName, + start => {emqx_plugin_libs_metrics, start_link, [Name]}, + restart => permanent, + shutdown => 5000, + type => worker, + modules => [emqx_plugin_libs_metrics] + }. -spec create_metrics(handler_name(), metric_id(), [atom()]) -> ok | {error, term()}. create_metrics(Name, Id, Metrics) -> From 5b0ee30d724a004c87ad6b1955c6388f6c6b5bb2 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 15:02:07 +0800 Subject: [PATCH 4/7] fix: ignore unwanted results --- apps/emqx/src/emqx_authentication.erl | 5 +++-- apps/emqx_authn/test/emqx_authn_api_SUITE.erl | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/emqx/src/emqx_authentication.erl b/apps/emqx/src/emqx_authentication.erl index 418e4fd78..fbb220a95 100644 --- a/apps/emqx/src/emqx_authentication.erl +++ b/apps/emqx/src/emqx_authentication.erl @@ -638,8 +638,9 @@ do_authenticate([#authenticator{id = ID, provider = Provider, state = State} | M {ok, _} -> emqx_plugin_libs_metrics:inc(authn_metrics, ID, success); {error, _} -> - emqx_plugin_libs_metrics:inc(authn_metrics, ID, failed) - end, + emqx_plugin_libs_metrics:inc(authn_metrics, ID, failed); + _ -> ok + end, {stop, Result} catch Class:Reason:Stacktrace -> diff --git a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl index bcae2864e..aeb2f7437 100644 --- a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl @@ -326,9 +326,9 @@ test_authenticator_users(PathPrefix) -> } = jiffy:decode(PageData0, [return_maps]); ["listeners",'tcp:default'] -> #{ <<"metrics">> := #{ - <<"matched">> := 3, - <<"success">> := 1, - <<"ignore">> := 2 + <<"matched">> := 1, + <<"success">> := 0, + <<"ignore">> := 1 } } = jiffy:decode(PageData0, [return_maps]) end, @@ -380,9 +380,9 @@ test_authenticator_users(PathPrefix) -> } = jiffy:decode(PageData01, [return_maps]); ["listeners",'tcp:default'] -> #{ <<"metrics">> := #{ - <<"matched">> := 4, - <<"success">> := 2, - <<"ignore">> := 2 + <<"matched">> := 2, + <<"success">> := 1, + <<"ignore">> := 1 } } = jiffy:decode(PageData01, [return_maps]) end, From 4365de9ad5ab599a8a993e5fcfcbc6a54784e9a7 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 15:39:08 +0800 Subject: [PATCH 5/7] fix: format code --- apps/emqx/src/emqx_authentication.erl | 14 +++- .../emqx/src/emqx_authn_authz_metrics_sup.erl | 14 ++-- apps/emqx_authn/src/emqx_authn_api.erl | 69 ++++++++------- apps/emqx_authn/src/emqx_authn_schema.erl | 20 ++--- apps/emqx_authn/test/emqx_authn_api_SUITE.erl | 83 ++++++++++--------- .../src/emqx_plugin_libs_metrics.erl | 14 ++-- 6 files changed, 115 insertions(+), 99 deletions(-) diff --git a/apps/emqx/src/emqx_authentication.erl b/apps/emqx/src/emqx_authentication.erl index fbb220a95..3c1305f76 100644 --- a/apps/emqx/src/emqx_authentication.erl +++ b/apps/emqx/src/emqx_authentication.erl @@ -579,7 +579,8 @@ handle_delete_authenticator(Chain, AuthenticatorID) -> ID =:= AuthenticatorID end, case do_delete_authenticators(MatchFun, Chain) of - [] -> {error, {not_found, {authenticator, AuthenticatorID}}}; + [] -> + {error, {not_found, {authenticator, AuthenticatorID}}}; [AuthenticatorID] -> emqx_plugin_libs_metrics:clear_metrics(authn_metrics, AuthenticatorID), ok @@ -612,8 +613,12 @@ handle_create_authenticator(Chain, Config, Providers) -> Chain#chain{authenticators = NAuthenticators} ), - ok = emqx_plugin_libs_metrics:create_metrics(authn_metrics, AuthenticatorID, - [matched, success, failed, ignore], [matched]), + ok = emqx_plugin_libs_metrics:create_metrics( + authn_metrics, + AuthenticatorID, + [matched, success, failed, ignore], + [matched] + ), {ok, serialize_authenticator(Authenticator)}; {error, Reason} -> {error, Reason} @@ -639,7 +644,8 @@ do_authenticate([#authenticator{id = ID, provider = Provider, state = State} | M emqx_plugin_libs_metrics:inc(authn_metrics, ID, success); {error, _} -> emqx_plugin_libs_metrics:inc(authn_metrics, ID, failed); - _ -> ok + _ -> + ok end, {stop, Result} catch diff --git a/apps/emqx/src/emqx_authn_authz_metrics_sup.erl b/apps/emqx/src/emqx_authn_authz_metrics_sup.erl index 569e4a69f..ccffc604b 100644 --- a/apps/emqx/src/emqx_authn_authz_metrics_sup.erl +++ b/apps/emqx/src/emqx_authn_authz_metrics_sup.erl @@ -28,9 +28,11 @@ start_link() -> init([]) -> AuthnMetrics = emqx_plugin_libs_metrics:child_spec(emqx_authn_metrics, authn_metrics), AuthzMetrics = emqx_plugin_libs_metrics:child_spec(eqmx_authz_metrics, authz_metrics), - {ok, { - {one_for_one, 10, 100}, - [ AuthnMetrics, - AuthzMetrics - ] - }}. + {ok, + { + {one_for_one, 10, 100}, + [ + AuthnMetrics, + AuthzMetrics + ] + }}. diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index e509ca532..5b60803a5 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -902,8 +902,12 @@ create_authenticator(ConfKeyPath, ChainName, Config) -> raw_config := AuthenticatorsConfig }} -> {ok, AuthenticatorConfig} = find_config(ID, AuthenticatorsConfig), - ok = emqx_plugin_libs_metrics:create_metrics(authn_metrics, ID, - [matched, success, failed, ignore], [matched]), + ok = emqx_plugin_libs_metrics:create_metrics( + authn_metrics, + ID, + [matched, success, failed, ignore], + [matched] + ), {200, maps:put(id, ID, convert_certs(fill_defaults(AuthenticatorConfig)))}; {error, {_PrePostConfigUpdate, emqx_authentication, Reason}} -> serialize_error(Reason); @@ -934,11 +938,11 @@ list_authenticator(_, ConfKeyPath, AuthenticatorID) -> resource_provider() -> [ - emqx_authn_mysql, - emqx_authn_pgsql, - emqx_authn_mongodb, - emqx_authn_redis, - emqx_authn_http + emqx_authn_mysql, + emqx_authn_pgsql, + emqx_authn_mongodb, + emqx_authn_redis, + emqx_authn_http ]. lookup_from_local_node(ChainName, AuthenticatorID) -> @@ -975,10 +979,11 @@ lookup_from_all_nodes(ChainName, AuthenticatorID) -> 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, + resource_metrics => + case maps:size(AggregateResourceMetrics) of + 0 -> #{}; + _ -> restructure_map(AggregateResourceMetrics) + end, node_metrics => HelpFun(maps:map(Fun, MetricsMap), metrics), metrics => restructure_map(AggregateMetrics), @@ -1022,17 +1027,17 @@ aggregate_metrics([HeadMetrics | AllMetrics]) -> make_result_map(ResList) -> Fun = fun(Elem, {StatusMap, MetricsMap, ResourceMetricsMap, ErrorMap}) -> - case Elem of - {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, ResourceMetricsMap, maps:put(NodeId, Reason, ErrorMap)} - end + case Elem of + {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, ResourceMetricsMap, maps:put(NodeId, Reason, ErrorMap)} + end end, lists:foldl(Fun, {maps:new(), maps:new(), maps:new(), maps:new()}, ResList). @@ -1050,17 +1055,17 @@ restructure_map(#{ rate_max => RateMax }; restructure_map(#{ - counters := #{failed := Failed, matched := Match, success := Succ}, - rate := #{matched := #{current := Rate, last5m := Rate5m, max := RateMax}} - }) -> + 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 - }; + 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 9b318cd0c..305bbf6b5 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -89,7 +89,6 @@ backend(Name) -> fields("metrics_status_fields") -> [ - {"resource_metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})}, {"node_resource_metrics", mk( @@ -124,22 +123,20 @@ 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")})} + {"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(), @@ -150,11 +147,10 @@ fields("node_status") -> node_name(), {"status", mk(status(), #{desc => ?DESC("node_status")})} ]; - fields("node_error") -> [ - node_name(), - {"error", mk(string(), #{desc => ?DESC("node_error")})} + node_name(), + {"error", mk(string(), #{desc => ?DESC("node_error")})} ]. status() -> diff --git a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl index aeb2f7437..5fe1f9b17 100644 --- a/apps/emqx_authn/test/emqx_authn_api_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_api_SUITE.erl @@ -303,34 +303,37 @@ test_authenticator_users(PathPrefix) -> ), {ok, Client} = emqtt:start_link( - [ {username, <<"u_event">>} - , {clientid, <<"c_event">>} - , {proto_ver, v5} - , {properties, #{'Session-Expiry-Interval' => 60}} - ]), + [ + {username, <<"u_event">>}, + {clientid, <<"c_event">>}, + {proto_ver, v5}, + {properties, #{'Session-Expiry-Interval' => 60}} + ] + ), process_flag(trap_exit, true), ?assertMatch({error, _}, emqtt:connect(Client)), timer:sleep(300), - UsersUri0 = uri(PathPrefix ++ [?CONF_NS, "password_based:built_in_database", "status"]), {ok, 200, PageData0} = request(get, UsersUri0), case PathPrefix of [] -> - #{ <<"metrics">> := #{ - <<"matched">> := 1, - <<"success">> := 0, - <<"ignore">> := 1 - } - } = jiffy:decode(PageData0, [return_maps]); - ["listeners",'tcp:default'] -> - #{ <<"metrics">> := #{ - <<"matched">> := 1, - <<"success">> := 0, - <<"ignore">> := 1 - } - } = jiffy:decode(PageData0, [return_maps]) + #{ + <<"metrics">> := #{ + <<"matched">> := 1, + <<"success">> := 0, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData0, [return_maps]); + ["listeners", 'tcp:default'] -> + #{ + <<"metrics">> := #{ + <<"matched">> := 1, + <<"success">> := 0, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData0, [return_maps]) end, InvalidUsers = [ @@ -360,31 +363,35 @@ test_authenticator_users(PathPrefix) -> ), {ok, Client1} = emqtt:start_link( - [ {username, <<"u1">>} - , {password, <<"p1">>} - , {clientid, <<"c_event">>} - , {proto_ver, v5} - , {properties, #{'Session-Expiry-Interval' => 60}} - ]), + [ + {username, <<"u1">>}, + {password, <<"p1">>}, + {clientid, <<"c_event">>}, + {proto_ver, v5}, + {properties, #{'Session-Expiry-Interval' => 60}} + ] + ), {ok, _} = emqtt:connect(Client1), timer:sleep(300), UsersUri01 = uri(PathPrefix ++ [?CONF_NS, "password_based:built_in_database", "status"]), {ok, 200, PageData01} = request(get, UsersUri01), case PathPrefix of [] -> - #{ <<"metrics">> := #{ - <<"matched">> := 2, - <<"success">> := 1, - <<"ignore">> := 1 - } - } = jiffy:decode(PageData01, [return_maps]); - ["listeners",'tcp:default'] -> - #{ <<"metrics">> := #{ - <<"matched">> := 2, - <<"success">> := 1, - <<"ignore">> := 1 - } - } = jiffy:decode(PageData01, [return_maps]) + #{ + <<"metrics">> := #{ + <<"matched">> := 2, + <<"success">> := 1, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData01, [return_maps]); + ["listeners", 'tcp:default'] -> + #{ + <<"metrics">> := #{ + <<"matched">> := 2, + <<"success">> := 1, + <<"ignore">> := 1 + } + } = jiffy:decode(PageData01, [return_maps]) end, {ok, 200, Page1Data} = request(get, UsersUri ++ "?page=1&limit=2"), diff --git a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl index a438d3078..069760ab5 100644 --- a/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl +++ b/apps/emqx_plugin_libs/src/emqx_plugin_libs_metrics.erl @@ -104,13 +104,13 @@ child_spec(Name) -> child_spec(ChldName, Name) -> #{ - id => ChldName, - start => {emqx_plugin_libs_metrics, start_link, [Name]}, - restart => permanent, - shutdown => 5000, - type => worker, - modules => [emqx_plugin_libs_metrics] - }. + id => ChldName, + start => {emqx_plugin_libs_metrics, start_link, [Name]}, + restart => permanent, + shutdown => 5000, + type => worker, + modules => [emqx_plugin_libs_metrics] + }. -spec create_metrics(handler_name(), metric_id(), [atom()]) -> ok | {error, term()}. create_metrics(Name, Id, Metrics) -> From 51e025f07565f58848e348835060743138b3946b Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 16:10:47 +0800 Subject: [PATCH 6/7] fix: remove duplicated code --- apps/emqx_authn/src/emqx_authn_schema.erl | 29 +++++++++---------- .../test/emqx_prometheus_SUITE.erl | 8 ++--- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/apps/emqx_authn/src/emqx_authn_schema.erl b/apps/emqx_authn/src/emqx_authn_schema.erl index 305bbf6b5..ffcd2eeff 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -115,23 +115,10 @@ fields("metrics_status_fields") -> ]; fields("metrics") -> [ - {"matched", mk(integer(), #{desc => ?DESC("matched")})}, - {"success", mk(integer(), #{desc => ?DESC("success")})}, - {"failed", mk(integer(), #{desc => ?DESC("failed")})}, - {"ignore", 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")})} - ]; + {"ignore", mk(integer(), #{desc => ?DESC("failed")})} + ] ++ common_field(); 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")})} - ]; + common_field(); fields("node_metrics") -> [ node_name(), @@ -153,6 +140,16 @@ fields("node_error") -> {"error", mk(string(), #{desc => ?DESC("node_error")})} ]. +common_field() -> + [ + {"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")})} + ]. + status() -> hoconsc:enum([connected, disconnected, connecting]). diff --git a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl index 03e8d6d78..16590b114 100644 --- a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl +++ b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl @@ -22,14 +22,14 @@ -compile(export_all). -define(CLUSTER_RPC_SHARD, emqx_cluster_rpc_shard). --define(CONF_DEFAULT, - <<"\n" +-define(CONF_DEFAULT, << + "\n" "prometheus {\n" " push_gateway_server = \"http://127.0.0.1:9091\"\n" " interval = \"1s\"\n" " enable = true\n" - "}\n">> -). + "}\n" +>>). %%-------------------------------------------------------------------- %% Setups From 56761ecb74cb8058f1a7ec08845ad1323d1540c9 Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 28 Apr 2022 16:20:38 +0800 Subject: [PATCH 7/7] fix: remove duplicated create_metrics --- apps/emqx_authn/src/emqx_authn_api.erl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index 5b60803a5..1fb80a3d1 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -902,12 +902,6 @@ create_authenticator(ConfKeyPath, ChainName, Config) -> raw_config := AuthenticatorsConfig }} -> {ok, AuthenticatorConfig} = find_config(ID, AuthenticatorsConfig), - ok = emqx_plugin_libs_metrics:create_metrics( - authn_metrics, - ID, - [matched, success, failed, ignore], - [matched] - ), {200, maps:put(id, ID, convert_certs(fill_defaults(AuthenticatorConfig)))}; {error, {_PrePostConfigUpdate, emqx_authentication, Reason}} -> serialize_error(Reason);