Registry and Analytics: run, subnet, direction and protocol filters, successes-by-target chart

Registry (/registry):
- filters by run (slice by the address's cycle in that run), subnet
  (drop-down of configured subnets), direction (egress/ingress) and
  protocol (icmp, tcp, ssh, https, tls); status in scope is computed over
  the narrowed checks
- chart "successful checks per target (egress) / site (ingress)" when both
  direction and protocol are chosen; a row opens the list of addresses
  (dialog, CSV)
- API: direction/protocol parameters and run in GET /admin/registry,
  GET /admin/registry/breakdown and /breakdown/list
- subnet filter passes ids as one JSON parameter (SQLite variable limit)

Analytics (/analytics):
- subnet filter recomputes the whole page over the addresses of the run
  inside the subnet; only their checks are read; cache per run and subnet
- direction and protocol focus the page; with both set the registry chart
  is shown
- subnet parameter in GET /admin/analytics/runs/{id} and lists (JSON, CSV)

Docs: plans and summaries in docs/changes, README, API, USAGE.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ayurishchevandClaude Sonnet 5.5 committed 2026-10-06 14:23:48 +03:00
1 parent 068c10ea1c
commit ded196ec8d
40 files changed
+2545 -188

No files matched your search

+60
View File
@@ -412,6 +412,51 @@ curl -s http://<control-api>:8080/api/v1/admin/registry/203.0.113.10 | python3 -
видно по счётчикам (подсказка при наведении). Те же данные — в
`GET /api/v1/admin/registry` ([API.md](API.md#get-apiv1adminregistry)).
**Фильтры реестра.** Помимо поиска по IP, статуса и числа строк на странице,
доступны (все сохраняются в адресной строке и при листании):
- **Запуск** — задача сканирования из накопленной истории (список тот же, что
на «Аналитике»; идущие запуски помечены «идёт»). Выбранный запуск оставляет
только его адреса, а результат и статус берутся по циклу адреса *в этом
запуске* (статус — вердикт запуска). «Последний цикл» — поведение по умолчанию.
- **Подсеть** — выпадающий список настроенных подсетей (с метками); показываются
адреса реестра, входящие в подсеть. Подсеть из ссылки аналитики, которой нет в
списке, добавляется отдельным пунктом. Если подсети не настроены, список
недоступен — рядом ссылка на `/settings`, где их можно добавить. Через API
(`subnet=`) по-прежнему принимается любой CIDR.
- **Направление** — `Egress` или `Ingress`.
- **Протокол** — `icmp`, `tcp` (все порты), `ssh`, `https`, `tls`. `tls` — это
TLS-хендшейк пробера на 443, он бывает только на входе: «Egress + tls» всегда
пуст.
Направление и протокол оставляют только такие проверки цикла: адрес должен
иметь хотя бы одну, а счётчики «N из M» в строке считаются только по ним.
Вместе со статусом он считается по этим проверкам (все успешны — `pass`, ни
одной — `fail`, иначе `partial`), поэтому может отличаться от общего
вердикта. `cancelled` вместе с направлением или протоколом ничего не находит.
Если история циклов обрезана (`history_retention_cycles`), у старого запуска
проверок может не остаться — уровни покажут «—».
**Чарт «Успешные проверки по целям / площадкам».** Когда выбраны и направление, и
протокол, над таблицей появляется чарт по проверкам выбранного типа в цикле среза
(цикл адреса в выбранном запуске либо последний):
- **Egress** — одна строка на цель (`github.com`, `hub.docker.com`…);
- **Ingress** — одна строка на площадку пробера.
В строке — «успешно из всего» и доля, например `4 296 из 6 490 · 66,2%`; строки идут
от большего числа успешных проверок к меньшему. Чарт считается по всем адресам под
текущим фильтром (число — в строке «Найдено адресов»), а не по одной странице.
Считаются именно проверки: у `tcp` и `tls` на ingress у адреса может быть по проверке
на каждый порт (22, 443) для каждой площадки. Сочетание без проверок (например,
`Egress` + `tls`) показывает «Для этого сочетания проверок нет».
Строка чарта открывает список адресов с этой целью или площадкой: провалы сверху,
столбцы «Результат», «Тип проверки», «Цель»/«Площадка», «Валидатор» (egress),
«Задержка», «Детали» (ошибка) и «Проверено»; есть «Копировать» и «Скачать CSV».
API: [`GET /admin/registry/breakdown`](API.md#get-apiv1adminregistrybreakdown) и
`…/breakdown/list`.
**Глубина хранения.** Чтобы история не росла бесконечно на адресах,
которые перепроверяют очень часто, можно ограничить, сколько последних
циклов проверки хранить на каждый адрес — `history_retention_cycles` на
@@ -428,6 +473,21 @@ curl -s http://<control-api>:8080/api/v1/admin/registry/203.0.113.10 | python3 -
`partial`, подсети, провалы по целям, ingress по площадкам, классы ошибок, валидаторы и качество данных. Данные
других запусков на странице не участвуют, поэтому результаты разных прогонов не пересекаются.
**Фильтры страницы.** Под выбором запуска — те же фильтры, что в реестре; значения лежат в адресе
(`/analytics?run=&subnet=&direction=&protocol=`), поэтому ссылку можно сохранить; стрелки ◀ ▶ и ссылки в реестр их переносят:
- **Подсеть** — выпадающий список настроенных подсетей. Вся страница пересчитывается по адресам запуска, входящим в
подсеть (вложенные тоже): плитки, причины `partial`, качество данных, цели, матрица, площадки, ошибки, валидаторы;
списки за плитками и CSV режутся из того же набора. В подписи — «подсеть X: N адр. из M в запуске». Подсеть без
адресов в запуске показывает пояснение. Расчёт новой подсети занимает до секунды, повторный — мгновенно (кэш до 16
записей).
- **Направление** и **протокол** не пересчитывают вердикты и «Качество данных», а задают фокус: Egress скрывает блоки
ingress, Ingress — блоки egress и валидаторов; протокол выбирает вкладку типа в «Egress по целям» и столбец типа в
«Ingress по площадкам».
- Когда выбраны **оба**, над плитками появляется чарт «Успешные проверки по целям / площадкам» — тот же, что в реестре
(чарт считает проверки цикла запуска, в том числе пришедшие после вердикта, поэтому его числа могут расходиться
с плитками, которые берут вердикты). Строка чарта открывает список адресов с CSV.
**Что такое запуск.** Запуск открывается, когда адрес попадает в пустую (или полностью обработанную) очередь, а
скан автоцикла помечает его как `авто`. Пока он открыт, в него входят все добавленные и перепроверяемые адреса.
Когда у всех адресов запуска есть итог, запуск завершается и появляется в списке. Перепроверка после этого