Airflow配置sla_miss_callback后未正常触发问题求助
问题根因
你遇到的回调不触发问题,是对Airflow SLA机制的认知偏差+版本特性边界共同导致的,核心原因有3个:
- 首先Airflow的SLA校验从来不是针对DAG整体运行时长,而是针对单个任务实例:你把
sla配在default_args里,但顶层DAG里的TriggerDagRunOperator默认触发完子DAG就会立刻标记为成功,本身执行时长只有几秒,远达不到60秒的阈值,根本不会命中SLA miss规则。你看到的DAG总运行时长1小时,是子DAG跑的时间,顶层触发任务早就结束了,SLA检查自然扫不到超时。 - 其次2.3.1版本的DAG级
sla_miss_callback有明确触发前提:必须是该DAG下至少有1个任务命中SLA超时规则,才会执行回调。如果SLA检查遍历完所有任务,没有发现任何超时实例,就会直接退出流程,不会打后续日志,也不会触发任何回调——这就是你看到Running SLA Checks for DAG X1之后没有任何输出的原因。 - 最后你提到的“子DAG不配置schedule就无法配SLA”是源码逻辑:SLA计算强依赖DAG自身的调度间隔+调度周期时间,没有schedule的DAG没有基准调度时间,根本算不出来SLA超时点,自然无法触发校验。
可落地的修复方案
按优先级从高到低操作即可:
- 给
TriggerDagRunOperator开启子DAG等待配置,让顶层任务的执行时长真正包含子DAG运行时间,不要只靠default_args传SLA,直接给监控的核心任务显式配置参数:from datetime import timedelta import pendulum from airflow.decorators import dag from airflow.operators.trigger_dagrun import TriggerDagRunOperator def sla_callback(dag, task_list, blocking_task_list, slas, blocking_tis): print( "SLA miss触发,参数如下:", { "dag": dag.dag_id, "超时任务列表": task_list, "阻塞任务列表": blocking_task_list, "SLA配置记录": slas, "阻塞任务实例": blocking_tis, }, ) @dag( schedule_interval="0 18 * * *", start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), sla_miss_callback=sla_callback, catchup=False # 关闭补跑,避免历史任务触发无意义SLA告警 ) def dag_x1(): trigger_y1 = TriggerDagRunOperator( task_id="trigger_y1", trigger_dag_id="dag_y1", wait_for_completion=True, # 核心配置:触发子DAG后等待执行完成再标记自身成功 poke_interval=30, # 每30秒检查一次子DAG状态 allowed_states=["success"], failed_states=["failed"], sla=timedelta(seconds=60) # 显式给等待任务配SLA,不要依赖default_args继承 ) dag_x1() - 纠正SLA的计时逻辑认知:SLA的计时起点不是任务开始运行的时间,是DAG该调度周期的理论开始时间。比如你DAG配置18点调度、SLA60秒,代表任务需要在18:01前完成,不是任务启动后跑60秒就算超时。如果DAG因为资源排队18:10才开始执行,哪怕任务1秒跑完,也会触发SLA miss。
- 2.3.1版本调试技巧:把airflow.cfg里的
logging_level改成DEBUG,重启DAG Processor后就能看到SLA检查时扫描的任务列表、每个任务的理论SLA截止时间、实际完成时间,不用瞎猜为什么没触发规则。 - 避坑提醒:Airflow 2.3+版本已经在官方文档里标记原生SLA机制是遗留功能,跨DAG链路、子DAG场景下的边界bug很多,如果你的链路比较复杂,更稳妥的方案是写独立的监控DAG,定时扫描DAG Run的实际执行时长做告警,不要强依赖
sla_miss_callback。
内容的提问来源于stack exchange,提问作者Mayank Kataruka
相关产品推荐
相关产品推荐

