feat: upsert stats counters, daily buckets and ETS tops for admin metrics. Refs EventHub/EventHubBack#42 #43 #44 #45 #46
CI / test (push) Failing after 25m40s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped

This commit is contained in:
2026-07-17 23:10:00 +03:00
parent f2445db66c
commit dd754e28cc
20 changed files with 1885 additions and 408 deletions
@@ -0,0 +1,53 @@
%% @doc Indexes for per-admin stats: report.resolved_by, ticket.assigned_to.
-module('20260717190000_admin_stats_indexes').
-export([up/0, down/0]).
-include("records.hrl").
up() ->
ensure_index(report, resolved_by, #report.resolved_by),
ensure_index(ticket, assigned_to, #ticket.assigned_to),
ok.
down() ->
del_index(report, resolved_by),
del_index(ticket, assigned_to),
ok.
ensure_index(Table, Attr, Pos) ->
case lists:member(Table, mnesia:system_info(tables)) of
false ->
ok;
true ->
Indexes = mnesia:table_info(Table, index),
HasIndex = lists:any(fun
(A) when A =:= Attr -> true;
(N) when is_integer(N) -> N =:= Pos;
(_) -> false
end, Indexes),
case HasIndex of
true ->
ok;
false ->
case mnesia:add_table_index(Table, Attr) of
{atomic, ok} -> ok;
{aborted, {already_exists, _}} -> ok;
{aborted, {already_exists, _, _}} -> ok;
{aborted, Reason} -> error({add_index_failed, Table, Attr, Reason})
end
end
end.
del_index(Table, Attr) ->
case lists:member(Table, mnesia:system_info(tables)) of
false ->
ok;
true ->
case catch mnesia:del_table_index(Table, Attr) of
{atomic, ok} -> ok;
{aborted, {no_exists, _}} -> ok;
{aborted, {no_exists, _, _}} -> ok;
_ -> ok
end
end.