Airflow 如何查找气流中失败的上游任务数?

Airflow 如何查找气流中失败的上游任务数?,airflow,Airflow,我很难找到同一dag在同一天运行两次(同一执行日)的失败任务 考虑一个例子,当一个dag id为1的dag在第一次运行时失败(由于任何原因,比如说连接超时),任务失败。当我们尝试查询失败任务时,TaskInstance表将包含该任务的条目。太好了 但是,如果我重新运行相同的dag(请注意,dag_id仍然为1),那么在上一个任务中(它的规则是ALL_DONE,因此无论上游任务是否失败,它都将被执行),我想计算当前dag_运行中失败的任务数,忽略以前的dag_运行。我遇到了dag_运行id,如果我

我很难找到同一dag在同一天运行两次(同一执行日)的失败任务

考虑一个例子,当一个dag id为1的dag在第一次运行时失败(由于任何原因,比如说连接超时),任务失败。当我们尝试查询失败任务时,TaskInstance表将包含该任务的条目。太好了


但是,如果我重新运行相同的dag(请注意,dag_id仍然为1),那么在上一个任务中(它的规则是
ALL_DONE
,因此无论上游任务是否失败,它都将被执行),我想计算当前dag_运行中失败的任务数,忽略以前的dag_运行。我遇到了dag_运行id,如果我们能将其与TaskInstance关联起来,它可能会很有用,但我不能。任何建议/帮助都将不胜感激。

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

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()
      )
然后使用
PythonOperator
将任务添加到您的
DAG


(我没有测试上述内容,但希望能让您走上正确的道路)

在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实例。实际上,对单个任务的手动测试将失败,但标准运行将按预期工作。

您希望如何/在何处计算此值?在进程内部,还是仅仅在Python中?作为dag的一部分在进程内部。可能出于某些报告目的。docker操作员也可以这样做吗@天堂你是什么意思?您想运行我在docker operator中提供的代码,还是想检查docker operator任务的状态?如果是前者——可能是的,但在我看来这毫无意义。如果后者为“是”,则此函数与操作员无关,因为它只涉及任务实例。