Диагностика и Runbook
Этот раздел нужен для повседневной эксплуатации платформы: когда данные не доезжают, экраны пустеют, источники начинают публиковать 0, а пайплайн выглядит “живым”, но результата почти нет.
Как мыслить о проблемах в NPPWEB
Почти любую проблему удобно разбирать по четырём слоям:
Доступ к внешнему источнику— площадка недоступна, требует proxy, изменила HTML или API.Сбор и транспорт—scrape-helperне собирает карточки или не публикует raw-события.Нормализация и ingest—processing-workerне может преобразовать payload или отправить его в backend.Домен и аналитика— backend принял данные, но UI-срез почти пуст из-за фильтров, связей или бизнес-логики.
Эта последовательность важна: не стоит начинать с frontend, если SourceRun уже показывает FAILED, и не стоит переписывать парсер, если проблема в том, что аналитика читает только часть уже собранных сущностей.
Быстрая triage-проверка
1. Живы ли контейнеры
cd infra
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml psОбычно ожидается:
postgres,rabbitmq,minio,backend-api,frontend—healthyprocessing-worker,scraper-service—Upminio-init—Exited (0)
2. Жив ли backend
curl http://localhost:3000/api/health
curl http://localhost:3000/api/health/readyЕсли backend не готов, дальнейшая диагностика аналитики бессмысленна: worker не сможет сделать ingest, а frontend не сможет получить GraphQL.
3. Жив ли scraper control-plane
curl http://localhost:3001/health
curl http://localhost:3001/api/runtime-statusЭти endpoints помогают понять:
- видит ли backend
scraper-service; - какие источники реально загружены;
- не открыт ли circuit breaker;
- не отключён ли
autoRunEnabled.
4. Есть ли движение в очередях
RabbitMQ management обычно доступен на http://localhost:15672.
Особенно полезно смотреть очереди:
source.raw.v1source.raw.retry.v1source.raw.dlq.v1source.normalized.v1
Если source.raw.v1 пустая и не растёт, проблема ближе к scrape-helper. Если raw есть, но ingest не происходит, проблема ближе к processing-worker или backend.
Главные симптомы и как их читать
Источник запускается, но собирает 0
Смотреть в таком порядке:
SourceRun.errorMessageи статус запуска.- Логи
scrape-helper. - Прямой доступ к площадке из текущего контура.
- Не стали ли фильтры источника слишком узкими.
Типичные причины:
- площадка не отвечает без
HTTPS_PROXY; - источник поменял HTML или API;
- поиск возвращает данные, но внутренняя фильтрация считает их нерелевантными;
- лимит
MAX_ITEMSслишком маленький, и в выборку не попадают нужные записи; - нужный источник вообще не включён в
ENABLED_SOURCES.
Есть SUCCESS, но аналитика пустая
Это особенно частый случай и он не означает, что пайплайн полностью сломан.
Проверять нужно:
- что
itemsDiscovered > 0; - что
itemsPublished > 0; - какие сущности реально создаются в backend;
- не опирается ли экран только на часть доменной модели.
Примеры:
- экран поставщиков может зависеть только от
Procurementс уже заполненнымsupplierId; RNPиFNSмогут успешно пополнять свои собственные таблицы, но не участвовать в конкретном аналитическом срезе;Fedresursможет ломать watchlist поставщиков, даже если закупочный контур сам по себе жив.
Массовые connect timeout или fetch failed
Это почти всегда сетевой вопрос.
Проверить:
- заданы ли
HTTP_PROXYиHTTPS_PROXY; - совпадает ли
NO_PROXYс внутренними сервисами; - включён ли профиль
proxyв deploy-контуре; - есть ли
xray-local/config.json, если используетсяxray-proxy.
Если proxy указан, но сам контейнер не поднят, scrape-helper начнёт массово падать на всех внешних площадках.
HTTP 434 или 403 от zakupki.gov.ru
Это обычно признак того, что площадка режет автоматизированный доступ.
Полезно проверить:
- проходит ли трафик через корректный proxy-маршрут;
- не устарели ли HTTP-заголовки запроса;
- не изменилась ли поисковая выдача;
- не сработал ли circuit breaker после серии ошибок.
Fedresurs стабильно падает
Для Fedresurs нужно помнить, что публичный HTML-список больше не является надёжным способом сбора.
Production-сценарий теперь такой:
- задать
FEDRESURS_API_URL; - задать
FEDRESURS_API_LOGIN; - задать
FEDRESURS_API_PASSWORD; - проверять, что API действительно возвращает сообщения за расчётное окно.
Если логин и пароль не заданы, ждать устойчивого наполнения через HTML уже не стоит.
Полезные команды
Compose logs
cd infra
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml logs backend-api processing-worker scraper-service frontendДля длительной диагностики:
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml logs -f scraper-service processing-worker backend-apiРучной запуск конкретного источника
curl -X POST http://localhost:3001/api/source-runs \
-H 'content-type: application/json' \
-d '{"sourceCodes":["eis","rnp"]}'Так удобнее изолировать проблему по одному или двум адаптерам, не дожидаясь общего cron-цикла.
Проверка runtime scraper-service
curl http://localhost:3001/api/runtime-config
curl http://localhost:3001/api/runtime-statusЭто помогает увидеть:
- текущее cron-расписание;
- флаг
autoRunEnabled; - список реально загруженных источников;
- активные запуски;
- circuit breaker states.
Если проблема похожа на data-gap, а не на outage
Когда система технически здорова, но бизнес-экраны пустоваты, полезно проверить:
- какие источники реально формируют конкретный экран;
- из каких таблиц и сущностей backend собирает агрегаты;
- не требуется ли связь
supplierId,riskSignalsили другое доменное обогащение; - не узок ли аналитический период, например
last90Days.
То есть вопрос часто звучит не как “почему сервис упал”, а как “почему экран использует только малую часть уже существующих данных”.
Рекомендованный порядок действий при инциденте
- Подтвердить симптом на UI или в
SourceRun. - Проверить health основных сервисов.
- Проверить runtime
scraper-service. - Посмотреть compose logs.
- Отделить outage внешнего источника от пустой аналитики.
- Зафиксировать точку потери данных:
collect,publish raw,normalize,ingest,aggregate,render. - Только после этого вносить кодовые изменения.