feat: upsert stats counters, daily buckets and ETS tops for admin metrics. Refs EventHub/EventHubBack#42 #43 #44 #45 #46
This commit is contained in:
+49
-41
@@ -266,17 +266,19 @@ list_all() ->
|
||||
-spec count_users_by_date(From :: calendar:datetime(), To :: calendar:datetime()) ->
|
||||
[{{pos_integer(), pos_integer(), pos_integer()}, non_neg_integer()}].
|
||||
count_users_by_date(From, To) ->
|
||||
All = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Filtered = lists:filter(fun(U) -> U#user.created_at >= From andalso
|
||||
U#user.created_at =< To end, All),
|
||||
Counts = lists:foldl(fun(U, Acc) ->
|
||||
Day = date_part(U#user.created_at),
|
||||
case lists:keyfind(Day, 1, Acc) of
|
||||
false -> [{Day, 1} | Acc];
|
||||
{Day, C} -> lists:keyreplace(Day, 1, Acc, {Day, C+1})
|
||||
end
|
||||
end, [], Filtered),
|
||||
lists:sort(Counts).
|
||||
core_stats:with_daily(users_created, From, To, fun() ->
|
||||
All = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Filtered = lists:filter(fun(U) -> U#user.created_at >= From andalso
|
||||
U#user.created_at =< To end, All),
|
||||
Counts = lists:foldl(fun(U, Acc) ->
|
||||
Day = date_part(U#user.created_at),
|
||||
case lists:keyfind(Day, 1, Acc) of
|
||||
false -> [{Day, 1} | Acc];
|
||||
{Day, C} -> lists:keyreplace(Day, 1, Acc, {Day, C+1})
|
||||
end
|
||||
end, [], Filtered),
|
||||
lists:sort(Counts)
|
||||
end).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Количество неподтверждённых пользователей (status = pending).
|
||||
@@ -284,8 +286,10 @@ count_users_by_date(From, To) ->
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec count_pending_users() -> non_neg_integer().
|
||||
count_pending_users() ->
|
||||
Match = #user{status = pending, _ = '_'},
|
||||
length(mnesia:dirty_match_object(Match)).
|
||||
core_stats:with_counter({user_by_status, pending}, fun() ->
|
||||
Match = #user{status = pending, _ = '_'},
|
||||
length(mnesia:dirty_match_object(Match))
|
||||
end).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Подсчёт неподтверждённых пользователей (status=pending) по дням.
|
||||
@@ -294,18 +298,20 @@ count_pending_users() ->
|
||||
-spec count_pending_users_by_date(From :: calendar:datetime(), To :: calendar:datetime()) ->
|
||||
[{{pos_integer(), pos_integer(), pos_integer()}, non_neg_integer()}].
|
||||
count_pending_users_by_date(From, To) ->
|
||||
All = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Pending = lists:filter(fun(U) -> U#user.status =:= pending end, All),
|
||||
Filtered = lists:filter(fun(U) -> U#user.created_at >= From andalso
|
||||
U#user.created_at =< To end, Pending),
|
||||
Counts = lists:foldl(fun(U, Acc) ->
|
||||
Day = date_part(U#user.created_at),
|
||||
case lists:keyfind(Day, 1, Acc) of
|
||||
false -> [{Day, 1} | Acc];
|
||||
{Day, C} -> lists:keyreplace(Day, 1, Acc, {Day, C+1})
|
||||
end
|
||||
end, [], Filtered),
|
||||
lists:sort(Counts).
|
||||
core_stats:with_daily(pending_users_created, From, To, fun() ->
|
||||
All = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Pending = lists:filter(fun(U) -> U#user.status =:= pending end, All),
|
||||
Filtered = lists:filter(fun(U) -> U#user.created_at >= From andalso
|
||||
U#user.created_at =< To end, Pending),
|
||||
Counts = lists:foldl(fun(U, Acc) ->
|
||||
Day = date_part(U#user.created_at),
|
||||
case lists:keyfind(Day, 1, Acc) of
|
||||
false -> [{Day, 1} | Acc];
|
||||
{Day, C} -> lists:keyreplace(Day, 1, Acc, {Day, C+1})
|
||||
end
|
||||
end, [], Filtered),
|
||||
lists:sort(Counts)
|
||||
end).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Подсчёт пользователей по ролям.
|
||||
@@ -314,14 +320,15 @@ count_pending_users_by_date(From, To) ->
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec count_users_by_role() -> [{atom(), non_neg_integer()}].
|
||||
count_users_by_role() ->
|
||||
Users = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Dict = lists:foldl(fun(#user{role = Role}, Acc) ->
|
||||
case lists:keyfind(Role, 1, Acc) of
|
||||
false -> [{Role, 1} | Acc];
|
||||
{Role, C} -> lists:keyreplace(Role, 1, Acc, {Role, C+1})
|
||||
end
|
||||
end, [], Users),
|
||||
Dict.
|
||||
core_stats:with_dim(user, role, fun() ->
|
||||
Users = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
lists:foldl(fun(#user{role = Role}, Acc) ->
|
||||
case lists:keyfind(Role, 1, Acc) of
|
||||
false -> [{Role, 1} | Acc];
|
||||
{Role, C} -> lists:keyreplace(Role, 1, Acc, {Role, C+1})
|
||||
end
|
||||
end, [], Users)
|
||||
end).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Подсчёт пользователей по статусам.
|
||||
@@ -330,14 +337,15 @@ count_users_by_role() ->
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec count_users_by_status() -> [{atom(), non_neg_integer()}].
|
||||
count_users_by_status() ->
|
||||
Users = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
Dict = lists:foldl(fun(#user{status = Status}, Acc) ->
|
||||
case lists:keyfind(Status, 1, Acc) of
|
||||
false -> [{Status, 1} | Acc];
|
||||
{Status, C} -> lists:keyreplace(Status, 1, Acc, {Status, C+1})
|
||||
end
|
||||
end, [], Users),
|
||||
Dict.
|
||||
core_stats:with_dim(user, status, fun() ->
|
||||
Users = mnesia:dirty_match_object(#user{_ = '_'}),
|
||||
lists:foldl(fun(#user{status = Status}, Acc) ->
|
||||
case lists:keyfind(Status, 1, Acc) of
|
||||
false -> [{Status, 1} | Acc];
|
||||
{Status, C} -> lists:keyreplace(Status, 1, Acc, {Status, C+1})
|
||||
end
|
||||
end, [], Users)
|
||||
end).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Выделить из datetime только дату `{Y,M,D}`.
|
||||
|
||||
Reference in New Issue
Block a user