AIRFLOW:DAG的执行超时通知

时间:2019-12-19 10:16:00

标签: airflow airflow-scheduler airflow-operator

我有一种情况,我希望如果执行时间超过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版本

0 个答案:

没有答案