脚本怎样多渠道推送告警消息

wen 实用脚本 27

从原理到实战的完整指南

目录导读

  1. 为什么需要多渠道告警推送?
  2. 核心原理:脚本如何实现多渠道推送
  3. 主流渠道集成实战(微信/邮件/SMS/钉钉)
  4. 告警消息模板与去重策略
  5. 高可用架构:失败重试与轮换机制
  6. 常见问题与问答环节

为什么需要多渠道告警推送?

在运维监控、自动化脚本或业务系统中,单一渠道(如仅邮件)容易因网络延迟、客户端未登录或服务宕机导致告警遗漏。多渠道推送通过微信、短信、钉钉、Telegram等工具并行或按规则轮换发送,确保关键告警100%触达负责人,某电商平台在凌晨大促期间,脚本同时调用企业微信机器人+短信接口,即便员工离线,也能通过短信瞬间接收CPU过载警报。

脚本怎样多渠道推送告警消息


核心原理:脚本如何实现多渠道推送

脚本通常通过HTTP请求调用第三方API实现推送,以Python为例:

  • 微信/钉钉机器人:向Webhook URL发送POST请求,JSON格式包含文本或Markdown消息。
  • 邮件:使用smtplib库连接SMTP服务器。
  • 短信:调用云厂商(如阿里云/腾讯云)短信API,需提前申请签名与模板。
  • Telegram:通过Bot API向指定Chat ID发送消息。

关键代码框架

def send_alert(message, channels=['wechat', 'email', 'sms']):
    for channel in channels:
        if channel == 'wechat': 
            requests.post(wechat_webhook, json={"msgtype": "text", "text": {"content": message}})
        elif channel == 'email': 
            smtp.sendmail(sender, receiver, message)
        # ... 其他渠道

主流渠道集成实战

1 企业微信机器人(零成本+实时)

  • 创建机器人:群聊→添加机器人→复制Webhook地址。
  • 脚本示例:
    import requests
    def wechat_alert(msg):
        webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
        data = {"msgtype": "markdown", "markdown": {"content": f"# ⚠️告警\n{msg}"}}
        requests.post(webhook, json=data, timeout=5)

2 邮件推送(兼容性强)

  • 使用Gmail或自建SMTP服务器,需开启“允许不安全应用”或使用授权码。
  • 支持HTML模板,适合发送详细日志或报表。

3 短信(高优先级)

  • 以阿里云为例:配置AccessKey,调用SendSms接口,注意短信签名需提前审核,且模板变量需符合规范。

4 钉钉/飞书机器人

  • 类似微信,通过Webhook接收Markdown格式消息,支持@指定人员。

告警消息模板与去重策略

模板设计原则

  • 包含:时间、级别(紧急/警告/信息)、具体内容、处理建议。
    示例:
    [紧急] 服务器CPU过载  
    时间:2025-03-20 14:30:22  
    主机:web-01 (192.168.1.10)  
    当前负载:95%  
    建议:立即重启nginx或扩容  

去重机制(防止刷屏)

  • 时间窗口去重:相同告警类型在5分钟内只发送一次,使用哈希表记录最后一次发送时间。
  • 聚合发送:多条同类告警合并为一条汇总消息,“过去10分钟发生12次数据库连接超时”。

高可用架构:失败重试与轮换机制

重试策略

  • 指数退避:第一次失败后等待1秒,第二次2秒,第三次4秒,最多3次。
    代码逻辑:
    for i in range(3):
        try:
            send_message(channel, msg)
            break
        except Exception as e:
            time.sleep(2**i)

渠道轮换

  • 若主渠道(微信)连续失败2次,自动切换到备用渠道(短信),并记录日志。
  • 可用一个优先级列表:['wechat', 'dingtalk', 'email', 'sms'],依次尝试。

常见问题与问答环节

Q1:如何确保脚本在多个平台兼容?
A:统一抽象一个send_alarm函数,内部根据配置动态加载不同渠道模块,推荐使用工厂模式,如factory.get_channel('wechat').send(msg)

Q2:短信渠道如何防止被封禁?
A:遵守以下规则:

  • 不发送敏感或广告内容。
  • 添加签名和退订回复(如“回复TD退订”)。
  • 控制频率,避免单日超1000条(视平台而定)。

Q3:微信Webhook被滥用怎么办?
A:限制IP白名单(仅允许服务器IP调用),并使用HTTPS协议,同时建议每天轮换Webhook密钥。

Q4:如何测试所有渠道是否正常?
A:开发一个test_channels函数,循环调用各渠道发送固定测试消息(如“这是一个告警测试,请忽略”),并检查HTTP状态码为200。

Q5:如果所有渠道都失败,如何处理?
A:写入本地日志文件,并通过系统日志(如syslog)上报,同时触发一个守护进程的重试任务,例如使用cron每5分钟检查未发送告警队列。


通过以上设计,你的脚本便具备高可用、零遗漏的多渠道告警推送能力,建议先从小规模(微信+邮件)开始,再逐步加入短信等成本较高的渠道,定期检查各渠道API变更,尤其是微信和钉钉的Webhook接口升级。

抱歉,评论功能暂时关闭!