Files
cloud-ip-validator/docs/changes/2026-10-03_18-41_analytics-section-summary.md
T
ayurishchevandClaude Sonnet 5.5 b7669c9e41 Add the Analytics section: check runs, analytics API and page
Runs (migration 0011): a run groups the cycles of one launch. It opens when an
address enters an idle queue, takes everything submitted or re-checked while it
is open and is finalized when all its addresses are done; a re-check after that
opens a new run, so results of different runs never mix. check_runs,
run_results (one result per address and run, with the verdict and the expected
and stored check counts), subnets, run_id on ip_queue and checks. Existing data
is split into runs at pauses of more than an hour; ingress checks get the
validator that held the address (also at write time from now on).

Analytics (internal/analytics): figures computed from the stored checks of the
latest cycle of each address in the run, as facts next to the verdict: summary,
reasons of partial, data quality, subnets, targets and the subnet x target
matrix by check type, ingress by site, error classes, validators, and the
address lists behind the indicators and error classes. API: analytics runs,
report, lists (JSON or CSV), subnet list; run and subnet filters for the
registry.

Dashboard: /analytics matching the approved mockup (run selector, indicators
with address lists and CSV, error-class dialogs, drill-down to the registry),
subnet list on /settings. Sidebar: the control-api link state, theme toggle and
logout moved to the top, the three dots next to the logo removed, sections
grouped.

Rebuilt bin/control-api and bin/admin-dashboard to match. Plan, summary and the
updated README, API, USAGE, DASHBOARD and ADMIN_CLEANUP docs are in docs/.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 18:36:03 +03:00

8.9 KiB
Raw Blame History

Раздел «Аналитика» — итог

План: 2026-10-03_16-39_analytics-section-plan.md. Макет: docs/mockups/analytics-mockup.html.

Статус: код, тесты и документация готовы. На стенд не выложено (бинарники bin/ не пересобирались), не закоммичено.

Что сделано

Запуски (миграция 0011). Новые таблицы check_runs, run_results, subnets; колонки run_id у ip_queue и checks. Запуск открывается, когда адрес попадает в пустую или полностью обработанную очередь (SubmitIPsAs, SeedQueue), принимает всё добавленное и перепроверенное, пока открыт, и завершается, когда у всех его адресов есть итог или они удалены (finalizeRunsTx в FinishIPExpected, CancelIP, RequeueOrFail, MarkFIPOccupied, удалении и очистке; плюс страховка в такте оркестратора). Скан автоцикла помечает запуск auto. Итог адреса (run_results) пишется при вердикте вместе с ожидаемым и записанным числом проверок. Ingress-проверка получает validator_id держателя адреса при записи. Накопленные данные размечены миграцией: запуски выделяются паузами больше часа, итоги берутся из очереди или считаются по проверкам (помечаются verdict_derived), валидатор ingress восстановлен из события fip_associated; живые строки очереди без запуска попадают в открытый запуск при открытии БД.

Расчёт (internal/analytics). Показатели считаются по фактам: все проверки последнего цикла каждого адреса запуска, в том числе пришедшие позже вердикта. Блоки: показатели, причины partial, качество данных, подсети, цели и матрица «подсеть × цель» по типам проверок, площадки, классы ошибок, валидаторы; списки адресов (4 индикатора и класс ошибки). Подсеть — самая узкая подходящая; без списка — /24.

API. GET /admin/analytics/runs, /runs/{id} (кэш по версии данных запуска и списку подсетей; открытый запуск — 409), /runs/{id}/lists/{kind} (JSON и ?format=csv), GET/PUT /admin/config/subnets; фильтры run и subnet в GET /admin/registry.

