Collectors record the result of every source (schema v3, table source_status); /health reports failing sources (failures in a row >= source_failure_threshold) and turns degraded; GET /sources shows the full state; runs end with a summary log line instead of "data saved". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
Итоги: наблюдаемость (сбои источников, здоровье, логи)
План: docs/plan-observability.md. Закрывает наблюдения 2 и 5 анализа (analysis-2026-09-21.md). Метрики Prometheus не входили (решение пользователя).
Сделано
- Состояние источников (
db.py): схема версии 3, таблицаsource_status(kind, source, last_attempt, last_success, failures, error_kind); автоматическая миграция 2 -> 3. Функцииrecord_source_result,forget_unconfigured,source_statuses,address_counts;purge_sourceудаляет и состояние. Запись идёт в той же транзакции, что и данные. - Сборщики (
cidr_collector.py): результат по каждому источнику при каждом запуске (успех обнуляетfailures, сбой увеличивает,last_successпри сбое не меняется);classify_errorдаёт категорию без деталей (timeout,connection,http_429/4xx/5xx,invalid_response,dns,no_global_addresses,unknown); состояние удалённых из конфигурации источников очищается при очередном сборе; порогfailure_threshold(source_failure_threshold, по умолчанию 3). /health(api_server.py): блокsources(по типам:totalи только неисправные),degradedпри неисправных источниках; остальные поля не менялись.GET /sources: все настроенные источники с числом адресов, временем попытки и успеха, сбоями и категорией.- Логи: итоговая строка запуска («ASN collection finished: 6 sources, 5 ok, 1 failed, +12/-3 prefixes», для FQDN так же); сообщения «data saved» убраны (наблюдение 5).
- README:
/health,/sources, ключsource_failure_threshold, схема базы, лог. - Тесты: 2 новых (сборщики: запись успеха и сбоев, рост и сброс счётчика, очистка удалённого источника, категории ошибок и миграция с версии 2; API:
okдо порога иdegradedпосле, ответ без текста ошибки,/sources, настройка порога). Всего 30, в контейнере 30 passed.
Проверка
- Миграция: база версии 2, созданная кодом до изменения (
SCHEMA_VERSION = 2в предыдущем коммите), открыта новым кодом:user_version3, все адреса и журнал на месте, состояние источников пусто. - Отдельные процессы: демон с подменённым адресом RIPEstat (локальный сервер отвечает 503) и API: после первых двух запусков
/healthok, после третьегоdegradedс{"source": "62041", "failures": 3, "error_kind": "http_5xx"};/sourcesпоказывает 0 адресов и 3 сбоя; после «починки» сервераok, 1 адрес,failures: 0. В логе итоговые строки запусков, сообщений «data saved» нет. - Docker Compose (отдельный проект, порт 18000, стенд убран): FQDN
example.comиnonexistent.invalid; после трёх ручных сборовdegraded, неисправныйnonexistent.invalidсerror_kind: dns,example.comс 4 адресами; оба сервисаhealthy. - В первом запуске проверки миграции сценарий упал на моей опечатке (обращение к закрытой сессии после записи), сама миграция прошла; версию «до» подтвердил по коду предыдущего коммита.
Замечания
- Порог 3 при суточном расписании FQDN означает три дня до
degraded; порог настраивается (source_failure_threshold). - Пустой корректный ответ RIPEstat считается успехом: такой источник виден в
/sourcesпоaddresses: 0, ноdegradedне вызывает. - Категория
no_global_addressesсчитается сбоем: имя, разрешившееся только в частные адреса при выключенномallow_non_global_ips, через три запуска дастdegraded. /healthпо-прежнему отвечает HTTP 200 приdegraded; Docker healthcheck из-за внешних сбоев контейнеры не перезапускает.- Не вошло: Prometheus, уведомления и алерты, свежесть резервных копий как признак здоровья, команда CLI
status.