diff --git a/apps/emqx_dashboard/include/emqx_dashboard.hrl b/apps/emqx_dashboard/include/emqx_dashboard.hrl index fe727ef7f..095229c53 100644 --- a/apps/emqx_dashboard/include/emqx_dashboard.hrl +++ b/apps/emqx_dashboard/include/emqx_dashboard.hrl @@ -61,7 +61,8 @@ -define(GAUGE_SAMPLER_LIST, [ subscriptions, topics, - connections + connections, + live_connections ]). -define(SAMPLER_LIST, ?GAUGE_SAMPLER_LIST ++ ?DELTA_SAMPLER_LIST). diff --git a/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl b/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl index 019feff51..97d648d59 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl @@ -401,6 +401,7 @@ getstats(Key) -> end. stats(connections) -> emqx_stats:getstat('connections.count'); +stats(live_connections) -> emqx_stats:getstat('live_connections.count'); stats(topics) -> emqx_stats:getstat('topics.count'); stats(subscriptions) -> emqx_stats:getstat('subscriptions.count'); stats(received) -> emqx_metrics:val('messages.received'); diff --git a/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl b/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl index d86dffba0..e80b2da31 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl @@ -171,6 +171,11 @@ swagger_desc(topics) -> " Can only represent the approximate state" >>; swagger_desc(connections) -> + << + "Sessions at the time of sampling." + " Can only represent the approximate state" + >>; +swagger_desc(live_connections) -> << "Connections at the time of sampling." " Can only represent the approximate state" diff --git a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl index a24fc2337..3c36cbc0f 100644 --- a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl +++ b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl @@ -90,6 +90,20 @@ t_monitor_current_api(_) -> ], ok. +t_monitor_current_api_live_connections(_) -> + process_flag(trap_exit, true), + ClientId = <<"live_conn_tests">>, + {ok, C} = emqtt:start_link([{clean_start, false}, {clientid, ClientId}]), + {ok, _} = emqtt:connect(C), + ok = emqtt:disconnect(C), + {ok, Rate} = request(["monitor_current"]), + ?assertEqual(0, maps:get(<<"live_connections">>, Rate)), + ?assertEqual(1, maps:get(<<"connections">>, Rate)), + %% clears + {ok, C1} = emqtt:start_link([{clean_start, true}, {clientid, ClientId}]), + {ok, _} = emqtt:connect(C1), + ok = emqtt:disconnect(C1). + t_monitor_reset(_) -> restart_monitor(), {ok, Rate} = request(["monitor_current"]), diff --git a/apps/emqx_management/src/emqx_mgmt.erl b/apps/emqx_management/src/emqx_mgmt.erl index 8f40190bd..225b35fd1 100644 --- a/apps/emqx_management/src/emqx_mgmt.erl +++ b/apps/emqx_management/src/emqx_mgmt.erl @@ -142,6 +142,7 @@ node_info() -> max_fds, lists:usort(lists:flatten(erlang:system_info(check_io))) ), connections => ets:info(?CHAN_TAB, size), + live_connections => ets:info(?CHAN_LIVE_TAB, size), node_status => 'running', uptime => proplists:get_value(uptime, BrokerInfo), version => iolist_to_binary(proplists:get_value(version, BrokerInfo)), diff --git a/apps/emqx_management/src/emqx_mgmt_api_nodes.erl b/apps/emqx_management/src/emqx_mgmt_api_nodes.erl index 827fea44a..9afb74f38 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_nodes.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_nodes.erl @@ -151,6 +151,11 @@ fields(node_info) -> #{desc => <<"Node name">>, example => <<"emqx@127.0.0.1">>} )}, {connections, + mk( + non_neg_integer(), + #{desc => <<"Number of clients session in this node">>, example => 0} + )}, + {live_connections, mk( non_neg_integer(), #{desc => <<"Number of clients currently connected to this node">>, example => 0} diff --git a/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl index b356bf905..efabe32c8 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl @@ -60,6 +60,11 @@ t_nodes_api(_) -> Edition = maps:get(<<"edition">>, LocalNodeInfo), ?assertEqual(emqx_release:edition_longstr(), Edition), + Conns = maps:get(<<"connections">>, LocalNodeInfo), + ?assertEqual(0, Conns), + LiveConns = maps:get(<<"live_connections">>, LocalNodeInfo), + ?assertEqual(0, LiveConns), + NodePath = emqx_mgmt_api_test_util:api_path(["nodes", atom_to_list(node())]), {ok, NodeInfo} = emqx_mgmt_api_test_util:request_api(get, NodePath), NodeNameResponse =