气流失败的松弛消息

时间:2017-06-16 09:58:37

标签: slack airflow apache-airflow

如何配置Airflow,以便DAG中的任何故障都会(立即)导致松弛消息?

此时我通过创建slack_failed_task来管理它:

slack_failed_task =  SlackAPIPostOperator(
    task_id='slack_failed',
    channel="#datalabs",
    trigger_rule='one_failed',
    token="...",
    text = ':red_circle: DAG Failed',
    icon_url = 'http://airbnb.io/img/projects/airflow3.png',
    dag=dag)

并在DAG中的每个其他任务的上游设置此任务(one_failed):

slack_failed_task << download_task_a
slack_failed_task << download_task_b
slack_failed_task << process_task_c
slack_failed_task << process_task_d
slack_failed_task << other_task_e

它有效,但由于忘记添加任务会导致松弛通知并且看起来很多工作,因此很容易出错。

是否有可能扩展DAG中的email_on_failure属性?

奖金;-)包括将失败任务的名称传递给消息的方法。

4 个答案:

答案 0 :(得分:14)

也许这个例子会有所帮助:

def slack_failed_task(contextDictionary, **kwargs):  
       failed_alert = SlackAPIPostOperator(
         task_id='slack_failed',
         channel="#datalabs",
         token="...",
         text = ':red_circle: DAG Failed',
         owner = '_owner',)
         return failed_alert.execute


task_with_failed_slack_alerts = PythonOperator(
task_id='task0',
python_callable=<file to execute>,
on_failure_callback=slack_failed_task,
provide_context=True,
dag=dag)

答案 1 :(得分:2)

BaseOperator支持&#39; on_failure_callback&#39;参数:

  

on_failure_callback(callable) - 当此任务的任务实例失败时要调用的函数。上下文字典作为单个参数传递给此函数。 Context包含对任务实例的相关对象的引用,并记录在API的宏部分下。

我没有对此进行过测试,但您应该能够定义一个函数,该函数在发生故障时发布松弛并将其传递给每个任务定义。要获取当前任务的名称,您可以使用{{task_id}}模板。

答案 2 :(得分:2)

尝试使用新的 SlackWebhookOperator (在Airflow版本> = 1.10.0中提供)

from airflow.contrib.operators.slack_webhook_operator import SlackWebhookOperator

slack_msg="Hi Wssup?"

slack_test =  SlackWebhookOperator(
    task_id='slack_test',
    http_conn_id='slack_connection',
    webhook_token='/1234/abcd',
    message=slack_msg,
    channel='#airflow_updates',
    username='airflow_'+os.environ['ENVIRONMENT'],
    icon_emoji=None,
    link_names=False,
    dag=dag)

注意:确保在气流连接中添加了slack_connection

host=https://hooks.slack.com/services/

答案 3 :(得分:0)

我希望将回调添加到DAG并由其所有任务继承:

def on_failure_callback(context):
    webhook_url = os.getenv('SLACK_WEBHOOK_TOKEN')
    slack_data = {
        'text': "@here DAG {} Failed".format(context['dag'].dag_id)
    }

    response = requests.post(
        webhook_url, data=json.dumps(slack_data),
        headers={'Content-Type': 'application/json'}
    )

dag = DAG(
    dag_id='dag_with_templated_dir',
    start_date=datetime(2020, 1, 1),
    on_failure_callback=on_failure_callback
)