# Правила алертов 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 }})."