From fcef456174f3261d10890834b282ce9251a0e22d Mon Sep 17 00:00:00 2001 From: JianBo He Date: Tue, 6 Jun 2023 16:57:55 +0800 Subject: [PATCH 1/3] feat: add `live_connections` field for some HTTP APIs i.e: - `/monitor_current`, `/monitor_current/nodes/{node}` - `/monitor/nodes/{node}`, `/monitor` - `/node/{node}`, `/nodes` --- apps/emqx_dashboard/include/emqx_dashboard.hrl | 3 ++- apps/emqx_dashboard/src/emqx_dashboard_monitor.erl | 1 + .../src/emqx_dashboard_monitor_api.erl | 5 +++++ .../test/emqx_dashboard_monitor_SUITE.erl | 14 ++++++++++++++ apps/emqx_management/src/emqx_mgmt.erl | 1 + apps/emqx_management/src/emqx_mgmt_api_nodes.erl | 5 +++++ .../test/emqx_mgmt_api_nodes_SUITE.erl | 5 +++++ 7 files changed, 33 insertions(+), 1 deletion(-) 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 = From 4483a6857eab960e0dd71275ee9dcc8d75451497 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Tue, 6 Jun 2023 17:04:19 +0800 Subject: [PATCH 2/3] chore: update changes --- changes/ce/feat-10948.en.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changes/ce/feat-10948.en.md diff --git a/changes/ce/feat-10948.en.md b/changes/ce/feat-10948.en.md new file mode 100644 index 000000000..c38a6ac11 --- /dev/null +++ b/changes/ce/feat-10948.en.md @@ -0,0 +1,4 @@ +Add `live_connections` field for some HTTP APIs, i.e: +- `/monitor_current`, `/monitor_current/nodes/{node}` +- `/monitor/nodes/{node}`, `/monitor` +- `/node/{node}`, `/nodes` From d5ebf5650f7356fe79cabd66a022ecb46a1652fb Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 7 Jun 2023 11:46:41 +0800 Subject: [PATCH 3/3] test: improve the test --- .../test/emqx_dashboard_monitor_SUITE.erl | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl index 3c36cbc0f..ae0d4171b 100644 --- a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl +++ b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl @@ -93,16 +93,23 @@ t_monitor_current_api(_) -> t_monitor_current_api_live_connections(_) -> process_flag(trap_exit, true), ClientId = <<"live_conn_tests">>, + ClientId1 = <<"live_conn_tests1">>, {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, C1} = emqtt:start_link([{clean_start, true}, {clientid, ClientId1}]), {ok, _} = emqtt:connect(C1), - ok = emqtt:disconnect(C1). + %% waiting for emqx_stats ticker + timer:sleep(1500), + _ = emqx_dashboard_monitor:current_rate(), + {ok, Rate} = request(["monitor_current"]), + ?assertEqual(1, maps:get(<<"live_connections">>, Rate)), + ?assertEqual(2, maps:get(<<"connections">>, Rate)), + %% clears + ok = emqtt:disconnect(C1), + {ok, C2} = emqtt:start_link([{clean_start, true}, {clientid, ClientId}]), + {ok, _} = emqtt:connect(C2), + ok = emqtt:disconnect(C2). t_monitor_reset(_) -> restart_monitor(),