Airflow — алерт когда DAG не уложился в SLA
DAG в Airflow закончил позже SLA (но не упал — успех с задержкой). По умолчанию SLA-miss даёт только email-callback, который часто не настроен. Pipeline отдаёт «красную метку» через час после факта.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/af-sla
# */15 * * * * root /opt/af-sla.sh
AF_URL=${AIRFLOW_URL:-http://airflow:8080/api/v1}
USER=${AF_USER}
PWD=${AF_PWD}
DAG=${DAG_ID}
SLA_MIN=${SLA_MIN:-90} # expected runtime in minutes
# Latest dag run
RUN=$(curl -fsS -u "$USER:$PWD" "$AF_URL/dags/$DAG/dagRuns?limit=1&order_by=-execution_date" \
| jq -r '.dag_runs[0]')
START=$(echo "$RUN" | jq -r .start_date)
END=$(echo "$RUN" | jq -r .end_date)
STATE=$(echo "$RUN" | jq -r .state)
[ "$END" = "null" ] && exit 0 # still running, ok
DUR_MIN=$(( ($(date -ud "$END" +%s) - $(date -ud "$START" +%s)) / 60 ))
if [ "$DUR_MIN" -gt "$SLA_MIN" ]; then
curl -fsS "$HEARTBEAT_URL" --data "dag=$DAG,duration_min=$DUR_MIN,sla_min=$SLA_MIN,state=$STATE"
exit 2
fi
echo "OK (duration=${DUR_MIN}m, state=$STATE)"
То же самое в Enterno.io
Подключите Enterno heartbeat — увидите тренд «DAG медленно деградирует» (вчера 70 мин, сегодня 95 мин) до того как пробьёт SLA.
Похожие рецепты
cron-сервис жив, но задача (timer disabled, MAILTO=root спам, sh-syntax-error в crontab) не отрабатывала ночью. classic «забыли что вчерашняя ночь дала пустые отчёты».
Кто-то поставил `spec.suspend: true` на CronJob (debug, или спешка релиза) и забыл вернуть. Daily-таска не запускается, отчёты не генерируются — узнаешь только когда finance спросит.
Нужно убедиться, что сайт возвращает 2xx каждую минуту, и получить алерт в Slack/Telegram при падении.