- Зачем: - диапазонные запросы Prometheus возвращали временные ряды, из-за чего Grafana не вычисляла алерты Airflow и Kafka. - Что: - между запросом Prometheus и Threshold добавлен Reduce(last) в семи правилах, а аннотации переведены на итоговое число. - добавлены регрессионные тесты конфигурации и зависимость PyYAML для их запуска. - в уроке 5 уточнено время срабатывания и восстановления алерта scheduler. - Проверка: - uv run --with-requirements generator/requirements.txt pytest tests/ -q -p no:cacheprovider: 33 passed. - uv run --with-requirements requirements.txt pytest tests/ -q -p no:cacheprovider из generator: 218 passed. - Docker Compose config и вычисление правил в Grafana 11.5.2 прошли успешно.
332 lines
9.7 KiB
YAML
332 lines
9.7 KiB
YAML
apiVersion: 1
|
||
|
||
groups:
|
||
- orgId: 1
|
||
name: airflow_health_group
|
||
folder: Airflow Alerts
|
||
interval: 30s
|
||
rules:
|
||
# --- Alert: Airflow Scheduler Down ---
|
||
- uid: airflow_scheduler_down
|
||
title: Airflow Scheduler Down
|
||
condition: C
|
||
data:
|
||
- refId: A
|
||
relativeTimeRange:
|
||
from: 300
|
||
to: 0
|
||
datasourceUid: prometheus_uid
|
||
model:
|
||
datasource:
|
||
type: prometheus
|
||
uid: prometheus_uid
|
||
editorMode: code
|
||
expr: rate(airflow_scheduler_heartbeat_total[5m])
|
||
instant: false
|
||
intervalMs: 1000
|
||
legendFormat: __auto
|
||
maxDataPoints: 43200
|
||
range: true
|
||
refId: A
|
||
- refId: B
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params: []
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- B
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: A
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
reducer: last
|
||
refId: B
|
||
type: reduce
|
||
- refId: C
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params:
|
||
- 0.1
|
||
type: lt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- C
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: B
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
refId: C
|
||
type: threshold
|
||
noDataState: Alerting
|
||
execErrState: Error
|
||
for: 2m
|
||
annotations:
|
||
summary: "Airflow scheduler не отправляет heartbeats"
|
||
description: "Scheduler possible down — rate(airflow_scheduler_heartbeat_total) < 0.1 в течение 2 минут"
|
||
labels:
|
||
severity: critical
|
||
|
||
# --- Alert: Airflow Queue Backlog ---
|
||
- uid: airflow_queue_high
|
||
title: Airflow Queue Backlog
|
||
condition: C
|
||
data:
|
||
- refId: A
|
||
relativeTimeRange:
|
||
from: 300
|
||
to: 0
|
||
datasourceUid: prometheus_uid
|
||
model:
|
||
datasource:
|
||
type: prometheus
|
||
uid: prometheus_uid
|
||
editorMode: code
|
||
expr: airflow_executor_queued_tasks
|
||
instant: false
|
||
intervalMs: 1000
|
||
legendFormat: __auto
|
||
maxDataPoints: 43200
|
||
range: true
|
||
refId: A
|
||
- refId: B
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params: []
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- B
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: A
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
reducer: last
|
||
refId: B
|
||
type: reduce
|
||
- refId: C
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params:
|
||
- 50
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- C
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: B
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
refId: C
|
||
type: threshold
|
||
noDataState: OK
|
||
execErrState: Error
|
||
for: 5m
|
||
annotations:
|
||
summary: "В очереди Airflow > 50 задач"
|
||
description: "airflow_executor_queued_tasks = {{ $values.B.Value }} (превышает 50 в течение 5 минут) — возможна перегрузка"
|
||
labels:
|
||
severity: warning
|
||
|
||
# --- Alert: High Task Failure Rate ---
|
||
- uid: airflow_task_failures_high
|
||
title: High Task Failure Rate
|
||
condition: C
|
||
data:
|
||
- refId: A
|
||
relativeTimeRange:
|
||
from: 300
|
||
to: 0
|
||
datasourceUid: prometheus_uid
|
||
model:
|
||
datasource:
|
||
type: prometheus
|
||
uid: prometheus_uid
|
||
editorMode: code
|
||
expr: rate(airflow_task_failures_total[5m])
|
||
instant: false
|
||
intervalMs: 1000
|
||
legendFormat: __auto
|
||
maxDataPoints: 43200
|
||
range: true
|
||
refId: A
|
||
- refId: B
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params: []
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- B
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: A
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
reducer: last
|
||
refId: B
|
||
type: reduce
|
||
- refId: C
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params:
|
||
- 0.1
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- C
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: B
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
refId: C
|
||
type: threshold
|
||
noDataState: OK
|
||
execErrState: Error
|
||
for: 3m
|
||
annotations:
|
||
summary: "Высокий rate падений тасков"
|
||
description: "rate(airflow_task_failures_total) = {{ $values.B.Value }} (превышает 0.1 в течение 3 минут) — проверьте логи DAG"
|
||
labels:
|
||
severity: warning
|
||
|
||
# --- Alert: High DAG Parse Time ---
|
||
- uid: airflow_parse_time_high
|
||
title: High DAG Parse Time
|
||
condition: C
|
||
data:
|
||
- refId: A
|
||
relativeTimeRange:
|
||
from: 300
|
||
to: 0
|
||
datasourceUid: prometheus_uid
|
||
model:
|
||
datasource:
|
||
type: prometheus
|
||
uid: prometheus_uid
|
||
editorMode: code
|
||
expr: airflow_dag_processing_total_parse_time
|
||
instant: false
|
||
intervalMs: 1000
|
||
legendFormat: __auto
|
||
maxDataPoints: 43200
|
||
range: true
|
||
refId: A
|
||
- refId: B
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params: []
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- B
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: A
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
reducer: last
|
||
refId: B
|
||
type: reduce
|
||
- refId: C
|
||
datasourceUid: __expr__
|
||
model:
|
||
conditions:
|
||
- evaluator:
|
||
params:
|
||
- 30
|
||
type: gt
|
||
operator:
|
||
type: and
|
||
query:
|
||
params:
|
||
- C
|
||
reducer:
|
||
params: []
|
||
type: last
|
||
type: query
|
||
datasource:
|
||
type: __expr__
|
||
uid: __expr__
|
||
expression: B
|
||
intervalMs: 1000
|
||
maxDataPoints: 43200
|
||
refId: C
|
||
type: threshold
|
||
noDataState: OK
|
||
execErrState: Error
|
||
for: 5m
|
||
annotations:
|
||
summary: "Парсинг DAG занимает > 30 секунд"
|
||
description: "airflow_dag_processing_total_parse_time = {{ $values.B.Value }}s — возможно, есть тяжелые DAG"
|
||
labels:
|
||
severity: info
|