4.airflow系列之全局异常捕获实现消息通知实践

之前我们有讲到如何基于Helm部署Airflow, 为了实现定时任务异常实时捕获通知,我们改造values.yaml文件, 主要是覆盖/opt/airflow/config/airflow_local_settings.py文件

airflowVersion: 2.5.3
defaultAirflowTag: 2.5.3
config:
  core:
    dags_folder: /opt/airflow/dags/repo/dags
    hostname_callable: airflow.utils.net.get_host_ip_address
env: 
  - name: "docker_conn_id"
    value: "docker://admin:*****@http://repo.*****.com"
airflowLocalSettings: |-
  import sys
  import logging
  import os
  from sfxs_utils import dingutils
  from airflow.models.dag import DAG
  from functools import wraps

  def send_dingding_alert(context=None, exc_type=None, exc_value=None, exc_traceback=None):
      """
      Send DingTalk notification for task failures or global exceptions
      """
      try:
          if context:  # Task failure scenario
              task_instance = context.get('task_instance')
              url = task_instance.log_url.replace("http://localhost:8080", "https://airflow.******.com")
              message = f"【airflow】 任务{task_instance.task_id}错误,请点击{url}查看!"
          else:  # Global exception scenario
              message = f"【Airflow Global Error】 发生全局异常: {exc_type.__name__}: {exc_value}\n" \
                        f"请检查 Airflow 服务器日志以获取详细信息!"
          
          print(message)
          token = os.getenv("DINGDING_TOKEN", "ae14f")
          # 自定义的发送工具类
          dingutils.send_text(message, token)
          print("success")
      except Exception as e:
          logging.error(f"Failed to send DingTalk notification: {e}")

  # Monkey-patch DAG to set default on_failure_callback
  original_init = DAG.__init__

  @wraps(original_init)
  def patched_init(self, *args, **kwargs):
      original_init(self, *args, **kwargs)
      if 'default_args' not in kwargs:
          kwargs['default_args'] = {}
      if 'on_failure_callback' not in kwargs['default_args']:
          kwargs['default_args']['on_failure_callback'] = send_dingding_alert
      self.default_args = kwargs['default_args']

  DAG.__init__ = patched_init

  # Global exception handling
  original_excepthook = sys.excepthook

  def custom_excepthook(exc_type, exc_value, exc_traceback):
      send_dingding_alert(exc_type=exc_type, exc_value=exc_value, exc_traceback=exc_traceback)
      original_excepthook(exc_type, exc_value, exc_traceback)

  sys.excepthook = custom_excepthook
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小生Đ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值