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