如何在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
相关产品推荐
相关产品推荐

