ingest: закрыты мелочи приёма — вырожденное имя, контракт Result, корреляция add
- имя раздачи нормализуется на границе разбора: вырожденное `-` (metainfo.NoName) даёт пустое имя, пробельное схлопывается — сентинел больше не доходит ни до контекста распознавания, ни до source_ref, ни до подсказки вывода имени - контракт «на любом пути ошибки приёма результат нулевой» объявлен в ingest и удерживается структурно; три транспорта перестали обещать идентификатор, которого нет, и коррелируют отказ по request_id - scoped-логгер загрузки ставится до вызова внешнего сервиса в семи командах воркера — записи об отказе qBittorrent и метабаз получили download_id и infohash; граница разбора bencode записана в docs/research
This commit is contained in:
@@ -66,7 +66,15 @@ jellybit — **приложение, а не библиотека**: внешн
|
||||
- **+ корреляционный ключ** для владельца — `download_id` (если операция
|
||||
к загрузке) либо `request_id`, чтобы по нему найти полную ошибку в логах.
|
||||
Пример: «При обработке загрузки произошла ошибка, download_id=12345», а
|
||||
не «произошла ошибка» и не сырой текст;
|
||||
не «произошла ошибка» и не сырой текст.
|
||||
**Ключ есть не у всякого транспорта, и это называется вслух.** `request_id`
|
||||
— понятие HTTP-границы (chi `RequestID`); у Telegram и CLI его нет. Если
|
||||
операция ещё не завела загрузку (отказ приёма), у такого транспорта ключа
|
||||
нет вовсе — тогда сообщение остаётся без якоря, а диагностика ищется по
|
||||
записи доменной границы (`capability`, `infohash`). Заводить транспорту
|
||||
собственный идентификатор запроса ради ключа — решение уровня спеки, а не
|
||||
умолчание: второй канал корреляции рядом с существующим дороже, чем
|
||||
отсутствие ключа;
|
||||
- **маппинг доменной ошибки → статус/сообщение** (в jellybit —
|
||||
`httpapi.classifyErr`, единая точка для REST и веб-UI):
|
||||
|
||||
|
||||
@@ -204,6 +204,11 @@ Go-ошибки логируем как атрибут, не как текст
|
||||
|
||||
- Входящие HTTP-запросы логируем с полями `http.method`, `http.route`,
|
||||
`http.status_code`, `duration_ms`, `transport` (`http`/`web`/`telegram`).
|
||||
- **Поле, которое уже даёт scoped-логгер, руками не доклеиваем.** Команда,
|
||||
положившая scoped-логгер в `ctx`, не передаёт `download_id` ещё и аргументом
|
||||
записи: в JSON получается дублирующийся ключ, и строгий потребитель молча
|
||||
оставит одно из значений. Правило следует из «логгер несёт ключи сам» и
|
||||
проверяется чтением — линтером не выражается.
|
||||
- Для корреляции HTTP-запроса допустим `request_id` (напр. chi `RequestID`) —
|
||||
это отдельный слой от корреляции загрузки по `download_id` и не противоречит
|
||||
отказу от `trace_id`. Если запрос порождает загрузку — связь даёт
|
||||
|
||||
Reference in New Issue
Block a user