diff --git a/apps/emqx_management/src/emqx_mgmt_api_clients.erl b/apps/emqx_management/src/emqx_mgmt_api_clients.erl index b006a4a49..a4e307114 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_clients.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_clients.erl @@ -78,143 +78,64 @@ schemas() -> Client = #{ client => #{ type => object, - properties => #{ - node => #{ - type => string, - description => <<"Name of the node to which the client is connected">>}, - clientid => #{ - type => string, - description => <<"Client identifier">>}, - username => #{ - type => string, - description => <<"User name of client when connecting">>}, - proto_name => #{ - type => string, - description => <<"Client protocol name">>}, - proto_ver => #{ - type => integer, - description => <<"Protocol version used by the client">>}, - ip_address => #{ - type => string, - description => <<"Client's IP address">>}, - is_bridge => #{ - type => boolean, - description => <<"Indicates whether the client is connectedvia bridge">>}, - connected_at => #{ - type => string, - description => <<"Client connection time">>}, - disconnected_at => #{ - type => string, - description => <<"Client offline time, This field is only valid and returned when connected is false">>}, - connected => #{ - type => boolean, - description => <<"Whether the client is connected">>}, - will_msg => #{ - type => string, - description => <<"Client will message">>}, - zone => #{ - type => string, - description => <<"Indicate the configuration group used by the client">>}, - keepalive => #{ - type => integer, - description => <<"keepalive time, with the unit of second">>}, - clean_start => #{ - type => boolean, - description => <<"Indicate whether the client is using a brand new session">>}, - expiry_interval => #{ - type => integer, - description => <<"Session expiration interval, with the unit of second">>}, - created_at => #{ - type => string, - description => <<"Session creation time">>}, - subscriptions_cnt => #{ - type => integer, - description => <<"Number of subscriptions established by this client.">>}, - subscriptions_max => #{ - type => integer, - description => <<"v4 api name [max_subscriptions] Maximum number of subscriptions allowed by this client">>}, - inflight_cnt => #{ - type => integer, - description => <<"Current length of inflight">>}, - inflight_max => #{ - type => integer, - description => <<"v4 api name [max_inflight]. Maximum length of inflight">>}, - mqueue_len => #{ - type => integer, - description => <<"Current length of message queue">>}, - mqueue_max => #{ - type => integer, - description => <<"v4 api name [max_mqueue]. Maximum length of message queue">>}, - mqueue_dropped => #{ - type => integer, - description => <<"Number of messages dropped by the message queue due to exceeding the length">>}, - awaiting_rel_cnt => #{ - type => integer, - description => <<"v4 api name [awaiting_rel] Number of awaiting PUBREC packet">>}, - awaiting_rel_max => #{ - type => integer, - description => <<"v4 api name [max_awaiting_rel]. Maximum allowed number of awaiting PUBREC packet">>}, - recv_oct => #{ - type => integer, - description => <<"Number of bytes received by EMQ X Broker (the same below)">>}, - recv_cnt => #{ - type => integer, - description => <<"Number of TCP packets received">>}, - recv_pkt => #{ - type => integer, - description => <<"Number of MQTT packets received">>}, - recv_msg => #{ - type => integer, - description => <<"Number of PUBLISH packets received">>}, - send_oct => #{ - type => integer, - description => <<"Number of bytes sent">>}, - send_cnt => #{ - type => integer, - description => <<"Number of TCP packets sent">>}, - send_pkt => #{ - type => integer, - description => <<"Number of MQTT packets sent">>}, - send_msg => #{ - type => integer, - description => <<"Number of PUBLISH packets sent">>}, - mailbox_len => #{ - type => integer, - description => <<"Process mailbox size">>}, - heap_size => #{ - type => integer, - description => <<"Process heap size with the unit of byte">> - }, - reductions => #{ - type => integer, - description => <<"Erlang reduction">>} - } + properties => emqx_mgmt_util:properties(properties(client)) } - }, + }, AuthzCache = #{ authz_cache => #{ type => object, - properties => #{ - topic => #{ - type => string, - description => <<"Topic name">>}, - access => #{ - type => string, - enum => [<<"subscribe">>, <<"publish">>], - description => <<"Access type">>}, - result => #{ - type => string, - enum => [<<"allow">>, <<"deny">>], - default => <<"allow">>, - description => <<"Allow or deny">>}, - updated_time => #{ - type => integer, - description => <<"Update time">>} - } + properties => emqx_mgmt_util:properties(properties(authz_cache)) } }, [Client, AuthzCache]. +properties(client) -> + [ + {awaiting_rel_cnt, integer, <<"v4 api name [awaiting_rel] Number of awaiting PUBREC packet">>}, + {awaiting_rel_max, integer, <<"v4 api name [max_awaiting_rel]. Maximum allowed number of awaiting PUBREC packet">>}, + {clean_start, boolean, <<"Indicate whether the client is using a brand new session">>}, + {clientid, string , <<"Client identifier">>}, + {connected, boolean, <<"Whether the client is connected">>}, + {connected_at, string , <<"Client connection time">>}, + {created_at, string , <<"Session creation time">>}, + {disconnected_at, string , <<"Client offline time, This field is only valid and returned when connected is false">>}, + {expiry_interval, integer, <<"Session expiration interval, with the unit of second">>}, + {heap_size, integer, <<"Process heap size with the unit of byte">>}, + {inflight_cnt, integer, <<"Current length of inflight">>}, + {inflight_max, integer, <<"v4 api name [max_inflight]. Maximum length of inflight">>}, + {ip_address, string , <<"Client's IP address">>}, + {is_bridge, boolean, <<"Indicates whether the client is connectedvia bridge">>}, + {keepalive, integer, <<"keepalive time, with the unit of second">>}, + {mailbox_len, integer, <<"Process mailbox size">>}, + {mqueue_dropped, integer, <<"Number of messages dropped by the message queue due to exceeding the length">>}, + {mqueue_len, integer, <<"Current length of message queue">>}, + {mqueue_max, integer, <<"v4 api name [max_mqueue]. Maximum length of message queue">>}, + {node, string , <<"Name of the node to which the client is connected">>}, + {proto_name, string , <<"Client protocol name">>}, + {proto_ver, integer, <<"Protocol version used by the client">>}, + {recv_cnt, integer, <<"Number of TCP packets received">>}, + {recv_msg, integer, <<"Number of PUBLISH packets received">>}, + {recv_oct, integer, <<"Number of bytes received by EMQ X Broker (the same below)">>}, + {recv_pkt, integer, <<"Number of MQTT packets received">>}, + {reductions, integer, <<"Erlang reduction">>}, + {send_cnt, integer, <<"Number of TCP packets sent">>}, + {send_msg, integer, <<"Number of PUBLISH packets sent">>}, + {send_oct, integer, <<"Number of bytes sent">>}, + {send_pkt, integer, <<"Number of MQTT packets sent">>}, + {subscriptions_cnt, integer, <<"Number of subscriptions established by this client.">>}, + {subscriptions_max, integer, <<"v4 api name [max_subscriptions] Maximum number of subscriptions allowed by this client">>}, + {username, string , <<"User name of client when connecting">>}, + {will_msg, string , <<"Client will message">>}, + {zone, string , <<"Indicate the configuration group used by the client">>} + ]; +properties(authz_cache) -> + [ + {access, string, <<"Access type">>}, + {result, string, <<"Allow or deny">>}, + {topic, string, <<"Topic name">>}, + {updated_time, integer, <<"Update time">>} + ]. + clients_api() -> Metadata = #{ get => #{ diff --git a/apps/emqx_management/src/emqx_mgmt_api_metrics.erl b/apps/emqx_management/src/emqx_mgmt_api_metrics.erl index eae9cd76b..2795fe342 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_metrics.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_metrics.erl @@ -28,271 +28,107 @@ api_spec() -> metrics_schema() -> Metric = #{ type => object, - properties => properties() + properties => emqx_mgmt_util:properties(properties()) }, Metrics = #{ type => array, items => #{ type => object, - properties => properties() + properties => emqx_mgmt_util:properties([{node, string} | properties()]) } }, MetricsInfo = #{ - oneOf => [ minirest:ref(<<"metric">>) - , minirest:ref(<<"metrics">>) + oneOf => [ minirest:ref(metric) + , minirest:ref(metrics) ] }, #{metric => Metric, metrics => Metrics, metrics_info => MetricsInfo}. properties() -> - #{ - 'actions.failure' => #{ - type => integer, - description => <<"Number of failure executions of the rule engine action">>}, - 'actions.success' => #{ - type => integer, - description => <<"Number of successful executions of the rule engine action">>}, - 'bytes.received' => #{ - type => integer, - description => <<"Number of bytes received by EMQ X Broker">>}, - 'bytes.sent' => #{ - type => integer, - description => <<"Number of bytes sent by EMQ X Broker on this connection">>}, - 'client.authenticate' => #{ - type => integer, - description => <<"Number of client authentications">>}, - 'client.auth.anonymous' => #{ - type => integer, - description => <<"Number of clients who log in anonymously">>}, - 'client.connect' => #{ - type => integer, - description => <<"Number of client connections">>}, - 'client.connack' => #{ - type => integer, - description => <<"Number of CONNACK packet sent">>}, - 'client.connected' => #{ - type => integer, - description => <<"Number of successful client connections">>}, - 'client.disconnected' => #{ - type => integer, - description => <<"Number of client disconnects">>}, - 'client.check_authz' => #{ - type => integer, - description => <<"Number of Authorization rule checks">>}, - 'client.subscribe' => #{ - type => integer, - description => <<"Number of client subscriptions">>}, - 'client.unsubscribe' => #{ - type => integer, - description => <<"Number of client unsubscriptions">>}, - 'delivery.dropped.too_large' => #{ - type => integer, - description => <<"The number of messages that were dropped because the length exceeded the limit when sending">>}, - 'delivery.dropped.queue_full' => #{ - type => integer, - description => <<"Number of messages with a non-zero QoS that were dropped because the message queue was full when sending">>}, - 'delivery.dropped.qos0_msg' => #{ - type => integer, - description => <<"Number of messages with QoS 0 that were dropped because the message queue was full when sending">>}, - 'delivery.dropped.expired' => #{ - type => integer, - description => <<"Number of messages dropped due to message expiration on sending">>}, - 'delivery.dropped.no_local' => #{ - type => integer, - description => <<"Number of messages that were dropped due to the No Local subscription option when sending">>}, - 'delivery.dropped' => #{ - type => integer, - description => <<"Total number of discarded messages when sending">>}, - 'messages.delayed' => #{ - type => integer, - description => <<"Number of delay- published messages stored by EMQ X Broker">>}, - 'messages.delivered' => #{ - type => integer, - description => <<"Number of messages forwarded to the subscription process internally by EMQ X Broker">>}, - 'messages.dropped' => #{ - type => integer, - description => <<"Total number of messages dropped by EMQ X Broker before forwarding to the subscription process">>}, - 'messages.dropped.expired' => #{ - type => integer, - description => <<"Number of messages dropped due to message expiration when receiving">>}, - 'messages.dropped.no_subscribers' => #{ - type => integer, - description => <<"Number of messages dropped due to no subscribers">>}, - 'messages.forward' => #{ - type => integer, - description => <<"Number of messages forwarded to other nodes">>}, - 'messages.publish' => #{ - type => integer, - description => <<"Number of messages published in addition to system messages">>}, - 'messages.qos0.received' => #{ - type => integer, - description => <<"Number of QoS 0 messages received from clients">>}, - 'messages.qos1.received' => #{ - type => integer, - description => <<"Number of QoS 1 messages received from clients">>}, - 'messages.qos2.received' => #{ - type => integer, - description => <<"Number of QoS 2 messages received from clients">>}, - 'messages.qos0.sent' => #{ - type => integer, - description => <<"Number of QoS 0 messages sent to clients">>}, - 'messages.qos1.sent' => #{ - type => integer, - description => <<"Number of QoS 1 messages sent to clients">>}, - 'messages.qos2.sent' => #{ - type => integer, - description => <<"Number of QoS 2 messages sent to clients">>}, - 'messages.received' => #{ - type => integer, - description => <<"Number of messages received from the client, equal to the sum of messages.qos0.received,messages.qos1.received and messages.qos2.received">>}, - 'messages.sent' => #{ - type => integer, - description => <<"Number of messages sent to the client, equal to the sum of messages.qos0.sent,messages.qos1.sent and messages.qos2.sent">>}, - 'messages.retained' => #{ - type => integer, - description => <<"Number of retained messages stored by EMQ X Broker">>}, - 'messages.acked' => #{ - type => integer, - description => <<"Number of received PUBACK and PUBREC packet">>}, - 'packets.received' => #{ - type => integer, - description => <<"Number of received packet">>}, - 'packets.sent' => #{ - type => integer, - description => <<"Number of sent packet">>}, - 'packets.connect.received' => #{ - type => integer, - description => <<"Number of received CONNECT packet">>}, - 'packets.connack.auth_error' => #{ - type => integer, - description => <<"Number of received CONNECT packet with failed authentication">>}, - 'packets.connack.error' => #{ - type => integer, - description => <<"Number of received CONNECT packet with unsuccessful connections">>}, - 'packets.connack.sent' => #{ - type => integer, - description => <<"Number of sent CONNACK packet">>}, - 'packets.publish.received' => #{ - type => integer, - description => <<"Number of received PUBLISH packet">>}, - 'packets.publish.sent' => #{ - type => integer, - description => <<"Number of sent PUBLISH packet">>}, - 'packets.publish.inuse' => #{ - type => integer, - description => <<"Number of received PUBLISH packet with occupied identifiers">>}, - 'packets.publish.auth_error' => #{ - type => integer, - description => <<"Number of received PUBLISH packets with failed the Authorization check">>}, - 'packets.publish.error' => #{ - type => integer, - description => <<"Number of received PUBLISH packet that cannot be published">>}, - 'packets.publish.dropped' => #{ - type => integer, - description => <<"Number of messages discarded due to the receiving limit">>}, - 'packets.puback.received' => #{ - type => integer, - description => <<"Number of received PUBACK packet">>}, - 'packets.puback.sent' => #{ - type => integer, - description => <<"Number of sent PUBACK packet">>}, - 'packets.puback.inuse' => #{ - type => integer, - description => <<"Number of received PUBACK packet with occupied identifiers">>}, - 'packets.puback.missed' => #{ - type => integer, - description => <<"Number of received packet with identifiers.">>}, - 'packets.pubrec.received' => #{ - type => integer, - description => <<"Number of received PUBREC packet">>}, - 'packets.pubrec.sent' => #{ - type => integer, - description => <<"Number of sent PUBREC packet">>}, - 'packets.pubrec.inuse' => #{ - type => integer, - description => <<"Number of received PUBREC packet with occupied identifiers">>}, - 'packets.pubrec.missed' => #{ - type => integer, - description => <<"Number of received PUBREC packet with unknown identifiers">>}, - 'packets.pubrel.received' => #{ - type => integer, - description => <<"Number of received PUBREL packet">>}, - 'packets.pubrel.sent' => #{ - type => integer, - description => <<"Number of sent PUBREL packet">>}, - 'packets.pubrel.missed' => #{ - type => integer, - description => <<"Number of received PUBREC packet with unknown identifiers">>}, - 'packets.pubcomp.received' => #{ - type => integer, - description => <<"Number of received PUBCOMP packet">>}, - 'packets.pubcomp.sent' => #{ - type => integer, - description => <<"Number of sent PUBCOMP packet">>}, - 'packets.pubcomp.inuse' => #{ - type => integer, - description => <<"Number of received PUBCOMP packet with occupied identifiers">>}, - 'packets.pubcomp.missed' => #{ - type => integer, - description => <<"Number of missed PUBCOMP packet">>}, - 'packets.subscribe.received' => #{ - type => integer, - description => <<"Number of received SUBSCRIBE packet">>}, - 'packets.subscribe.error' => #{ - type => integer, - description => <<"Number of received SUBSCRIBE packet with failed subscriptions">>}, - 'packets.subscribe.auth_error' => #{ - type => integer, - description => <<"Number of received SUBACK packet with failed Authorization check">>}, - 'packets.suback.sent' => #{ - type => integer, - description => <<"Number of sent SUBACK packet">>}, - 'packets.unsubscribe.received' => #{ - type => integer, - description => <<"Number of received UNSUBSCRIBE packet">>}, - 'packets.unsubscribe.error' => #{ - type => integer, - description => <<"Number of received UNSUBSCRIBE packet with failed unsubscriptions">>}, - 'packets.unsuback.sent' => #{ - type => integer, - description => <<"Number of sent UNSUBACK packet">>}, - 'packets.pingreq.received' => #{ - type => integer, - description => <<"Number of received PINGREQ packet">>}, - 'packets.pingresp.sent' => #{ - type => integer, - description => <<"Number of sent PUBRESP packet">>}, - 'packets.disconnect.received' => #{ - type => integer, - description => <<"Number of received DISCONNECT packet">>}, - 'packets.disconnect.sent' => #{ - type => integer, - description => <<"Number of sent DISCONNECT packet">>}, - 'packets.auth.received' => #{ - type => integer, - description => <<"Number of received AUTH packet">>}, - 'packets.auth.sent' => #{ - type => integer, - description => <<"Number of sent AUTH packet">>}, - 'rules.matched' => #{ - type => integer, - description => <<"Number of rule matched">>}, - 'session.created' => #{ - type => integer, - description => <<"Number of sessions created">>}, - 'session.discarded' => #{ - type => integer, - description => <<"Number of sessions dropped because Clean Session or Clean Start is true">>}, - 'session.resumed' => #{ - type => integer, - description => <<"Number of sessions resumed because Clean Session or Clean Start is false">>}, - 'session.takeovered' => #{ - type => integer, - description => <<"Number of sessions takeovered because Clean Session or Clean Start is false">>}, - 'session.terminated' => #{ - type => integer, - description => <<"Number of terminated sessions">>} - }. + [ + {'actions.failure', integer, <<"Number of failure executions of the rule engine action">>}, + {'actions.success', integer, <<"Number of successful executions of the rule engine action">>}, + {'bytes.received', integer, <<"Number of bytes received by EMQ X Broker">>}, + {'bytes.sent', integer, <<"Number of bytes sent by EMQ X Broker on this connection">>}, + {'client.auth.anonymous', integer, <<"Number of clients who log in anonymously">>}, + {'client.authenticate', integer, <<"Number of client authentications">>}, + {'client.check_authz', integer, <<"Number of Authorization rule checks">>}, + {'client.connack', integer, <<"Number of CONNACK packet sent">>}, + {'client.connect', integer, <<"Number of client connections">>}, + {'client.connected', integer, <<"Number of successful client connections">>}, + {'client.disconnected', integer, <<"Number of client disconnects">>}, + {'client.subscribe', integer, <<"Number of client subscriptions">>}, + {'client.unsubscribe', integer, <<"Number of client unsubscriptions">>}, + {'delivery.dropped', integer, <<"Total number of discarded messages when sending">>}, + {'delivery.dropped.expired', integer, <<"Number of messages dropped due to message expiration on sending">>}, + {'delivery.dropped.no_local', integer, <<"Number of messages that were dropped due to the No Local subscription option when sending">>}, + {'delivery.dropped.qos0_msg', integer, <<"Number of messages with QoS 0 that were dropped because the message queue was full when sending">>}, + {'delivery.dropped.queue_full', integer, <<"Number of messages with a non-zero QoS that were dropped because the message queue was full when sending">>}, + {'delivery.dropped.too_large', integer, <<"The number of messages that were dropped because the length exceeded the limit when sending">>}, + {'messages.acked', integer, <<"Number of received PUBACK and PUBREC packet">>}, + {'messages.delayed', integer, <<"Number of delay- published messages stored by EMQ X Broker">>}, + {'messages.delivered', integer, <<"Number of messages forwarded to the subscription process internally by EMQ X Broker">>}, + {'messages.dropped', integer, <<"Total number of messages dropped by EMQ X Broker before forwarding to the subscription process">>}, + {'messages.dropped.expired', integer, <<"Number of messages dropped due to message expiration when receiving">>}, + {'messages.dropped.no_subscribers', integer, <<"Number of messages dropped due to no subscribers">>}, + {'messages.forward', integer, <<"Number of messages forwarded to other nodes">>}, + {'messages.publish', integer, <<"Number of messages published in addition to system messages">>}, + {'messages.qos0.received', integer, <<"Number of QoS 0 messages received from clients">>}, + {'messages.qos0.sent', integer, <<"Number of QoS 0 messages sent to clients">>}, + {'messages.qos1.received', integer, <<"Number of QoS 1 messages received from clients">>}, + {'messages.qos1.sent', integer, <<"Number of QoS 1 messages sent to clients">>}, + {'messages.qos2.received', integer, <<"Number of QoS 2 messages received from clients">>}, + {'messages.qos2.sent', integer, <<"Number of QoS 2 messages sent to clients">>}, + {'messages.received', integer, <<"Number of messages received from the client, equal to the sum of messages.qos0.received\fmessages.qos1.received and messages.qos2.received">>}, + {'messages.retained', integer, <<"Number of retained messages stored by EMQ X Broker">>}, + {'messages.sent', integer, <<"Number of messages sent to the client, equal to the sum of messages.qos0.sent\fmessages.qos1.sent and messages.qos2.sent">>}, + {'packets.auth.received', integer, <<"Number of received AUTH packet">>}, + {'packets.auth.sent', integer, <<"Number of sent AUTH packet">>}, + {'packets.connack.auth_error', integer, <<"Number of received CONNECT packet with failed authentication">>}, + {'packets.connack.error', integer, <<"Number of received CONNECT packet with unsuccessful connections">>}, + {'packets.connack.sent', integer, <<"Number of sent CONNACK packet">>}, + {'packets.connect.received', integer, <<"Number of received CONNECT packet">>}, + {'packets.disconnect.received', integer, <<"Number of received DISCONNECT packet">>}, + {'packets.disconnect.sent', integer, <<"Number of sent DISCONNECT packet">>}, + {'packets.pingreq.received', integer, <<"Number of received PINGREQ packet">>}, + {'packets.pingresp.sent', integer, <<"Number of sent PUBRESP packet">>}, + {'packets.puback.inuse', integer, <<"Number of received PUBACK packet with occupied identifiers">>}, + {'packets.puback.missed', integer, <<"Number of received packet with identifiers.">>}, + {'packets.puback.received', integer, <<"Number of received PUBACK packet">>}, + {'packets.puback.sent', integer, <<"Number of sent PUBACK packet">>}, + {'packets.pubcomp.inuse', integer, <<"Number of received PUBCOMP packet with occupied identifiers">>}, + {'packets.pubcomp.missed', integer, <<"Number of missed PUBCOMP packet">>}, + {'packets.pubcomp.received', integer, <<"Number of received PUBCOMP packet">>}, + {'packets.pubcomp.sent', integer, <<"Number of sent PUBCOMP packet">>}, + {'packets.publish.auth_error', integer, <<"Number of received PUBLISH packets with failed the Authorization check">>}, + {'packets.publish.dropped', integer, <<"Number of messages discarded due to the receiving limit">>}, + {'packets.publish.error', integer, <<"Number of received PUBLISH packet that cannot be published">>}, + {'packets.publish.inuse', integer, <<"Number of received PUBLISH packet with occupied identifiers">>}, + {'packets.publish.received', integer, <<"Number of received PUBLISH packet">>}, + {'packets.publish.sent', integer, <<"Number of sent PUBLISH packet">>}, + {'packets.pubrec.inuse', integer, <<"Number of received PUBREC packet with occupied identifiers">>}, + {'packets.pubrec.missed', integer, <<"Number of received PUBREC packet with unknown identifiers">>}, + {'packets.pubrec.received', integer, <<"Number of received PUBREC packet">>}, + {'packets.pubrec.sent', integer, <<"Number of sent PUBREC packet">>}, + {'packets.pubrel.missed', integer, <<"Number of received PUBREC packet with unknown identifiers">>}, + {'packets.pubrel.received', integer, <<"Number of received PUBREL packet">>}, + {'packets.pubrel.sent', integer, <<"Number of sent PUBREL packet">>}, + {'packets.received', integer, <<"Number of received packet">>}, + {'packets.sent', integer, <<"Number of sent packet">>}, + {'packets.suback.sent', integer, <<"Number of sent SUBACK packet">>}, + {'packets.subscribe.auth_error', integer, <<"Number of received SUBACK packet with failed Authorization check">>}, + {'packets.subscribe.error', integer, <<"Number of received SUBSCRIBE packet with failed subscriptions">>}, + {'packets.subscribe.received', integer, <<"Number of received SUBSCRIBE packet">>}, + {'packets.unsuback.sent', integer, <<"Number of sent UNSUBACK packet">>}, + {'packets.unsubscribe.error', integer, <<"Number of received UNSUBSCRIBE packet with failed unsubscriptions">>}, + {'packets.unsubscribe.received', integer, <<"Number of received UNSUBSCRIBE packet">>}, + {'rules.matched', integer, <<"Number of rule matched">>}, + {'session.created', integer, <<"Number of sessions created">>}, + {'session.discarded', integer, <<"Number of sessions dropped because Clean Session or Clean Start is true">>}, + {'session.resumed', integer, <<"Number of sessions resumed because Clean Session or Clean Start is false">>}, + {'session.takeovered', integer, <<"Number of sessions takeovered because Clean Session or Clean Start is false">>}, + {'session.terminated', integer, <<"Number of terminated sessions">>} + ]. metrics_api() -> Metadata = #{ diff --git a/apps/emqx_management/src/emqx_mgmt_api_stats.erl b/apps/emqx_management/src/emqx_mgmt_api_stats.erl index d01e4f0c0..470b5fda1 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_stats.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_stats.erl @@ -29,83 +29,43 @@ stats_schema() -> type => array, items => #{ type => object, - properties => maps:put('node', #{type => string, description => <<"Node">>}, properties()) + properties => emqx_mgmt_util:properties([{'node', string} | properties()]) } }, Stat = #{ type => object, - properties => properties() + properties => emqx_mgmt_util:properties(properties()) }, StatsInfo =#{ - oneOf => [ minirest:ref(<<"stats">>) - , minirest:ref(<<"stat">>) + oneOf => [ minirest:ref(stats) + , minirest:ref(stat) ] }, [#{stats => Stats, stat => Stat, stats_info => StatsInfo}]. properties() -> - #{ - 'connections.count' => #{ - type => integer, - description => <<"Number of current connections">>}, - 'connections.max' => #{ - type => integer, - description => <<"Historical maximum number of connections">>}, - 'channels.count' => #{ - type => integer, - description => <<"sessions.count">>}, - 'channels.max' => #{ - type => integer, - description => <<"session.max">>}, - 'sessions.count' => #{ - type => integer, - description => <<"Number of current sessions">>}, - 'sessions.max' => #{ - type => integer, - description => <<"Historical maximum number of sessions">>}, - 'topics.count' => #{ - type => integer, - description => <<"Number of current topics">>}, - 'topics.max' => #{ - type => integer, - description => <<"Historical maximum number of topics">>}, - 'suboptions.count' => #{ - type => integer, - description => <<"subscriptions.count">>}, - 'suboptions.max' => #{ - type => integer, - description => <<"subscriptions.max">>}, - 'subscribers.count' => #{ - type => integer, - description => <<"Number of current subscribers">>}, - 'subscribers.max' => #{ - type => integer, - description => <<"Historical maximum number of subscribers">>}, - 'subscriptions.count' => #{ - type => integer, - description => <<"Number of current subscriptions, including shared subscriptions">>}, - 'subscriptions.max' => #{ - type => integer, - description => <<"Historical maximum number of subscriptions">>}, - 'subscriptions.shared.count' => #{ - type => integer, - description => <<"Number of current shared subscriptions">>}, - 'subscriptions.shared.max' => #{ - type => integer, - description => <<"Historical maximum number of shared subscriptions">>}, - 'routes.count' => #{ - type => integer, - description => <<"Number of current routes">>}, - 'routes.max' => #{ - type => integer, - description => <<"Historical maximum number of routes">>}, - 'retained.count' => #{ - type => integer, - description => <<"Number of currently retained messages">>}, - 'retained.max' => #{ - type => integer, - description => <<"Historical maximum number of retained messages">>} - }. + [ + {'channels.count', integer, <<"sessions.count">>}, + {'channels.max', integer, <<"session.max">>}, + {'connections.count', integer, <<"Number of current connections">>}, + {'connections.max', integer, <<"Historical maximum number of connections">>}, + {'retained.count', integer, <<"Number of currently retained messages">>}, + {'retained.max', integer, <<"Historical maximum number of retained messages">>}, + {'routes.count', integer, <<"Number of current routes">>}, + {'routes.max', integer, <<"Historical maximum number of routes">>}, + {'sessions.count', integer, <<"Number of current sessions">>}, + {'sessions.max', integer, <<"Historical maximum number of sessions">>}, + {'suboptions.count', integer, <<"subscriptions.count">>}, + {'suboptions.max', integer, <<"subscriptions.max">>}, + {'subscribers.count', integer, <<"Number of current subscribers">>}, + {'subscribers.max', integer, <<"Historical maximum number of subscribers">>}, + {'subscriptions.count', integer, <<"Number of current subscriptions, including shared subscriptions">>}, + {'subscriptions.max', integer, <<"Historical maximum number of subscriptions">>}, + {'subscriptions.shared.count', integer, <<"Number of current shared subscriptions">>}, + {'subscriptions.shared.max', integer, <<"Historical maximum number of shared subscriptions">>}, + {'topics.count', integer, <<"Number of current topics">>}, + {'topics.max', integer, <<"Historical maximum number of topics">>} + ]. stats_api() -> Metadata = #{