如何通过Airflow数据库判断DAG无故障完成并统计相关数据?
统计Airflow中无故障、无手动干预的成功DAG运行数
要准确统计顺利完成、无故障且无手动重跑/恢复的DAG运行,需要结合dag_run和task_instance两张表,区分自动触发与手动操作、排除自动重试和故障记录。以下是具体方案:
核心逻辑
符合条件的DAG运行需满足:
- DAG最终状态为成功
- 由调度器自动触发(非手动触发)
- 所有任务均一次成功,无自动重试
- 无任何任务失败记录
- 无手动清理/重跑操作痕迹
SQL查询语句
适用于Airflow 2.x版本(若为1.x需调整字段,见下文说明):
SELECT COUNT(DISTINCT dr.dag_run_id) AS successful_uninterrupted_dag_runs FROM dag_run dr JOIN task_instance ti ON dr.dag_run_id = ti.dag_run_id WHERE dr.state = 'success' AND dr.external_trigger = FALSE GROUP BY dr.dag_run_id HAVING MAX(ti.try_number) = 1 AND COUNT(CASE WHEN ti.state = 'failed' THEN 1 END) = 0 AND COUNT(ti.clear_date) = 0;
条件说明
dr.state = 'success':筛选最终成功完成的DAG实例dr.external_trigger = FALSE:排除手动触发的DAG(UI/CLI触发的实例该字段为TRUE)MAX(ti.try_number) = 1:确保所有任务均一次执行成功,无自动重试(自动重试会使try_number大于1)COUNT(CASE WHEN ti.state = 'failed' THEN 1 END) = 0:确保无任何任务失败记录(无故障)COUNT(ti.clear_date) = 0:排除被手动清理/重跑的实例(clear_date字段存在值表示任务被手动重置过)
适配Airflow 1.x的调整
Airflow 1.x中无external_trigger字段,可通过dag_run.conf判断:调度器自动触发的实例conf为空,手动触发的实例conf通常包含自定义参数。调整后的WHERE条件:
WHERE dr.state = 'success' AND dr.conf IS NULL
另外,Airflow 1.x部分版本可能无clear_date字段,此时可通过task_instance的操作记录辅助判断,但准确性稍差,建议优先升级到2.x版本以获得更准确的字段支持。
内容的提问来源于stack exchange,提问作者Miky Schreiber
相关产品推荐
相关产品推荐

