- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`, канал несёт только бит «есть работа». Переполнять нечего, падение процесса очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а не отдельный код. Классификация исхода общая с пересборкой журнала. - Исход разбора начал отражать доставку, а не обстоятельства: отмена и занятость базы статус не меняют (иначе конкуренция за базу выводила бы доставку из очереди навсегда), паника свёртки больше не валит процесс, а учёт доставки идёт через транзакцию с повторами. - Длинный бюджет ответа выдан маршруту приёма, а не всему серверу: `write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с остальных маршрутов.
27 lines
2.0 KiB
Markdown
27 lines
2.0 KiB
Markdown
# Наблюдаемость: /stats
|
|
|
|
**Приоритет:** средний
|
|
|
|
Тихо сломавшаяся автоматизация — главный эксплуатационный риск коллектора:
|
|
данные просто перестают приходить, и заметить это можно только по молчанию.
|
|
Расписание HAE — пожелание, а не гарантия (находка 28), так что молчание
|
|
случается штатно.
|
|
|
|
`/stats` отвечает на «жив ли поток» без чтения логов: последняя доставка по
|
|
каждой автоматизации, счётчики за сутки, тишина в часах, доля доставок с
|
|
ошибкой разбора, строки без кода в словаре категориальных значений.
|
|
|
|
Готово, когда по одному запросу видно, какая из автоматизаций замолчала и
|
|
когда.
|
|
|
|
Отдельной строкой — **отставание фоновой свёртки**: длина очереди
|
|
(`parse_status = 'pending'`) и возраст самой старой неразобранной доставки.
|
|
Сегодня об этом говорят только две метки в логе (`WARN` «доставка ждала свёртки
|
|
дольше пяти минут» и `INFO` о размере задолженности при старте), а `/healthz`
|
|
статичен и здорового сервиса от сервиса с сотней несвёрнутых тел не отличает.
|
|
Пришло из задачи «Разнести ответ приёма и свёртку доставки»: там числа
|
|
намеренно не заводились, чтобы не предрешать форму счётчиков этой задачи.
|
|
|
|
Активное уведомление — отдельная задача, здесь только факт.
|
|
|