You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python告警脚本中避免邮件泛滥?

避免告警邮件泛滥的实现方案

核心思路是通过记录已发送告警的唯一标识,确保同一种故障状态只发送一次告警,直到故障恢复后才允许再次触发告警。具体实现基于你提到的MD5标识+本地目录存储的方式,步骤如下:

具体实现步骤

  • 初始化存储目录:脚本启动时检查sent目录是否存在,不存在则自动创建
  • 生成告警唯一标识:对每条告警的内容字符串生成MD5哈希值,作为该告警的唯一ID
  • 告警发送判断:检查sent目录中是否存在以该MD5命名的文件:
    • 不存在则发送告警,并创建对应MD5文件标记已发送
    • 存在则跳过发送,避免重复告警
  • 故障恢复清理:当任务恢复为RUNNING状态时,删除对应告警的MD5文件,确保后续再出问题能重新触发告警

修改后的代码示例

import os
import hashlib

# 初始化存储已发送告警的目录
SENT_DIR = "./sent"
if not os.path.exists(SENT_DIR):
    os.makedirs(SENT_DIR)

for task_list in status['tasks']:
    task_id = task_list['id']
    task_state = task_list['state']
    # 构造告警内容字符串
    alert_content = f"{connector}-task-{task_id}-status-{task_state}"
    
    # 生成告警内容的MD5哈希值作为唯一标识
    md5_hash = hashlib.md5(alert_content.encode('utf-8')).hexdigest()
    alert_mark_file = os.path.join(SENT_DIR, md5_hash)
    
    if task_state != 'RUNNING':
        # 检查是否已发送过该告警
        if not os.path.exists(alert_mark_file):
            # 发送告警邮件
            alert_email(alert_content)
            # 创建标记文件
            open(alert_mark_file, 'w').close()
    else:
        # 任务恢复正常,删除对应的告警标记文件
        if os.path.exists(alert_mark_file):
            os.remove(alert_mark_file)

代码说明

  • SENT_DIR:指定存储告警标记文件的目录,可根据实际路径调整
  • MD5生成:通过hashlib.md5将告警内容转成唯一哈希值,确保同一种告警状态对应同一个标记文件
  • 恢复清理逻辑:当任务回到RUNNING状态时,删除对应的标记文件,这样下次再出现异常时能重新发送告警
  • 标记文件:用空文件即可,仅作为已发送的标记,也可以在文件中写入告警时间等额外信息

内容的提问来源于stack exchange,提问作者oraclept

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:01:11