我很难确定如何在同一天(同一执行日)运行两次的同一dag运行中找到失败的任务。
考虑一个例子,当dag_id=1
的dag在第一次运行时失败(由于任何原因可能会说连接超时)并且任务失败。当我们尝试查询失败任务时,TaskInstance表将包含失败任务的条目。 GREAT !!
但是,如果我重新运行相同的dag(请注意dag_id仍为1),那么在最后一个任务中(它具有ALL_DONE
规则,因此无论上游任务是否失败或是否成功将被执行)我想计算当前dag_run中失败以前的dag_runs失败的任务数。我遇到了dag_run id,如果我们可以将它与TaskInstance相关联,那么它可能很有用,但我不能。任何建议/帮助表示赞赏。
答案 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实例,因此您必须解决该问题。