Добавлена оперативная и историческая статистика нод и узлов mnesia #22

This commit is contained in:
2026-05-28 18:59:21 +03:00
parent 29fe0386be
commit f507d08e2c
16 changed files with 753 additions and 201 deletions
+3
View File
@@ -26,6 +26,7 @@ create(AdminId, RefreshToken) ->
type = refresh
},
mnesia:dirty_write(Session),
core_counters:inc(admin_active_sessions),
ok.
%%%-------------------------------------------------------------------
@@ -44,6 +45,7 @@ validate(Token) ->
true -> {ok, Session#admin_session.admin_id};
false ->
mnesia:dirty_delete({admin_session, Token}),
core_counters:dec(admin_active_sessions),
{error, expired}
end;
[] -> {error, not_found}
@@ -56,4 +58,5 @@ validate(Token) ->
-spec delete(Token :: binary()) -> ok.
delete(Token) ->
mnesia:dirty_delete({admin_session, Token}),
core_counters:dec(admin_active_sessions),
ok.
+30
View File
@@ -0,0 +1,30 @@
-module(core_counters).
-export([inc/1, dec/1, get/1, read_and_reset/1]).
-define(TABLE, eventhub_counters).
inc(Key) ->
try ets:update_counter(?TABLE, Key, {2, 1}) % позиция 2 — значение
catch error:badarg ->
ets:insert(?TABLE, {Key, 1})
end.
dec(Key) ->
try ets:update_counter(?TABLE, Key, {2, -1})
catch error:badarg ->
ets:insert(?TABLE, {Key, 0})
end.
get(Key) ->
case ets:lookup(?TABLE, Key) of
[{Key, Val}] -> Val;
[] -> 0
end.
read_and_reset(Key) ->
case ets:lookup(?TABLE, Key) of
[{Key, Val}] ->
ets:insert(?TABLE, {Key, 0}),
Val;
[] -> 0
end.
+43
View File
@@ -0,0 +1,43 @@
-module(core_node_metric).
-include("records.hrl").
-export([save/1, get_by_timerange/3, delete_old/1]).
%%%-------------------------------------------------------------------
%%% @doc Сохраняет запись метрики.
%%% @end
%%%-------------------------------------------------------------------
-spec save(#node_metric{}) -> ok.
save(Metric) ->
mnesia:dirty_write(Metric),
ok.
%%%-------------------------------------------------------------------
%%% @doc Возвращает метрики за период, отсортированные по времени.
%%% @end
%%%-------------------------------------------------------------------
-spec get_by_timerange(From :: calendar:datetime(), To :: calendar:datetime(), Node :: atom()) ->
[#node_metric{}].
get_by_timerange(From, To, Node) ->
All = mnesia:dirty_match_object(#node_metric{node = Node, _ = '_'}),
Filtered = lists:filter(fun(M) ->
M#node_metric.timestamp >= From andalso M#node_metric.timestamp =< To
end, All),
lists:sort(fun(A, B) -> A#node_metric.timestamp =< B#node_metric.timestamp end, Filtered).
%%%-------------------------------------------------------------------
%%% @doc Удаляет метрики старше Seconds секунд.
%%% @end
%%%-------------------------------------------------------------------
-spec delete_old(Seconds :: non_neg_integer()) -> ok.
delete_old(Seconds) ->
Now = calendar:universal_time(),
Threshold = calendar:gregorian_seconds_to_datetime(
calendar:datetime_to_gregorian_seconds(Now) - Seconds),
All = mnesia:dirty_match_object(#node_metric{_ = '_'}),
lists:foreach(fun(M) ->
case M#node_metric.timestamp < Threshold of
true -> mnesia:dirty_delete_object(M);
false -> ok
end
end, All),
ok.
+3
View File
@@ -26,6 +26,7 @@ create(UserId, RefreshToken) ->
type = refresh
},
mnesia:dirty_write(Session),
core_counters:inc(active_sessions),
ok.
%%%-------------------------------------------------------------------
@@ -49,6 +50,7 @@ validate(Token) ->
end;
false ->
mnesia:dirty_delete({session, Token}),
core_counters:dec(active_sessions),
{error, expired}
end;
[] -> {error, not_found}
@@ -61,4 +63,5 @@ validate(Token) ->
-spec delete(Token :: binary()) -> ok.
delete(Token) ->
mnesia:dirty_delete({session, Token}),
core_counters:dec(active_sessions),
ok.