Deal — единая кодовая база
ci / build-test (push) Canceled after 0s

SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 23:56:47 +03:00
commit 27c7831910
1383 changed files with 158436 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
# Правила алертов Prometheus для процессов Deal (этап 12, пакет A; Ruling 7 этапа 7).
#
# Подключаются в deploy/observability/prometheus.yml через `rule_files`. Источник метрик — эндпоинты
# /metrics процессов (OTel → экспортёр Prometheus), метка target `service` (core/telegram-service/
# ai-service/ml-service). Имена метрик — в legacy-схеме (global.metric_name_validation_scheme: legacy),
# поэтому точки OTel-имён экранированы в `_` (`deal.sessions.active` → `deal_sessions_active`).
#
# Пороги подобраны консервативно и осознанно «мягкие»: это задел оператору, а не жёсткий SLO —
# уточняйте под реальный профиль нагрузки. Токен-бюджет в Prometheus НЕ алертится намеренно: метрики
# бюджета (`deal_*`) нет (метки низкокардинальные, без tenantId/бюджета). Исчерпание ИИ-бюджета
# доставляется тенанту SSE-тостом (BudgetAlertScheduler), см. техдок §6/§7/§10.
groups:
- name: deal-availability
rules:
# Сервис не отвечает на scrape (недоступен): конфиг включает 4 процесса Deal + сам Prometheus.
- alert: DealServiceDown
expr: up{job="deal"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Сервис Deal недоступен — {{ $labels.service }}"
description: "Prometheus не может снять /metrics с {{ $labels.instance }} (service={{ $labels.service }}) более 2 минут."
# Пропажа метрик ядра: scrape ядра или datasource недоступен, хотя Prometheus жив.
- alert: DealCoreMetricsAbsent
expr: absent(deal_sessions_active)
for: 5m
labels:
severity: critical
annotations:
summary: "Нет метрик ядра Deal"
description: "Метрика deal_sessions_active отсутствует более 5 минут — не скрейпится ядро (core:9464) или datasource недоступен."
- name: deal-errors
rules:
# Рост доли 5xx: gRPC-вызовы тоже попадают в http_server_request_duration_seconds_* (gRPC-ингресс).
- alert: DealHigh5xxRatio
expr: |
sum by (service) (rate(http_server_request_duration_seconds_count{http_response_status_code=~"5.."}[5m]))
/
clamp_min(sum by (service) (rate(http_server_request_duration_seconds_count[5m])), 0.001) > 0.05
for: 10m
labels:
severity: warning
annotations:
summary: "Рост 5xx в сервисе {{ $labels.service }}"
description: "Доля 5xx в {{ $labels.service }} выше 5% за 5 минут (текущее значение {{ $value | humanizePercentage }})."
# Абсолютный всплеск 5xx — ловит рост ошибок и на низком трафике, где доля не показательна.
- alert: Deal5xxBurst
expr: sum by (service) (rate(http_server_request_duration_seconds_count{http_response_status_code=~"5.."}[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Всплеск 5xx в сервисе {{ $labels.service }}"
description: "Более 1 ответа 5xx/с в {{ $labels.service }} за 5 минут ({{ $value }}/с)."
- name: deal-queues
rules:
# Лаг очереди пайплайна: воркер ходит каждые 2 с, устойчивая глубина = воркер не успевает/залип.
- alert: DealPipelineQueueBacklog
expr: deal_pipeline_queue_depth > 100
for: 15m
labels:
severity: warning
annotations:
summary: "Растёт очередь пайплайна Deal"
description: "Суммарная глубина очереди пайплайна (new+filtered) держится выше 100 более 15 минут ({{ $value }})."
# Лаг ML-outbox: outbox-цикл идёт каждые 10 с; устойчивый рост = ml-service недоступен/отстаёт.
- alert: DealMlOutboxBacklog
expr: deal_ml_outbox_depth > 100
for: 15m
labels:
severity: warning
annotations:
summary: "Растёт очередь обучения ML (outbox)"
description: "Суммарная глубина MlOutbox держится выше 100 более 15 минут ({{ $value }})."