tasks: очередь расставлена от базы к деталям

- порядок беклога и роадмапа назначен слоями: проверки, которым можно
  верить → долги входа → владелец записи и контракт API → конвейер под
  тестами → приложение и возможности поверх; у каждого движения записана
  причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
  одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
  по очереди; исправлены ссылки на несуществующий repo/sqlite и на
  отменённую разведку об очереди.
This commit is contained in:
av
2026-08-12 20:48:53 +03:00
parent ddc34b3182
commit 8739b18a9f
73 changed files with 490 additions and 139 deletions
+41
View File
@@ -0,0 +1,41 @@
# ✨ Считать вызовы, отказы и длительность по каждому внешнему сервису
- **Тип:** feature
- **Категория:** Очередь — Метрики внешних сервисов пишутся в выбранном словаре, а не переписываются потом.
- **Зачем:** Ни у Telegram, ни у Object Storage, ни у SpeechKit нет ни одной метрики: отказ внешнего сервиса виден только строкой в журнале контейнера.
- **Теги:** goal:service-observability
Двигает пункты 2 и 5 «Завершения» цели: у каждого внешнего сервиса появляются
вызовы, отказы и длительность, а расход на платные сервисы виден числом.
Внешних сервисов сегодня четыре — Telegram, Object Storage, SpeechKit и
`ffmpeg`/`ffprobe` как внешний процесс; пятым станет языковая модель. Метрика
заводится одной формой на все, чтобы шестой сервис не приносил шестого способа
считать.
## Затрагивает
- `internal/metrics` — форма метрики внешнего вызова: имя сервиса, операция,
исход, гистограмма длительности;
- адаптеры `internal/adapter/*` — место, где вызов оборачивается замером;
- `docs/architecture.md`, раздел эксплуатации — перечень метрик;
- `docs/conventions/` — правило: новый внешний вызов приходит со своей меткой,
а не со своей метрикой.
## Критерии приёмки
- У каждого из четырёх внешних сервисов есть счётчик вызовов, счётчик отказов и
гистограмма длительности. Оракул — тест: прогнать по одному вызову каждого
адаптера с подставным собеседником и снять `/metrics`.
- Отказ внешнего сервиса виден отдельно от успеха и не теряется в общем счётчике.
Оракул — тест: подставной собеседник отвечает отказом, метка исхода в метрике
отличается.
- Минуты распознавания и объём заливки видны числом. Оракул — тест: после шага
распознавания счётчик минут вырос на длительность записи, а после заливки в
Object Storage счётчик объёма — на размер файла.
## Рамки
Трассировку здесь не заводим — чем развивать наблюдаемость, решает разведка
`opentelemetry-fit`; эта задача остаётся в том словаре, который она выберет.
Учёт по пользователям — задача `usage-accounting`, здесь метрики сервисные.