Страница /analytics. Точно по макету: выбор запуска (идущий виден, недоступен), 12 карточек, причины partial, качество данных, подсети, egress по целям с вкладками по типу и тепловой картой, ingress по площадкам, классы ошибок, валидаторы; окна со списками адресов, подсказками и выгрузкой CSV (скачивание — с сервера, Content-Disposition: attachment). Стили static/analytics.css (классы с префиксом an-, не пересекаются со стилями дашборда), скрипт static/analytics.js. В /settings блок «Подсети». Из подсетей и матрицы — переход в «Реестр» с фильтром (/registry?run=…&subnet=…, плашка фильтра со сбросом).

Сайдбар. Убраны три точки у логотипа. Индикатор связи с control-api (краснеет «нет связи» при сбое), переключатель темы и кнопка «Выйти» подняты наверх, в блок сессии под логотипом. Разделы разбиты на «Мониторинг» (Обзор, Очередь IP, Реестр, Аналитика) и «Настройка». Нижний блок убран.

Проверка

  • go build ./... && go vet ./... && go test ./... проходят. Новые тесты: БД (жизненный цикл запуска, присоединение и новый запуск при перепроверке, очистка и удаление, отмена и провал по повторам, валидатор ingress, подсети, фильтры реестра, миграция 0011 на базе версии 10), internal/analytics (расчёт по синтетическим данным, подсети, классы ошибок, списки), API (отчёт, списки, CSV, кэш, подсети, фильтры, 409/404/400), дашборд (страница одного запуска и пустое состояние, прокси списков и CSV, сайдбар, индикатор связи, форма подсетей, drill-down в реестр).
  • Контрольные числа на копии боевой БД (запуск 02.10, 6440 адресов) после миграции 0011 совпали с отчётами analysis/: 1962 pass / 4478 partial; Egress OK 2003, Ingress OK 6215; причины partial 4146 / 157 / 125 / 9 / 33 / 8; https: есть провалы 4409, все провалены 307 (по всем 5 целям 290); ssh: есть провалы 222, все провалены 7; провалы по целям 3841 / 2193 / 1872 / 1805 / 1728; первая строка матрицы 83.166.248.0/21: 81 / 57 / 51 / 86 / 46; классы ошибок 327 / 276 / 260 / 47 / 18 / 15 / 7; поздние провалы 246 у 50 адресов, 844 из 950 ingress-провалов после вердикта, неполный набор 167, pass по фактам 1912. Миграция на копии — около 8 с, расчёт отчёта — около 2,5 с.
  • В браузере (headless Chrome, локальный control-api и дашборд на той же копии): страница на 1440 px и 390 px, без горизонтальной прокрутки на телефоне; окна списков (4 409 строк) и класса ошибок открываются, кнопки внутри окна видны, вкладки типов и матрица работают, CSV отдаётся файлом.

Отличия от макета

  • Время в подписях запусков — локальное время дашборда (в макете было UTC).
  • Матрица «подсеть × цель» строится и для icmp (в макете для него её не было).
  • Строка «Перепроверено внутри запуска» показывается, только если такие адреса есть (в БД стенда прежние циклы этих адресов уже удалены, поэтому 0).
  • Карточки не переносят значение на вторую строку: минимальная ширина карточки 168 px, на телефоне шрифт значения меньше.
  • Таблицы данных на телефоне прокручиваются вбок, а не превращаются в карточки, как остальные таблицы дашборда.

Что не сделано и ограничения

  • Выкладка на стенд: нужна пересборка control-api и admin-dashboard и миграция 0011 на боевой БД (копия БД перед ней обязательна; процедура — в памяти проекта и в docs/SETUP.md). После выкладки задать список подсетей клиента на /settings (45 подсетей из отчёта) — без него адреса группируются по /24.
  • Подсказки при наведении не работают на сенсорных экранах и с клавиатуры (как и в макете).
  • В сайдбаре на узком экране (меню-«бургер») новый блок сессии я не просматривал отдельно.
  • Фильтр реестра по подсети ограничен адресами, попавшими в список подсетей: строка «прочие» без ссылки.