如何在Airflow中找到上游任务失败的数量?

时间:2018-05-30 20:49:57

标签: python-2.7 airflow

我很难确定如何在同一天(同一执行日)运行两次的同一dag运行中找到失败的任务。

考虑一个例子,当dag_id=1的dag在第一次运行时失败(由于任何原因可能会说连接超时)并且任务失败。当我们尝试查询失败任务时,TaskInstance表将包含失败任务的条目。 GREAT !!

但是,如果我重新运行相同的dag(请注意dag_id仍为1),那么在最后一个任务中(它具有ALL_DONE规则,因此无论上游任务是否失败或是否成功将被执行)我想计算当前dag_run中失败以前的dag_runs失败的任务数。我遇到了dag_run id,如果我们可以将它与TaskInstance相关联,那么它可能很有用,但我不能。任何建议/帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

您可以创建PythonOperator任务,查询Airflow数据库以查找您要查找的信息。这样做的另一个好处是可以传递查询所需数据所需的信息:

from contextlib import closing
from airflow import models, settings
from airflow.utils.state import State

def your_python_operator_callable(**context):    
  with closing(settings.Session()) as session:
    print("There are {} failed tasks in this execution".format(
      session.query(
        models.TaskInstance
      ).filter(
        models.TaskInstance.dag_id == context["dag"].dag_id, 
        models.TaskInstance.execution_date == context["execution_date"],
        models.TaskInstance.state == State.FAILED).count()
      )

然后使用DAG将任务添加到PythonOperator

我没有对上述内容进行过测试,但希望能让您走上正确的道路

答案 1 :(得分:1)

在Airflow 1.10.x中,可以通过更简单的代码避免直接接触ORM来获得相同的结果。

from airflow.utils.state import State

def your_python_operator_callable(**context):    
    tis_dagrun = context['ti'].get_dagrun().get_task_instances()
    failed_count = sum([True if ti.state == State.FAILED else False for ti in tis_dagrun])
    print(f"There are {failed_count} failed tasks in this execution"

一个不幸的问题是,context['ti'].get_dagrun()在CLI中测试单个任务时不会返回DAGRun实例,因此您必须解决该问题。