Airflow 2.2.5:如何识别已标记为成功的失败DAG运行?
问题解答
1. 能否识别被重置为Success的失败DAG运行?
可以识别,核心是通过Airflow元数据库的dag_run、task_instance和log表关联查询,定位那些最终状态为Success,但中途存在任务耗尽重试次数失败后被修复重置的记录。
关键查询思路:
- 目标DAG的
dag_run状态为success,但关联的task_instance中存在任务达到最大尝试次数(max_tries = try_number),且该任务的前一次尝试状态为failed(说明之前重试耗尽失败过,最后一次是修复后成功)。 - 或者通过
log表查找包含重置操作的日志,确认DAG运行曾被手动/自动重置。
示例SQL:
方法1:从任务实例历史识别
SELECT dr.dag_id, dr.run_id, dr.start_date, dr.end_date FROM dag_run dr JOIN task_instance ti ON dr.dag_id = ti.dag_id AND dr.run_id = ti.run_id WHERE dr.dag_id = '你的目标DAG_ID' AND dr.state = 'success' AND ti.max_tries = ti.try_number AND EXISTS ( SELECT 1 FROM task_instance ti_hist WHERE ti_hist.dag_id = ti.dag_id AND ti_hist.run_id = ti.run_id AND ti_hist.task_id = ti.task_id AND ti_hist.try_number = ti.try_number - 1 AND ti_hist.state = 'failed' ) GROUP BY dr.dag_id, dr.run_id, dr.start_date, dr.end_date;
这个查询会找出:最终DAG成功,但存在任务在耗尽所有重试(比如配置3次重试则max_tries=4)后,最后一次尝试成功、但前一次尝试失败的DAG运行——这类记录就是你需要统计的“修复后重置成功”的案例。
方法2:从重置日志识别
SELECT DISTINCT dr.dag_id, dr.run_id FROM dag_run dr JOIN log l ON dr.dag_id = l.dag_id AND dr.run_id = l.execution_date WHERE dr.dag_id = '你的目标DAG_ID' AND dr.state = 'success' AND l.message LIKE '%Resetting dag run%';
通过日志中“重置DAG运行”的关键字,直接定位曾被重置过的成功DAG运行。
2. 如何检查Airflow是否发送了失败邮件?
根据Airflow版本和配置不同,有几种方式:
方式1:查询Airflow通知表(2.3+版本)
Airflow 2.3及以上版本新增了notification表,专门存储通知发送记录,可直接查询:
SELECT * FROM notification WHERE dag_id = '你的目标DAG_ID' AND notification_type = 'email' AND status = 'success' -- 邮件发送成功状态 AND message LIKE '%failed%'; -- 筛选失败相关的邮件
方式2:查看Airflow日志
如果是旧版本没有notification表,直接搜索Airflow调度器或Worker的日志,关键词可以用:
Sent an alert email toFailed to send alert email(如果发送失败)- 结合目标DAG的
run_id或失败时间点过滤,能快速找到邮件发送记录。
方式3:检查SMTP服务器日志
如果公司有统一的SMTP邮件服务器,可以查询服务器的发送日志,根据收件人邮箱、发送时间(对应DAG失败的时间点)来确认是否发送了失败通知邮件。
内容的提问来源于stack exchange,提问作者Gabe
相关产品推荐
相关产品推荐

