diff --git a/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf b/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf index 2dc4999f2..371939daa 100644 --- a/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf +++ b/apps/emqx_authn/i18n/emqx_authn_schema_i18n.conf @@ -163,37 +163,4 @@ emqx_authn_schema { zh: """节点名称。""" } } - - ignore { - desc { - en: """Not match any rules.""" - zh: """没有匹配到任何规则。""" - } - label: { - en: """Not Match Any Rules""" - zh: """没有匹配到任何规则。""" - } - } - - allow { - desc { - en: """Authorize allow.""" - zh: """鉴权成功。""" - } - label: { - en: """Authorize Allow""" - zh: """鉴权成功""" - } - } - - deny { - desc { - en: """Authorize Deny.""" - zh: """鉴权失败""" - } - label: { - en: """Authorize Deny""" - zh: """鉴权失败""" - } - } } diff --git a/apps/emqx_authn/src/emqx_authn_schema.erl b/apps/emqx_authn/src/emqx_authn_schema.erl index 99f81adb6..ffcd2eeff 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -89,45 +89,41 @@ 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")} - )} - ] ++ common_metrics_field(); -fields("metrics_status_fields_authz") -> - [ - {"metrics", mk(ref(?MODULE, "metrics_authz"), #{desc => ?DESC("metrics")})}, - {"node_metrics", + )}, + {"status", mk(cluster_status(), #{desc => ?DESC("status")})}, + {"node_status", mk( - hoconsc:array(ref(?MODULE, "node_metrics_authz")), - #{desc => ?DESC("node_metrics")} + hoconsc:array(ref(?MODULE, "node_status")), + #{desc => ?DESC("node_status")} + )}, + {"node_error", + mk( + hoconsc:array(ref(?MODULE, "node_error")), + #{desc => ?DESC("node_error")} )} - ] ++ common_metrics_field(); + ]; fields("metrics") -> [ {"ignore", mk(integer(), #{desc => ?DESC("failed")})} ] ++ common_field(); -fields("metrics_authz") -> - [ - {"matched", mk(integer(), #{desc => ?DESC("matched")})}, - {"allow", mk(integer(), #{desc => ?DESC("allow")})}, - {"deny", mk(integer(), #{desc => ?DESC("deny")})}, - {"ignore", mk(float(), #{desc => ?DESC("ignore")})} - ]; +fields("resource_metrics") -> + common_field(); fields("node_metrics") -> [ node_name(), {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})} ]; -fields("node_metrics_authz") -> - [ - node_name(), - {"metrics", mk(ref(?MODULE, "metrics_authz"), #{desc => ?DESC("metrics")})} - ]; -fields("resource_metrics") -> - common_field(); fields("node_resource_metrics") -> [ node_name(), @@ -154,27 +150,6 @@ common_field() -> {"rate_last5m", mk(float(), #{desc => ?DESC("rate_last5m")})} ]. -common_metrics_field() -> - [ - {"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")} - )}, - {"status", mk(cluster_status(), #{desc => ?DESC("status")})}, - {"node_status", - mk( - hoconsc:array(ref(?MODULE, "node_status")), - #{desc => ?DESC("node_status")} - )}, - {"node_error", - mk( - hoconsc:array(ref(?MODULE, "node_error")), - #{desc => ?DESC("node_error")} - )} - ]. - status() -> hoconsc:enum([connected, disconnected, connecting]). diff --git a/apps/emqx_authz/i18n/emqx_authz_schema_i18n.conf b/apps/emqx_authz/i18n/emqx_authz_schema_i18n.conf index 43b3f26bf..ee551df20 100644 --- a/apps/emqx_authz/i18n/emqx_authz_schema_i18n.conf +++ b/apps/emqx_authz/i18n/emqx_authz_schema_i18n.conf @@ -392,4 +392,171 @@ Commands can support following wildcards:\n zh: """查询语句""" } } + +#==== metrics field + + metrics { + desc { + en: """The metrics of the resource.""" + zh: """资源统计指标。""" + } + label: { + en: """Metrics""" + zh: """指标""" + } + } + + node_metrics { + desc { + en: """The metrics of the resource for each node.""" + zh: """每个节点上资源的统计指标。""" + } + label: { + en: """Resource Metrics in Node""" + zh: """节点资源指标""" + } + } + + status { + desc { + en: """The status of the resource.""" + zh: """资源状态。""" + } + label: { + en: """Status""" + zh: """状态""" + } + } + + node_status { + desc { + en: """The status of the resource for each node.""" + zh: """每个节点上资源的状态。""" + } + label: { + en: """Resource Status in Node""" + zh: """节点资源状态""" + } + } + + node_error { + desc { + en: """The error of node.""" + zh: """节点上产生的错误。""" + } + label: { + en: """Error in Node""" + zh: """节点产生的错误""" + } + } + + matched { + desc { + en: """Count of this resource is queried.""" + zh: """请求命中次数。""" + } + label: { + en: """Matched""" + zh: """已命中""" + } + } + + success { + desc { + en: """Count of query success.""" + zh: """请求成功次数。""" + } + label: { + en: """Success""" + zh: """成功""" + } + } + + failed { + desc { + en: """Count of query failed.""" + zh: """请求失败次数。""" + } + label: { + en: """Failed""" + zh: """失败""" + } + } + + rate { + desc { + en: """The rate of matched, times/second.""" + zh: """命中速率,单位:次/秒。""" + } + label: { + en: """Rate""" + zh: """速率""" + } + } + + rate_max { + desc { + en: """The max rate of matched, times/second.""" + zh: """最大命中速率,单位:次/秒。""" + } + label: { + en: """Max Rate""" + zh: """最大速率""" + } + } + + rate_last5m { + desc { + en: """The average rate of matched in the last 5 minutes, times/second.""" + zh: """5分钟内平均命中速率,单位:次/秒。""" + } + label: { + en: """Rate in Last 5min""" + zh: """5分钟内速率""" + } + } + + node { + desc { + en: """Node name.""" + zh: """节点名称。""" + } + label: { + en: """Node Name.""" + zh: """节点名称。""" + } + } + + ignore { + desc { + en: """Not match any rules.""" + zh: """没有匹配到任何规则。""" + } + label: { + en: """Not Match Any Rules""" + zh: """没有匹配到任何规则。""" + } + } + + allow { + desc { + en: """Authorize allow.""" + zh: """鉴权成功。""" + } + label: { + en: """Authorize Allow""" + zh: """鉴权成功""" + } + } + + deny { + desc { + en: """Authorize Deny.""" + zh: """鉴权失败""" + } + label: { + en: """Authorize Deny""" + zh: """鉴权失败""" + } + } } diff --git a/apps/emqx_authz/src/emqx_authz_api_sources.erl b/apps/emqx_authz/src/emqx_authz_api_sources.erl index 3c7e8e4a1..3fcb9d922 100644 --- a/apps/emqx_authz/src/emqx_authz_api_sources.erl +++ b/apps/emqx_authz/src/emqx_authz_api_sources.erl @@ -143,7 +143,7 @@ schema("/authorization/sources/:type/status") -> responses => #{ 200 => emqx_dashboard_swagger:schema_with_examples( - hoconsc:ref(emqx_authn_schema, "metrics_status_fields_authz"), + hoconsc:ref(emqx_authz_schema, "metrics_status_fields"), status_metrics_example() ), 400 => emqx_dashboard_swagger:error_codes( diff --git a/apps/emqx_authz/src/emqx_authz_schema.erl b/apps/emqx_authz/src/emqx_authz_schema.erl index f61bd258d..e34a8e8d7 100644 --- a/apps/emqx_authz/src/emqx_authz_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_schema.erl @@ -19,6 +19,7 @@ -include("emqx_authz.hrl"). -include_lib("hocon/include/hoconsc.hrl"). -include_lib("emqx_connector/include/emqx_connector.hrl"). +-import(hoconsc, [mk/2, ref/2]). -reflect_type([ permission/0, @@ -134,7 +135,81 @@ fields(jwt) -> default => <<"acl">>, desc => ?DESC(acl_claim_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(cluster_status(), #{desc => ?DESC("status")})}, + {"node_status", + 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") -> + [ + {"matched", mk(integer(), #{desc => ?DESC("matched")})}, + {"allow", mk(integer(), #{desc => ?DESC("allow")})}, + {"deny", mk(integer(), #{desc => ?DESC("deny")})}, + {"ignore", mk(float(), #{desc => ?DESC("ignore")})} + ]; +fields("node_metrics") -> + [ + node_name(), + {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})} + ]; +fields("resource_metrics") -> + common_field(); +fields("node_resource_metrics") -> + [ + node_name(), + {"metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})} + ]; +fields("node_status") -> + [ + node_name(), + {"status", mk(status(), #{desc => ?DESC("node_status")})} + ]; +fields("node_error") -> + [ + node_name(), + {"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]). + +cluster_status() -> + hoconsc:enum([connected, disconnected, connecting, inconsistent]). + +node_name() -> + {"node", mk(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}. desc(?CONF_NS) -> ?DESC(?CONF_NS);