Skip to content

Commit

Permalink
Improve error handling in stat
Browse files Browse the repository at this point in the history
  • Loading branch information
Kamil Waz committed Nov 23, 2022
1 parent 89d1b2b commit afb5249
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 42 deletions.
8 changes: 4 additions & 4 deletions src/admin_extra/service_admin_extra_stats.erl
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ commands() ->
#ejabberd_commands{name = stats, tags = [stats],
desc = "Get statistical value:"
" registeredusers onlineusers onlineusersnode uptimeseconds",
module = stats_api, function = stats,
module = stats_api, function = stats_mongooseimctl,
args = [{name, binary}],
result = {stat, integer}},
result = {res, restuple}},
#ejabberd_commands{name = stats_host, tags = [stats],
desc = "Get statistical value for this host:"
" registeredusers onlineusers",
module = stats_api, function = stats,
module = stats_api, function = stats_mongooseimctl,
args = [{name, binary}, {host, binary}],
result = {stat, integer}}
result = {res, restuple}}
].
10 changes: 8 additions & 2 deletions src/graphql/admin/mongoose_graphql_stats_domain.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
-include("jlib.hrl").

execute(_Ctx, Domain, <<"registeredUsers">>, _Args) ->
{ok, stats_api:stats(<<"registeredusers">>, Domain)};
globalStats(<<"registeredusers">>, Domain);
execute(_Ctx, Domain, <<"onlineUsers">>, _Args) ->
{ok, stats_api:stats(<<"onlineusers">>, Domain)}.
globalStats(<<"onlineusers">>, Domain).

globalStats(Name, Domain) ->
case stats_api:stats(Name, Domain) of
{ok, _} = Result -> Result;
Error -> make_error(Error, #{domain => Domain})
end.
18 changes: 12 additions & 6 deletions src/graphql/admin/mongoose_graphql_stats_global.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,20 @@
-include("jlib.hrl").

execute(_Ctx, globalStats, <<"uptimeSeconds">>, _Args) ->
{ok, stats_api:stats(<<"uptimeseconds">>)};
globalStats(<<"uptimeseconds">>);
execute(_Ctx, globalStats, <<"registeredUsers">>, _Args) ->
{ok, stats_api:stats(<<"registeredusers">>)};
globalStats(<<"registeredusers">>);
execute(_Ctx, globalStats, <<"onlineUsersNode">>, _Args) ->
{ok, stats_api:stats(<<"onlineusersnode">>)};
globalStats(<<"onlineusersnode">>);
execute(_Ctx, globalStats, <<"onlineUsers">>, _Args) ->
{ok, stats_api:stats(<<"onlineusers">>)};
globalStats(<<"onlineusers">>);
execute(_Ctx, globalStats, <<"incomingS2S">>, _Args) ->
{ok, stats_api:incoming_s2s_number()};
stats_api:incoming_s2s_number();
execute(_Ctx, globalStats, <<"outgoingS2S">>, _Args) ->
{ok, stats_api:outgoing_s2s_number()}.
stats_api:outgoing_s2s_number().

globalStats(Name) ->
case stats_api:stats(Name) of
{ok, _} = Result -> Result;
Error -> make_error(Error, #{})
end.
70 changes: 40 additions & 30 deletions src/stats_api.erl
Original file line number Diff line number Diff line change
@@ -1,42 +1,52 @@
-module(stats_api).

-export([incoming_s2s_number/0, outgoing_s2s_number/0, stats/1, stats/2]).
-export([stats_mongooseimctl/1, stats_mongooseimctl/2]).

-ignore_xref([stats_mongooseimctl/1, stats_mongooseimctl/2]).

-include("mongoose.hrl").
-include("ejabberd_commands.hrl").

-spec incoming_s2s_number() -> non_neg_integer().
-spec incoming_s2s_number() -> {ok, non_neg_integer()}.
incoming_s2s_number() ->
length(supervisor:which_children(ejabberd_s2s_in_sup)).
{ok, length(supervisor:which_children(ejabberd_s2s_in_sup))}.

-spec outgoing_s2s_number() -> non_neg_integer().
-spec outgoing_s2s_number() -> {ok, non_neg_integer()}.
outgoing_s2s_number() ->
length(supervisor:which_children(ejabberd_s2s_out_sup)).

-spec stats(binary()) -> integer() | {error, string()}.
stats(Name) ->
case Name of
<<"uptimeseconds">> ->
trunc(element(1, erlang:statistics(wall_clock))/1000);
<<"registeredusers">> ->
Domains = lists:flatmap(fun mongoose_domain_api:get_domains_by_host_type/1,
?ALL_HOST_TYPES),
lists:sum([ejabberd_auth:get_vh_registered_users_number(Domain) || Domain <- Domains]);
<<"onlineusersnode">> ->
ejabberd_sm:get_node_sessions_number();
<<"onlineusers">> ->
ejabberd_sm:get_total_sessions_number();
_ ->
{error, "Wrong command name."}
{ok, length(supervisor:which_children(ejabberd_s2s_out_sup))}.

-spec stats(binary()) -> {ok, integer()} | {not_found, string()}.
stats(<<"uptimeseconds">>) ->
{ok, trunc(element(1, erlang:statistics(wall_clock)) / 1000)};
stats(<<"registeredusers">>) ->
Domains = lists:flatmap(fun mongoose_domain_api:get_domains_by_host_type/1,
?ALL_HOST_TYPES),
{ok, lists:sum([ejabberd_auth:get_vh_registered_users_number(Domain) || Domain <- Domains])};
stats(<<"onlineusersnode">>) ->
{ok, ejabberd_sm:get_node_sessions_number()};
stats(<<"onlineusers">>) ->
{ok, ejabberd_sm:get_total_sessions_number()};
stats(_Name) ->
{not_found, "Stats not found"}.

-spec stats(binary(), jid:server()) -> {ok, integer()} | {not_found, string()}.
stats(<<"registeredusers">>, Host) ->
{ok, ejabberd_auth:get_vh_registered_users_number(Host)};
stats(<<"onlineusers">>, Host) ->
{ok, ejabberd_sm:get_vh_session_number(Host)};
stats(_Name, _Host) ->
{not_found, "Stats not found"}.

-spec stats_mongooseimctl(binary()) -> {ok | not_found, string()}.
stats_mongooseimctl(Name) ->
case stats(Name) of
{ok, Stat} -> {ok, integer_to_list(Stat)};
Error -> Error
end.

-spec stats(binary(), jid:server()) -> integer() | {error, string()}.
stats(Name, Host) ->
case Name of
<<"registeredusers">> ->
ejabberd_auth:get_vh_registered_users_number(Host);
<<"onlineusers">> ->
ejabberd_sm:get_vh_session_number(Host);
_ ->
{error, "Wrong command name."}
-spec stats_mongooseimctl(binary(), binary()) -> {ok | not_found, string()}.
stats_mongooseimctl(Name, Host) ->
case stats(Name, Host) of
{ok, Stat} -> {ok, integer_to_list(Stat)};
Error -> Error
end.

0 comments on commit afb5249

Please sign in to comment.