Профиль observability: otel-collector (приём OTLP) -> tempo (трейсы), cadvisor/node-exporter (ресурсы) в Prometheus, дашборды Deal-Traces и Deal-Resources, datasource Tempo и связь логов с трейсами, алерты по ресурсам; OTel-env у всех процессов.
135 lines
7.4 KiB
YAML
135 lines
7.4 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 }})."
|
||
|
||
- name: deal-resources
|
||
rules:
|
||
# Хост: загрузка CPU/память/диск. Источник — node-exporter. Пороги «мягкие» — оператор уточняет.
|
||
- alert: DealHostHighCpu
|
||
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
|
||
for: 10m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "Высокая загрузка CPU хоста"
|
||
description: "Средняя загрузка CPU хоста выше 90% за 5 минут более 10 минут."
|
||
|
||
- alert: DealHostHighMemory
|
||
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
|
||
for: 10m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "Высокое потребление памяти хостом"
|
||
description: "Свободной памяти меньше 10% более 10 минут."
|
||
|
||
- alert: DealHostDiskLow
|
||
expr: |
|
||
min by (mountpoint) (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) < 0.15
|
||
for: 15m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "Мало места на диске ({{ $labels.mountpoint }})"
|
||
description: "Свободно менее 15% на разделе {{ $labels.mountpoint }} более 15 минут."
|
||
|
||
# Контейнеры Deal: CPU и память против лимита (mem_limit/cpus в compose). Источник — cAdvisor.
|
||
- alert: DealContainerHighCpu
|
||
expr: |
|
||
sum by (name) (rate(container_cpu_usage_seconds_total{name=~".*deal.*|.*core.*|.*service.*"}[5m])) > 1.5
|
||
for: 10m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "Высокий CPU контейнера {{ $labels.name }}"
|
||
description: "Контейнер {{ $labels.name }} держит > 1.5 CPU за 5 минут более 10 минут."
|
||
|
||
- alert: DealContainerHighMemory
|
||
expr: |
|
||
(container_memory_working_set_bytes{name=~".*deal.*|.*core.*|.*service.*"}
|
||
/ clamp_min(container_spec_memory_limit_bytes{name=~".*deal.*|.*core.*|.*service.*"}, 1)) > 0.9
|
||
for: 10m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "Контейнер {{ $labels.name }} близок к лимиту памяти"
|
||
description: "Контейнер {{ $labels.name }} использует более 90% лимита памяти более 10 минут."
|