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>
8.9 KiB
Раздел «Аналитика» — итог
План: 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/: 1962pass/ 4478partial; Egress OK 2003, Ingress OK 6215; причиныpartial4146 / 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. - Подсказки при наведении не работают на сенсорных экранах и с клавиатуры (как и в макете).
- В сайдбаре на узком экране (меню-«бургер») новый блок сессии я не просматривал отдельно.
- Фильтр реестра по подсети ограничен адресами, попавшими в список подсетей: строка «прочие» без ссылки.