Files
jellybit/docs/tasks/items/background-error-noise.md
T
av 66d39297c5 docs: проект переведён на канон документов версии 4
- каталог задач: PLAN.md → ROADMAP.md с каноническими секциями, все 44
  записи получили тип, заголовки приведены к форме своего типа
- расхождения, найденные судьями канона: исключения инварианта «источник
  неприкосновенен», инвариант про один активный infohash, UTC в logging.md,
  поведение из architecture.md заменено ссылками на спеки
- триггеры профиля ревью переписаны под умолчание standard
2026-08-06 13:32:06 +03:00

4.3 KiB
Raw Blame History

🐞 Не штормить ERROR при недоступном qBittorrent и эскалировать устойчивый сбой тика

  • Тип: fix
  • Категория: Инфраструктура
  • Зачем: Остаток задачи логирования: ext.* ERROR-шторм при недоступном qBittorrent + эскалация устойчивого сбоя тика (ревью Fable)
  • Теги: goal:operational-resilience

Остаток от задачи «классификация доменных ошибок + конвенции логирования» (основное реализовано, см. ниже). Здесь — два смежных пункта про уровень повторяющихся сбоев фоновых циклов, каждый требует небольшого решения, а не только правки.

Что уже сделано (не переоткрывать)

Коммит f8fb4fa (Tier A) + коммит этой задачи закрыли:

  • Классификация доменных ошибок: sentinel worker.ErrInvalidInput→400; обёртки ErrConflict в Cancel/Retry/Defer/Undo; layout.ErrCollision→409 в classifyErr и ветка в tgbot; logCmd относит новые классы в DEBUG.
  • Конвенции: logging.md — команды воркера = доменная граница, таблица уровней доменных отказов (граница команды vs асинхронная стадия), правило про *url.Error/секреты в URL, канон категории state transition (унифицированы cancel/retry/relink/recovery). errors.md — таблица маппинга ошибка→статус, развилка «транзиентный ответ vs персистентная диагностика» решена как (а): error_msg/reasons — операторская поверхность владельца (сырой текст ок, секреты запрещены; аудит показал, что секреты туда не текут).
  • Мелочи: reason-коды const-блок; лог-поля iddownload_id; preview WARN; комментарий у parseIgnored.

Остаток

ERROR-шторм при недоступном qBittorrent

Клиент qbt логирует ext.* FailureERROR на каждом тике поллинга (torrents/info, internal/qbt/qbt.go), пока qBittorrent недоступен (рестарт демона, сеть). Домен уже пишет poll failed = WARN (по новой конвенции), но транспортная ext.*-запись остаётся ERROR по правилу ext-конвенции («сервис недоступен → ERROR»). При частом поллинге это шумит.

Развилка (решить до правки):

  • (а) Ввести у logging.ExtCall вариант с пониженным уровнем для рутинно-частых вызовов (симметрично SuccessDebug) — поллинг-вызовы (torrents/info) на транзиентном сбое пишут WARN, не ERROR;
  • (б) Дедуп/circuit-breaker: первый ERROR, дальше тишина до восстановления;
  • (в) Оставить как есть, признав ext.* ERROR легитимным сигналом «зависимость лежит» (тогда шум гасить уровнем сбора, а не кодом).

Эскалация устойчивого сбоя тика

Сейчас транзиентный сбой тика = WARN всегда. Договорённость на будущее (logging.md): устойчивый сбой N тиков подряд эскалировать в ERROR (реальная деградация, а не разовый промах). Не реализовано — нужен счётчик подряд-сбоев по циклу и порог в конфиге.

Вердикт: мелкая надёжностная полировка, не блокер. Делать вместе (обе про уровень сбоев фоновых циклов) или отдельной строкой.