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>
13 KiB
13 KiB
План: выпадающий список подсетей и чарт «успешные проверки по целям / площадкам» в «Реестре»
Редакция 2 (решения по вопросам подтверждены пользователем).
Продолжение 2026-10-06_12-12_registry-subnet-direction-protocol-filters. Фильтры работают; улучшаем удобство и восприятие.
Задача
- Подсеть выбирается из выпадающего списка (сейчас — поле ввода с подсказками).
- Когда выбраны направление и протокол (например, Egress + https), над таблицей показывается чарт «количество успешных проверок» по каждой цели 1…N:
- Egress — в разрезе целей;
- Ingress — в разрезе площадок (та же логика).
- Строка чарта кликабельна и открывает список адресов с детализацией.
- Подход переиспользуем из «Аналитика → Egress по целям».
Что уже есть (граф + код)
- Аналитика: блок «Egress по целям» — строки
an-bar-row(название, полосаan-track/an-fill, число и процент), вкладки по типу проверки. Диалог со списком адресов (analytics-dialog.js, шаблонanalytics_dialog, «Копировать», «Скачать CSV», подсказки при наведении) подключается страницей и уже обслуживает списки по запросуload(url)→fill(...). Стили —static/analytics.css. - Данные в БД: в
checksдля egresstarget— адрес цели (https://github.com),source='egress'. Для ingresssource = inbound-site-N(площадка), аtarget— сам проверяемый адрес, поэтому ingress группируется поsource, а не поtarget. Имена площадок берутся по индексу (какSiteNamesв аналитике), без имени —site-N. - Срез данных (запуск / последний цикл, направление, протокол, статус, подсеть) уже реализован в
internal/db/queries_registry.go(registrySlice,scopeFrom). Чарт строится по тому же срезу и тому же набору адресов, что и таблица. - Список настроенных подсетей уже грузится в форму (
GetSubnets), 45 штук на стенде. - Таблица
/registryобновляется через htmx (#registry-table-wrap).
Решения (подтверждены пользователем)
- Когда показывать чарт: выбраны и направление, и протокол. С одним направлением вместо чарта — короткая подсказка «Выберите протокол, чтобы увидеть распределение по целям/площадкам».
- Набор адресов — все под текущим фильтром (запуск, подсеть, статус, поиск), а не только текущая страница. Чарт совпадает с «Найдено адресов: N». Чарт строится в разрезе проверок выбранного типа в рамках проверочного цикла среза: цикл адреса в выбранном запуске или его последний цикл.
- Что считается: число записанных проверок выбранного типа в проверочном цикле среза:
успешных из всего. Полоса — доля успешных; подпись:1 234 из 1 250 · 98,7%. У tcp и tls на ingress у адреса может быть несколько проверок на площадку (порты 22 и 443), поэтому считаются именно проверки, а не адреса (пояснение в подписи под чартом). - Порядок строк: от большего к меньшему по числу успешных проверок, при равенстве — по названию. Полоса масштабируется по наибольшему значению; доля успешных остаётся в подписи.
- Подпись цели: адрес цели без схемы и без завершающего
/(repo.almalinux.org/almalinux), ключ — исходное значениеtarget. Разные пути на одном хосте остаются разными строками. - Клик по строке: диалог со списком всех адресов набора, у которых есть проверки этой цели/площадки, провалы сверху (порядок списка не связан с порядком чарта). Столбцы: Адрес, Результат (
успешно/провал), Тип проверки (https,tcp-22…), Цель или Площадка, Валидатор (для egress), Задержка (мс), Детали (ошибка), Проверено. Сверху — счётчики «успешно N · провал M». Доступны «Копировать» и «Скачать CSV». - Подсеть в списке (ручной ввод убирается, решение подтверждено): варианты — «Все подсети» + настроенные подсети (
CIDR — метка). Ручной ввод убирается. Подсеть из URL (переход из аналитики), которой нет в списке, добавляется отдельным выбранным пунктом. Если подсети не настроены — список недоступен, рядом ссылка на/settingsс их настройкой. - Egress + ssh/tcp/tls (таких проверок нет): чарт показывает «Для этого сочетания проверок нет», как и пустая таблица.
Изменения
1. БД (internal/db)
- Выделить сборку условий
FROM/WHEREизListRegistryPageв функцию, которую используют и список, и новая выборка (поведение списка не меняется; существующие тесты — страховка). - Новый файл
queries_registry_breakdown.go:RegistryBreakdown(ctx, filter) (*Breakdown, error): требуетLevelиFamily(иначеErrValidation); один запросGROUP BYпоtarget(egress) илиsource(ingress) поверх проверок среза:COUNT(*),SUM(success). Возвращает группу (target|site), число адресов, строки{key, total, ok}.RegistryBreakdownList(ctx, filter, key): строки проверок выбранного ключа с адресом, типом, валидатором, задержкой, деталью, временем; провалы сверху.
- Индексы
idx_checks_runиidx_checks_registry_cycleуже подходят; проверитьEXPLAIN QUERY PLAN.
2. HTTP API (internal/httpapi)
GET /api/v1/admin/registry/breakdown— те же параметры, что у реестра (q,last_result,run,subnet,direction,protocol); безdirectionилиprotocol—400. Ответ:{group, direction, protocol, run, addresses, rows:[{key,label,total,ok}]}; имена площадок подставляются здесь.GET /api/v1/admin/registry/breakdown/list?…&key=— таблица{columns, rows};format=csv— файл. Неизвестный ключ —404.- Маршруты — в таблицу маршрутов (
TestRouteTableIsClassified: admin-доступ).docs/API.md— описание и примеры.
3. Дашборд (internal/dashboard)
client.go:GetRegistryBreakdown,GetRegistryBreakdownList,…CSV.handlers_registry.go: при выбранных направлении и протоколе запросить чарт и передать в шаблон; ошибка чарта показывается в самом блоке, страница не ломается. Прокси-маршрутыGET /registry/breakdown/listиGET /registry/breakdown/csv(какanalytics/lists).templates/registry.html:- поле «Подсеть» →
<select>(htmx-атрибуты те же, что у соседних полей); - блок
registry_breakdownвнутриregistry_table(обновляется вместе с таблицей): заголовок «Успешные проверки по целям» / «…по площадкам», тип проверки, строки-кнопкиan-bar-rowс серверной отрисовкой полос (без JS-библиотек), подпись и подсказка про учёт проверок; - подключение
analytics.css,analytics-dialog.js, шаблонаanalytics_dialogи новогоstatic/registry.js.
- поле «Подсеть» →
static/registry.js(небольшой): делегированный клик по[data-bd-key](переживает htmx-замену), запрос списка с текущей строкой фильтров из адресной строки,AnalyticsDialog.load/fillс подсказками столбцов и ссылкой на CSV.- Проверить, что
analytics.cssне конфликтует со стилями реестра (все классы с префиксомan-; токены темы общие). Если есть конфликт — вынести нужные правила вdashboard.css. - Доступность: строки —
<button>, фокус с клавиатуры,aria-labelс числами; светлая и тёмная темы; мобильная раскладка (строка переносится, полоса остаётся).
4. Тесты (минимум)
internal/db: один табличный тест выборок — egress по целям, ingress по площадкам, срез запуска, подсеть, статус в области, список по ключу (порядок, провалы сверху),ErrValidationбез направления или протокола.internal/httpapi:400без параметров, форма ответа, список и CSV,404на неизвестный ключ.internal/dashboard: чарт есть при направлении + протоколе и отсутствует без них; подсеть —<select>с выбранным пунктом и пунктом из URL; прокси списка.TestScaleSmoke6440: чарт и список на 6440 адресов в пределах лимита.- Правки существующих тестов, где проверялось поле ввода подсети.
Порядок работы
- Утвердить план и «Решения».
- Субагент (Sonnet 5.5, Medium effort) пишет код и тесты: п.1 → п.2 → п.3 → п.4.
- Ревью,
gofmt,go build ./... && go vet ./... && go test -count=1 ./...,EXPLAIN QUERY PLAN. - Проверка на тестовом стенде
civ-test(порты 18081/18091): пересобрать образы тегаfilters,docker compose up -dв/opt/lvraid/claude/civ-teststand, снять замеры на копии боевой БД. Боевые контейнеры не трогаем. - Summary в
docs/changes/…-summary.md; обновитьREADME.md,docs/API.md,docs/USAGE.md; обновить граф/graphify . --update.
Риски
- Объём списка: до 6–7 тысяч адресов в диалоге, как в аналитике; для CSV — серверная выгрузка.
- Время ответа чарта на 1 млн проверок: ожидается долей секунды (один
GROUP BYпо срезу); проверить замером на копии БД стенда. При деградации — не считать чарт, пока не выбраны оба фильтра (уже предусмотрено). - Названия площадок и целей берутся из текущей конфигурации: удалённая площадка отображается как
site-N. - Незавершённый запуск даёт частичные данные — как и таблица.
- Подсеть только из списка: чтобы отфильтровать произвольный CIDR, подсеть нужно добавить в настройки (ссылка рядом с полем).