Просмотр исходного кода

feat: add `live_connections` field for some HTTP APIs

i.e:
- `/monitor_current`, `/monitor_current/nodes/{node}`
- `/monitor/nodes/{node}`, `/monitor`
- `/node/{node}`, `/nodes`
JianBo He 2 лет назад
Родитель
Сommit
fcef456174

+ 2 - 1
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).

+ 1 - 0
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');

+ 5 - 0
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"

+ 14 - 0
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"]),

+ 1 - 0
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)),

+ 5 - 0
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}

+ 5 - 0
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 =