Airflow 气流:DAG运行的监测解决方案

Airflow 气流:DAG运行的监测解决方案,airflow,monitoring,Airflow,Monitoring,我目前正在尝试设置气流监控,理想情况下,在执行DAG时发送一封电子邮件,邮件中包含有关所有包含任务的一些信息,如任务的最终状态、运行时等 我目前未能解决的问题是: 如何获取与DAG运行关联的所有任务实例的状态 将邮件作为DAG中的一个组件发送有意义吗 如果是这样的话,我如何以一种简单的方式保证该任务将在所有其他任务之后运行 除此之外,我还有一个附加的pickle,我所寻找的解决方案在某种意义上必须是简单的,即它应该只有2-3行代码,或者可以泛化为Python函数,因为我的Python经验较少

我目前正在尝试设置气流监控,理想情况下,在执行DAG时发送一封电子邮件,邮件中包含有关所有包含任务的一些信息,如任务的最终状态、运行时等

我目前未能解决的问题是:

  • 如何获取与DAG运行关联的所有任务实例的状态
  • 将邮件作为DAG中的一个组件发送有意义吗
  • 如果是这样的话,我如何以一种简单的方式保证该任务将在所有其他任务之后运行
除此之外,我还有一个附加的pickle,我所寻找的解决方案在某种意义上必须是简单的,即它应该只有2-3行代码,或者可以泛化为Python函数,因为我的Python经验较少的同事必须能够理解和重现其他DAG上的步骤

关于如何建立电子邮件发送的更聪明的想法是非常受欢迎的

提前感谢您的所有建议

将邮件作为组件发送到 达格? 如果是这样的话,我如何以一种简单的方式保证任务将运行 在完成所有其他任务之后

我认为这是实现你想要的目标的一种方法。您可以创建一个任务,将所有“叶子”(没有下游依赖关系的任务)连接到最终任务,该任务通过电子邮件发送具有其他任务状态的DAG状态(在此场景中dagrun仍在运行)

def发送任务摘要(**上下文):
tis=context['dag\u run'].get\u task\u instances()
对于tis中的ti:
打印(ti.\U dict\U)
dag=dag(…)
作业状态=蟒蛇操作员(
任务id=“作业状态”,
python\u callable=send\u task\u summary,
提供上下文=True,
trigger\u rule=TriggerRule.ALL\u完成,
dag=dag
)
leaves=[dag.tasks中任务的任务,如果不是任务,则为任务。下游_列表]
排除=[''工作状态']
对于叶中的l:
如果l.task_id不在排除中:
作业状态。设置上游(l)
如何获取与DAG关联的所有任务实例的状态 跑

我建议使用PythonOperator而不是EmailOperator,因为您需要包含获取任务状态所需信息的上下文。基于上面的代码片段,我利用
send\u email
实用程序发送电子邮件

从afflow.utils.email导入发送\u电子邮件
def发送任务摘要(**上下文):
ti=上下文['task']
dr=context['dag_run']
body=ti.render_模板(无,“路径/目标/模板”,上下文)
发送电子邮件(收件人=”alan@example.com,subject=f“{dr}摘要”,html_content=body)
您还可以使用Jinja模板构建电子邮件


{%用于dag_运行中的ti。获取_任务_实例():-%}
{%endfor-%}
另一种方法是利用DAG对象的

从afflow.models导入DAG
从日期时间导入日期时间
def发送任务摘要(上下文):
tis=context['dag\u run'].get\u task\u instances()
对于tis中的ti:
打印(ti.\U dict\U)
dag=dag(
dag_id='my_dag',
计划时间间隔=“@once”,
开始日期=日期时间(2020,1,1),
失败时\u回调=发送\u任务\u摘要
) 

这一切看起来都非常有希望,接近我的想象!我今天要试一试。非常感谢。工作正如所愿!特别是“`task\u instances=context['dag\u run'].get\u task\u instances()``位非常有用,再次感谢!