Правила вынесены в prometheus-resource-rules.yml (не в rule_files); пороги — через env DEAL_ALERT_* при включении.
83 lines
4.8 KiB
YAML
83 lines
4.8 KiB
YAML
# Правила алертов 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 }})."
|
||
|