Приём торрента через Telegram молча падал без записи в логах. Разобрали цепочку и починили логирование/обработку ошибок по конвенции logging.md (логирует граница домена один раз, транспорты — нет). Доменная граница логирует исход: - ingest.Ingest: сбой БД → ERROR, невалидный источник → DEBUG; - команды воркера (Apply/Cancel/Retry/Refine/…) — единый чокпоинт logCmd (ERROR для инфраструктурного сбоя; DEBUG для conflict/not-ready/not-found), закрывает и Telegram-, и HTTP-путь; дублирующие ERROR-логи в tgbot сняты; - внутренний логгер tgbotapi заведён в slog: сбои long-poll getUpdates больше не уходят в stdlib log мимо структурированных логов; - тихое закрытие канала обновлений бота → ERROR. Защита секретов (инвариант «секреты не в логи»): - общий logging.SanitizeErr убирает URL из *url.Error; - закрыты утечки токена бота (getMe на старте, getFile, Send/Request) и api_key TMDB (query-параметр, попадавший в *url.Error на ERROR); - покрыто тестом internal/logging/sanitize_test.go. Ревью двумя сабагентами (fable): инфраструктурные и доменные ошибки. Отложено (не в scope этого коммита): обёртка ErrConflict в Cancel/Defer/Retry и классификация 500→409/400, обновление docs/conventions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
1.1 KiB
Go
25 lines
1.1 KiB
Go
package logging
|
|
|
|
import (
|
|
"errors"
|
|
"net/url"
|
|
)
|
|
|
|
// SanitizeErr убирает из ошибки HTTP-транспорта URL запроса и возвращает только
|
|
// первопричину. Ошибки клиента net/http — `*url.Error`, чей текст встраивает
|
|
// полный URL, а URL может нести секрет: токен бота Telegram в пути
|
|
// (`…/bot<TOKEN>/<method>`) или api_key TMDB в query
|
|
// (`…/search/movie?api_key=<SECRET>&…`). Логировать или оборачивать такую ошибку
|
|
// как есть нельзя — секрет утечёт в логи (инвариант «секреты не в логи», см.
|
|
// logging.md, раздел «Безопасность»).
|
|
//
|
|
// Логическая операция при этом не теряется: она пишется отдельным полем
|
|
// (`ext.operation`) на границе клиента. Не `*url.Error` — возвращаем как есть.
|
|
func SanitizeErr(err error) error {
|
|
var ue *url.Error
|
|
if errors.As(err, &ue) {
|
|
return ue.Err
|
|
}
|
|
return err
|
|
}
|