# ✨ Считать вызовы, отказы и длительность по каждому внешнему сервису - **Тип:** feature - **Категория:** Очередь — Метрики внешних сервисов пишутся в выбранном словаре, а не переписываются потом. - **Зачем:** Ни у Telegram, ни у Object Storage, ни у SpeechKit нет ни одной метрики: отказ внешнего сервиса виден только строкой в журнале контейнера. У каждого внешнего сервиса появляются вызовы, отказы и длительность, а расход на платные сервисы становится виден числом. Внешних сервисов сегодня четыре — Telegram, Object Storage, SpeechKit и `ffmpeg`/`ffprobe` как внешний процесс; пятым станет языковая модель. Метрика заводится одной формой на все, чтобы шестой сервис не приносил шестого способа считать. ## Затрагивает - `internal/metrics` — форма метрики внешнего вызова: имя сервиса, операция, исход, гистограмма длительности; - адаптеры `internal/adapter/*` — место, где вызов оборачивается замером; - `docs/architecture.md`, раздел эксплуатации — перечень метрик; - `docs/conventions/` — правило: новый внешний вызов приходит со своей меткой, а не со своей метрикой. ## Критерии приёмки - У каждого из четырёх внешних сервисов есть счётчик вызовов, счётчик отказов и гистограмма длительности. Оракул — тест: прогнать по одному вызову каждого адаптера с подставным собеседником и снять `/metrics`. - Отказ внешнего сервиса виден отдельно от успеха и не теряется в общем счётчике. Оракул — тест: подставной собеседник отвечает отказом, метка исхода в метрике отличается. - Минуты распознавания и объём заливки видны числом. Оракул — тест: после шага распознавания счётчик минут вырос на длительность записи, а после заливки в Object Storage счётчик объёма — на размер файла. ## Рамки Трассировку здесь не заводим — чем развивать наблюдаемость, решает разведка `opentelemetry-fit`; эта задача остаётся в том словаре, который она выберет. Учёт по пользователям — задача `usage-accounting`, здесь метрики сервисные.