我们有很多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 [...]
,但是此选项不起作用。
完成此操作的最佳方法是什么?
谢谢
答案 0 :(得分:1)
最简单的方法:如果来自BaseOperator的email_on_retry
和email_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