我有一种情况,我希望如果执行时间超过15分钟,那么气流将杀死dag并发送电子邮件作为通知。
我创建了以下dag,它具有三个并行运行的任务。
from datetime import timedelta, datetime
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.email_operator import EmailOperator
import smtplib
from smtplib import SMTPException
def task_fail_alert(context):
"""
Callback task that can be used in DAG to alert of failure task completion
Args:
context (dict): Context variable passed in from Airflow
Returns:
None: sends mail
"""
msg = "Notification Message "
sender = 'sender@email.com'
receivers = ['my@email.com']
SUBJECT = "Failure Alert!!"
message = 'Subject: {}\n\n{}'.format(SUBJECT, msg)
try:
smtpObj = smtplib.SMTP('xx.xxx.xx.xx')
smtpObj.sendmail(sender, receivers, message)
except SMTPException:
print "Error: unable to send email"
return email.execute(context=context)
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': airflow.utils.dates.days_ago(1),
'email': ['my@email.com']
'email_on_failure': True,
'email_on_retry': False,
'email_on_success': False,
'on_failure_callback': task_fail_alert,
}
dag = DAG(
'Dag_Name',
default_args=default_args,
catchup=False,
description=' ',
schedule_interval='0 * * * *'
)
t1 = BashOperator(
task_id='RunScript_1',
bash_command='command1',
email_on_failure=True,
email_on_success=False,
run_as_user='user',
execution_timeout=timedelta(minutes=15),
dag=dag
)
t2 = BashOperator(
task_id='RunScript_2',
bash_command='command2',
email_on_failure=True,
email_on_success=False,
run_as_user='user',
execution_timeout=timedelta(minutes=15),
dag=dag
)
t3 = BashOperator(
task_id='RunScript_3',
bash_command='command3',
email_on_failure=True,
email_on_success=False,
run_as_user='user',
execution_timeout=timedelta(minutes=15),
dag=dag
)
现在,上述问题的问题在于它发送了 3次通知。 但是,在我的情况下,对于这种情况,只有一个通知就足够了(如果任何工作需要15分钟以上)。
另一个担心的是,如果该dag由于其他任何原因(不是由于超时)而失败,那么将再次发送相同的通知。
因此,有什么方法可以修改dag,以便如果dag因超时问题而失败,则将发送通知,并且出于任何其他原因,它会发送常规的失败通知。
我正在使用Airfow 1.10.4版本