- Правило покрытия получило второй разряд (условный, как у точек), запрет вырождения формы и счёт содержательных элементов ряда: скелет из скаляров и ряд из null больше не затирают маршрут. Победитель внутри доставки стал функцией множества версий — общим помощником с точками, — а провенанс поднимается и при совпавшем хеше, иначе отложенная доставка возвращала витрину к прежнему содержимому. - Одно поле не того типа больше не уносит сущность, а пропуски видны в учётной записи доставки (миграция 00008, NULL = «не измерялось»); каноническая форма считается один раз и вне транзакции; откат бинаря поверх новой схемы отказывает на старте; текст ошибки разбора не несёт значений из тела. - Ревью кода профилем deep (девять проходов) нашло две регрессии и обе закрыты: безусловный второй разряд запирал законный досчёт навсегда, а выбор победителя был квадратичен по числу присланных версий одного ключа.
35 lines
2.9 KiB
Markdown
35 lines
2.9 KiB
Markdown
# Наблюдаемость: /stats
|
||
|
||
**Приоритет:** средний
|
||
|
||
Тихо сломавшаяся автоматизация — главный эксплуатационный риск коллектора:
|
||
данные просто перестают приходить, и заметить это можно только по молчанию.
|
||
Расписание HAE — пожелание, а не гарантия (находка 28), так что молчание
|
||
случается штатно.
|
||
|
||
`/stats` отвечает на «жив ли поток» без чтения логов: последняя доставка по
|
||
каждой автоматизации, счётчики за сутки, тишина в часах, доля доставок с
|
||
ошибкой разбора, строки без кода в словаре категориальных значений.
|
||
|
||
Готово, когда по одному запросу видно, какая из автоматизаций замолчала и
|
||
когда.
|
||
|
||
Отдельной строкой — **отставание фоновой свёртки**: длина очереди
|
||
(`parse_status = 'pending'`) и возраст самой старой неразобранной доставки.
|
||
Сегодня об этом говорят только две метки в логе (`WARN` «доставка ждала свёртки
|
||
дольше пяти минут» и `INFO` о размере задолженности при старте), а `/healthz`
|
||
статичен и здорового сервиса от сервиса с сотней несвёрнутых тел не отличает.
|
||
Пришло из задачи «Разнести ответ приёма и свёртку доставки»: там числа
|
||
намеренно не заводились, чтобы не предрешать форму счётчиков этой задачи.
|
||
|
||
Длина очереди обязана быть видна **и без `WARN`**. После миграции, переводящей
|
||
доставки в `pending`, весь исторический бэклог встаёт в очередь перед свежими
|
||
доставками, а `warnLag` на это время намеренно подавлен (`startupDone`) — то
|
||
есть отставание по конструкции не WARN-ится ровно тогда, когда оно максимально,
|
||
и бэклог идёт молча при зелёном `/healthz`. Пришло из дозакрытия находок ревью
|
||
по слиянию сущностей (проход `ops`, находка O1); оракула нет — он потребовал бы
|
||
десятков тысяч доставок.
|
||
|
||
Активное уведомление — отдельная задача, здесь только факт.
|
||
|