如何在Airflow中通过模板获取DAG的URL?Slack告警报错求助
解决Airflow Slack告警中获取DAG URL的错误问题
你在代码里用{{ conf.base_url }}导致报错,原因是conf是Airflow的ConfigParser对象,不能直接通过属性访问配置项,得用正确的方式获取Web UI的base_url。下面是几种可行的解决办法:
方法1:用内置模板函数get_airflow_url()
Airflow提供了现成的模板函数直接返回Web UI的基础URL,修改你的message内容即可:
send_slack_alert = SlackWebhookOperator( task_id='slack_alert', slack_webhook_conn_id="slack_connection", message="There is an error\n" "DAG name: {{ dag }}\n" "Run: {{ run_id }}\n" "url: {{ get_airflow_url() }}/dags/{{ dag.dag_id }}/grid", trigger_rule=TriggerRule.ONE_FAILED )
这个函数会自动读取webserver配置段里的base_url,不用自己处理配置解析。
方法2:从配置中正确读取base_url
如果一定要通过conf获取,得用ConfigParser的get方法指定配置段和键名:
send_slack_alert = SlackWebhookOperator( task_id='slack_alert', slack_webhook_conn_id="slack_connection", message="There is an error\n" "DAG name: {{ dag }}\n" "Run: {{ run_id }}\n" "url: {{ conf.get('webserver', 'base_url') }}/dags/{{ dag.dag_id }}/grid", trigger_rule=TriggerRule.ONE_FAILED )
Airflow的Web UI地址配置在[webserver] section下的base_url,所以要用conf.get('webserver', 'base_url')来获取。
方法3:直接生成当前DAG运行的详情URL
如果想直接跳转到本次失败的DAG运行页面,不用拼接路径,可以用任务实例的dag_run对象的方法:
send_slack_alert = SlackWebhookOperator( task_id='slack_alert', slack_webhook_conn_id="slack_connection", message="There is an error\n" "DAG name: {{ dag }}\n" "Run: {{ run_id }}\n" "Run URL: {{ ti.dag_run.get_airflow_url() }}", trigger_rule=TriggerRule.ONE_FAILED )
ti是模板上下文里的任务实例对象,通过ti.dag_run.get_airflow_url()能直接拿到本次运行的完整URL,跳转更精准。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

