Продуктовые счётчики и дашборд воронки #3491

Merged
lekss361 merged 1 commit from feat/3471-product-metrics-dashboard into main 2026-09-12 11:45:51 +00:00
Owner

Зачем

Мониторинг видел только инфраструктуру. Сколько прошло оценок, лидов, входов и обращений в поддержку, было видно лишь запросом в базу.

Откуда взят список

Из таблицы user_events на проде: estimate_request 294, login 290, login_success 97, login_failed 453. Счётчики повторяют реально происходящие события, а не воображаемые.

Счётчики

Мера: оценки с исходом, подсказки адреса, выгруженные отчёты, лиды, сообщения в поддержку по каналу, входы по результату.
Птица: выгрузки отчётов по формату.

Все лейблы — фиксированные литералы из места вызова. Ни имени пользователя, ни адреса, ни идентификатора оценки, ни кадастрового номера в кардинальность не попадает.

Дашборд

ops/metrics/grafana/dashboards/product.json, uid gendesign-product. Воронка Меры и форматы выгрузок Птицы, часовые окна. Provisioning общий с apps.json, каталог сканируется целиком.

Test plan

  • backend/tests/test_3471_product_metrics.py и tradein-mvp/backend/tests/test_3471_product_metrics.py — 8/8 и 14/14 в настоящих окружениях
  • JSON дашборда валиден, ruff чист
  • у job apps в Alloy нет фильтра по имени метрики, новые ряды пройдут без правок
  • после деплоя: /metrics обоих бэкендов отдаёт новые ряды, панели рисуются

Refs #3471

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Зачем Мониторинг видел только инфраструктуру. Сколько прошло оценок, лидов, входов и обращений в поддержку, было видно лишь запросом в базу. ## Откуда взят список Из таблицы `user_events` на проде: `estimate_request` 294, `login` 290, `login_success` 97, `login_failed` 453. Счётчики повторяют реально происходящие события, а не воображаемые. ## Счётчики Мера: оценки с исходом, подсказки адреса, выгруженные отчёты, лиды, сообщения в поддержку по каналу, входы по результату. Птица: выгрузки отчётов по формату. Все лейблы — фиксированные литералы из места вызова. Ни имени пользователя, ни адреса, ни идентификатора оценки, ни кадастрового номера в кардинальность не попадает. ## Дашборд `ops/metrics/grafana/dashboards/product.json`, uid `gendesign-product`. Воронка Меры и форматы выгрузок Птицы, часовые окна. Provisioning общий с `apps.json`, каталог сканируется целиком. ## Test plan - [x] `backend/tests/test_3471_product_metrics.py` и `tradein-mvp/backend/tests/test_3471_product_metrics.py` — 8/8 и 14/14 в настоящих окружениях - [x] JSON дашборда валиден, ruff чист - [x] у job `apps` в Alloy нет фильтра по имени метрики, новые ряды пройдут без правок - [ ] после деплоя: `/metrics` обоих бэкендов отдаёт новые ряды, панели рисуются Refs #3471 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-12 11:26:18 +00:00
feat(metrics): продуктовые счётчики Prometheus для Меры и Птицы + дашборд
All checks were successful
CI / backend-tests (pull_request) Successful in 17m59s
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 12s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m18s
CI Trade-In / backend-tests (pull_request) Successful in 5m59s
690f1ef5d2
Владелец попросил вывести продукт в Графану — до этого там были только
технические панели (запросы/латентность/память). Список счётчиков взят из
реально пишущихся событий, а не выдуман:

Мера (tradein-mvp/backend/app/observability/metrics.py):
- mera_estimates_total{outcome=ok|insufficient_data} — POST /estimate,
  зеркалит user_events.event_type=estimate_request (294 строки в БД),
  insufficient_data — не ошибка, а исход без аналогов.
- mera_address_suggestions_total{found=yes|no} — GET /geocode/suggest,
  своего user_events-события у ручки не было.
- mera_reports_exported_total (без лейблов) — GET /estimate/{id}/pdf.
- mera_leads_total (без лейблов) — POST /trade-in/lead.
- mera_support_messages_total{channel=web|anon} — POST /support/messages
  и /support/anon/messages, счётчик после успешной доставки в Telegram.
- mera_logins_total{result=success|failed} — рядом с user_events
  login_success/login_failed в auth.py (97/453 строк в БД).

Птица (backend/app/observability/metrics.py):
- sitefinder_reports_exported_total{format} — GET .../forecast/export
  (md/json/tg/docx/pptx/pdf) и POST .../best-layouts/pdf.

Метки везде — фиксированный литерал из места вызова (outcome/found/channel/
result/format), никогда username/адрес/estimate_id/кадастровый номер —
это ровно то, что взрывает кардинальность ряда у Prometheus.

Дашборд ops/metrics/grafana/dashboards/product.json ("Продуктовые метрики",
uid gendesign-product) — воронка Меры (оценки/подсказки/лиды/отчёты/входы/
поддержка) + экспорт форматов Птицы, часовые increase()-панели без
стекирования (на соседней панели оно уже давало ложную тревогу, PR #3474).
Provisioning тот же, что у apps.json — сканирует директорию, отдельного
конфига не нужно.

ops/metrics/alloy/alloy-apps.alloy проверен: у job "apps" нет relabel-
фильтра по __name__ (в отличие от cadvisor) — новые счётчики уходят в
remote_write как есть, правки не потребовалось.

Refs #3471
lekss361 merged commit bbf70a3283 into main 2026-09-12 11:45:51 +00:00
lekss361 deleted branch feat/3471-product-metrics-dashboard 2026-09-12 11:45:51 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3491
No description provided.