出现故障时,气流会使所有的障碍者做特定的事情

时间:2019-05-10 22:07:17

标签: python etl decorator airflow

我们有很多DAG在Airflow上运行。发生故障时,我们希望得到通知或采取特定措施:我已经通过装饰器

尝试过
def on_failure_callback(f):
  @wraps(f)
  def wrap(*args, **kwargs):
    try:
      return f(*args, **kwargs)
    except Exception as e:
      return f"An exception {e} on ocurred on{f}" 
  return wrap

这可行,但是有必要修饰我们想要启用此行为的任何功能。

我看到了this,并尝试像这样实现它:

def on_failure_callback(context):
    operator = PythonOperator(
        python_callable=failure)

    return operator.execute(context=context)


def failure():
    return 'Failure in the failure func'


dag_args = {
    "retries": 2,
    "retry_delay": timedelta(minutes=2),
    'on_failure_callback': on_failure_callback
}

然后在DAG定义中,我使用[...] default_args=dag_args [...],但是此选项不起作用。

完成此操作的最佳方法是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

最简单的方法:如果来自BaseOperator的email_on_retryemail_on_failure属性为true(默认为true),并且设置了气流邮件配置,则airflow在重试时发送邮件并失败。

使用自定义运算符:

def on_failure_callback(context):
    # with mail:
    error_mail = EmailOperator(
        task_id='error_mail',
        to='user@example.com',
        subject='Fail',
        html_content='a task failed',
        mime_charset='utf-8')
    error_mail.execute({})  # no need to return, just execute

    # with slack:
    error_message = SlackAPIPostOperator(
        task_id='error_message',
        token=getSlackToken(),
        text='a task failed',
        channel=SLACK_CHANNEL,
        username=SLACK_USER)
    error_message.execute({})  # no need to return, just execute

dag_args = {
    "retries": 2,
    "retry_delay": timedelta(minutes=2),
    'on_failure_callback': on_failure_callback
}

答案 1 :(得分:1)

IMO最简单的方法是在DAG失败时将其定义为默认参数。

  

default_args = {       '所有者':'气流',       'depends_on_past':错误,       'start_date':datetime(2015,6,1),       '电子邮件':['airflow@example.com'],       'email_on_failure':否,       ' email_on_retry':否,       “重试”:1       'retry_delay':timedelta(分钟= 5),       #'queue':'bash_queue',       #'pool':'回填',       #'priority_weight':10,       #'end_date':datetime(2016,1,1),   }

如果要基于任务依赖性指定发送电子邮件的行为,也可以使用sendgrid运算符。 https://github.com/apache/airflow/blob/master/airflow/contrib/utils/sendgrid.py