fix(monitor current api): expose `disconnected_durable_sessions` count

Fixes https://emqx.atlassian.net/browse/EMQX-12423
This commit is contained in:
Thales Macedo Garitezi 2024-05-21 10:03:09 -03:00
parent 8b4a1c3d75
commit 7c5cb1acc5
4 changed files with 64 additions and 16 deletions

View File

@ -72,6 +72,7 @@
]). ]).
-define(GAUGE_SAMPLER_LIST, [ -define(GAUGE_SAMPLER_LIST, [
disconnected_durable_sessions,
durable_subscriptions, durable_subscriptions,
subscriptions, subscriptions,
topics, topics,

View File

@ -262,6 +262,8 @@ merge_cluster_rate(Node, Cluster) ->
Fun = Fun =
fun fun
%% cluster-synced values %% cluster-synced values
(disconnected_durable_sessions, V, NCluster) ->
NCluster#{disconnected_durable_sessions => V};
(durable_subscriptions, V, NCluster) -> (durable_subscriptions, V, NCluster) ->
NCluster#{durable_subscriptions => V}; NCluster#{durable_subscriptions => V};
(topics, V, NCluster) -> (topics, V, NCluster) ->
@ -417,22 +419,40 @@ getstats(Key) ->
_:_ -> 0 _:_ -> 0
end. end.
stats(connections) -> emqx_stats:getstat('connections.count'); stats(connections) ->
stats(durable_subscriptions) -> emqx_stats:getstat('durable_subscriptions.count'); emqx_stats:getstat('connections.count');
stats(live_connections) -> emqx_stats:getstat('live_connections.count'); stats(disconnected_durable_sessions) ->
stats(cluster_sessions) -> emqx_stats:getstat('cluster_sessions.count'); emqx_persistent_session_bookkeeper:get_disconnected_session_count();
stats(topics) -> emqx_stats:getstat('topics.count'); stats(durable_subscriptions) ->
stats(subscriptions) -> emqx_stats:getstat('subscriptions.count'); emqx_stats:getstat('durable_subscriptions.count');
stats(shared_subscriptions) -> emqx_stats:getstat('subscriptions.shared.count'); stats(live_connections) ->
stats(retained_msg_count) -> emqx_stats:getstat('retained.count'); emqx_stats:getstat('live_connections.count');
stats(received) -> emqx_metrics:val('messages.received'); stats(cluster_sessions) ->
stats(received_bytes) -> emqx_metrics:val('bytes.received'); emqx_stats:getstat('cluster_sessions.count');
stats(sent) -> emqx_metrics:val('messages.sent'); stats(topics) ->
stats(sent_bytes) -> emqx_metrics:val('bytes.sent'); emqx_stats:getstat('topics.count');
stats(validation_succeeded) -> emqx_metrics:val('messages.validation_succeeded'); stats(subscriptions) ->
stats(validation_failed) -> emqx_metrics:val('messages.validation_failed'); emqx_stats:getstat('subscriptions.count');
stats(dropped) -> emqx_metrics:val('messages.dropped'); stats(shared_subscriptions) ->
stats(persisted) -> emqx_metrics:val('messages.persisted'). emqx_stats:getstat('subscriptions.shared.count');
stats(retained_msg_count) ->
emqx_stats:getstat('retained.count');
stats(received) ->
emqx_metrics:val('messages.received');
stats(received_bytes) ->
emqx_metrics:val('bytes.received');
stats(sent) ->
emqx_metrics:val('messages.sent');
stats(sent_bytes) ->
emqx_metrics:val('bytes.sent');
stats(validation_succeeded) ->
emqx_metrics:val('messages.validation_succeeded');
stats(validation_failed) ->
emqx_metrics:val('messages.validation_failed');
stats(dropped) ->
emqx_metrics:val('messages.dropped');
stats(persisted) ->
emqx_metrics:val('messages.persisted').
%% ------------------------------------------------------------------------------------------------- %% -------------------------------------------------------------------------------------------------
%% Retained && License Quota %% Retained && License Quota

View File

@ -194,6 +194,8 @@ swagger_desc(validation_failed) ->
swagger_desc_format("Schema validations failed "); swagger_desc_format("Schema validations failed ");
swagger_desc(persisted) -> swagger_desc(persisted) ->
swagger_desc_format("Messages saved to the durable storage "); swagger_desc_format("Messages saved to the durable storage ");
swagger_desc(disconnected_durable_sessions) ->
<<"Disconnected durable sessions at the time of sampling.", ?APPROXIMATE_DESC>>;
swagger_desc(durable_subscriptions) -> swagger_desc(durable_subscriptions) ->
<<"Subscriptions from durable sessions at the time of sampling.", ?APPROXIMATE_DESC>>; <<"Subscriptions from durable sessions at the time of sampling.", ?APPROXIMATE_DESC>>;
swagger_desc(subscriptions) -> swagger_desc(subscriptions) ->

View File

@ -341,6 +341,8 @@ t_persistent_session_stats(_Config) ->
?retry(1_000, 10, begin ?retry(1_000, 10, begin
?assertMatch( ?assertMatch(
{ok, #{ {ok, #{
<<"connections">> := 2,
<<"disconnected_durable_sessions">> := 0,
%% N.B.: we currently don't perform any deduplication between persistent %% N.B.: we currently don't perform any deduplication between persistent
%% and non-persistent routes, so we count `commont/topic' twice and get 8 %% and non-persistent routes, so we count `commont/topic' twice and get 8
%% instead of 6 here. %% instead of 6 here.
@ -356,6 +358,29 @@ t_persistent_session_stats(_Config) ->
?assert(PSRouteCount > 0, #{ps_route_count => PSRouteCount}), ?assert(PSRouteCount > 0, #{ps_route_count => PSRouteCount}),
PSSubCount = emqx_persistent_session_bookkeeper:get_subscription_count(), PSSubCount = emqx_persistent_session_bookkeeper:get_subscription_count(),
?assert(PSSubCount > 0, #{ps_sub_count => PSSubCount}), ?assert(PSSubCount > 0, #{ps_sub_count => PSSubCount}),
%% Now with disconnected but alive persistent sessions
{ok, {ok, _}} =
?wait_async_action(
emqtt:disconnect(PSClient),
#{?snk_kind := dashboard_monitor_flushed}
),
?retry(1_000, 10, begin
?assertMatch(
{ok, #{
<<"connections">> := 1,
<<"disconnected_durable_sessions">> := 1,
%% N.B.: we currently don't perform any deduplication between persistent
%% and non-persistent routes, so we count `commont/topic' twice and get 8
%% instead of 6 here.
<<"topics">> := 8,
<<"durable_subscriptions">> := 4,
<<"subscriptions">> := 4
}},
request(["monitor_current"])
)
end),
ok. ok.
request(Path) -> request(Path) ->