Сбор статистики через триггеры #16
Notifications
Due Date
No due date set.
Blocks
#10 Расширение, оптимизация и миграции Mnesia
EventHub/EventHubBack
Reference: EventHub/EventHubBack#16
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Этап 4. Сбор статистики через триггеры (пункт 5 задачи)
Цель: реализовать лёгкий сбор агрегированной статистики без затратных запросов к большим таблицам.
Шаги:
stats_collector(может быть gen_event или отдельный gen_server).mnesia:subscribe({table, event, simple}), аналогично дляbooking,review.{write, Table, New, Old, ...}обновляет счётчики в ETS-таблицеstats_ets:stats(или в лог-файл) и сбрасывать счётчики для следующего интервала.infra_mnesia:start/0:stats_collectorпосле инициализации Mnesia.Результат: работает система сбора статистики, не влияющая на производительность основных операций.
План выполнения Задачи #16 – Сбор статистики через триггеры
1. Анализ и цели
После выполнения задач #12–#15 база данных EventHub стабильна.
Необходимо добавить систему сбора агрегированной статистики без нагрузки на основную БД.
Цели:
stats_collector, подписанный на изменения таблиц Mnesia (event,booking,review).stats_ets.stats(или лог) и обнулять счётчики.infra_mnesiaи дерево супервизора.2. Общая архитектура
stats_collectorgen_server, подписан на события таблиц Mnesia. Обновляет ETS-счётчики.stats_etssetс ключом{MetricType, EntityId}. Текущие значения за интервал.stats3. Детальный план реализации
Шаг 3.1. Модуль
stats_collectorФайл:
src/infra/stats_collector.erlТип:
gen_serverСостояние:
#{}(пустая map, все данные в ETS).API:
start_link() -> {ok, Pid}get_stats(Metric) -> [{Key, Value}](для отладки/API)Логика:
При инициализации:
stats_ets(если не существует).mnesia:subscribe({table, event, simple}), аналогично дляbooking,review.Обработка событий (
handle_info):{write, Table, New, Old, _ActivityId}:event_created,booking_cancelled).ets:update_counterдля соответствующего ключа.{flush}:stats_ets.stats(или лог).Список метрик (ключи ETS):
{events_created, calendar_id}– количество новых событий.{events_cancelled, calendar_id}– количество отменённых событий.{bookings_created, calendar_id}– количество новых бронирований.{bookings_confirmed, calendar_id}– количество подтверждённых.{bookings_cancelled, calendar_id}– количество отменённых.{reviews_created, calendar_id}– количество новых отзывов.{reviews_avg_rating, calendar_id}– сумма рейтингов и количество.Шаг 3.2. Интеграция в
infra_mnesia.erlВ функции
handle_call(init_tables, ...)послеcreate_indices()добавить:И реализовать:
Шаг 3.3. Обновление
infra_sup.erlДобавить в список детей супервизора:
Шаг 3.4. Оптимизация
handle_infoвыполняет толькоets:update_counterилиets:insert.erlang:send_after.4. Тестирование
event,booking,review.stats_collector:get_stats(...).flush).statsили в логе.5. Документация
Добавить в
README.mdраздел «Сбор статистики» с описанием:Тестирование модуля stats_collector (задача #16)
Шаг 1. Подготовка
Запустите приложение
make shellи загрузите определения записей:Шаг 2. Создание тестовых записей
Календарь
Событие (создаём и отменяем)
Бронирование
Отзыв
Шаг 3. Проверка счетчиков в ETS
Ожидаемые ключи:
{events_created, CId1},{events_cancelled, CId1},{bookings_created, CId1},{bookings_confirmed, CId1},{reviews_created, CId1}и т.д.Шаг 4. Принудительный сброс статистики
Шаг 5. Проверка сохранённой статистики в таблице stats
Убедитесь, что записи появились, а ETS-таблица очищена: