夜莺监控短信告警实战:从脚本编写到接口对接全流程

发布时间:2026/7/3 17:56:27

夜莺监控短信告警实战:从脚本编写到接口对接全流程 1. 夜莺监控短信告警的必要性当服务器CPU使用率飙升到90%以上或者数据库连接数突然爆满时运维同学如果没能及时收到告警信息很可能导致业务中断。夜莺监控虽然内置了邮件、钉钉等通知方式但在实际生产环境中短信告警仍然是不可替代的最后一道防线——毕竟不是所有人都会24小时盯着工作群。我在多个企业的监控系统落地过程中发现短信告警的到达率和及时性往往是最高的。有一次凌晨3点某电商平台的订单服务出现异常正是短信告警让值班工程师在5分钟内就完成了故障定位和恢复。这种关键时刻其他通知方式都可能因为各种原因被错过。2. 基础环境准备2.1 夜莺监控安装部署建议使用Docker Compose方式部署这里给出一个标准配置模板version: 3 services: nightingale: image: flashcatcloud/nightingale:latest ports: - 17000:17000 volumes: - ./data:/home/n9e/data environment: - MYSQL_DSNroot:1234tcp(mysql:3306)/n9e?charsetutf8mb4parseTimeTrue depends_on: - mysql - redis mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD1234 volumes: - ./mysql:/var/lib/mysql redis: image: redis:alpine部署完成后通过docker-compose up -d启动服务访问http://localhost:17000 即可进入管理界面。2.2 Python环境配置由于我们需要编写Python脚本对接短信接口建议在夜莺服务所在主机安装Python3环境# CentOS yum install python3 python3-pip -y # Ubuntu apt-get update apt-get install python3 python3-pip -y # 安装必要依赖 pip3 install requests3. 短信告警通道配置3.1 添加通知媒介在夜莺管理界面依次进入告警通知 → 通知设置 → 通知媒介点击添加按钮填写名称如短信告警和标识必须填写sms保存配置这个标识sms非常重要后续在告警规则中勾选短信通知时系统就是通过这个标识来识别通知类型的。3.2 设计短信模板短信模板决定了告警信息的呈现方式。考虑到短信按条计费且长度有限建议只包含最关键信息【紧急告警】{{if .IsRecovered}}已恢复{{else}}触发告警{{end}} 规则: {{.RuleName}} 主机: {{.TargetIdent}} 当前值: {{.TriggerValue}} 时间: {{timestamp}}这个模板使用了Go Template语法其中.IsRecovered判断是告警触发还是恢复.RuleName显示告警规则名称.TargetIdent显示异常主机标识.TriggerValue显示触发时的监控值实测下来这种精简模板既能传达关键信息又能控制短信在70个汉字以内避免被拆分成多条发送。4. Python脚本开发实战4.1 脚本基础框架创建/home/n9e/scripts/sms_notify.py文件内容如下#!/usr/bin/env python3 import sys import json import requests from pathlib import Path class Sender: classmethod def send_sms(cls, payload): try: # 获取短信内容 content payload[tpls][sms] # 获取接收人手机号 phones [] for user in payload[event][notify_users_obj]: if user.get(phone): phones.append(user[phone]) if not phones: print(No phone numbers found) return # 调用短信接口 cls.call_sms_api(phones, content) except Exception as e: print(fSMS send failed: {str(e)}) classmethod def call_sms_api(cls, phones, content): 实际调用短信接口的方法 # 这里需要替换为你的短信服务商API print(fShould send to {phones}: {content[:30]}...) def main(): try: payload json.load(sys.stdin) # 保存payload用于调试 debug_file Path(__file__).parent / .sms_payload debug_file.write_text(json.dumps(payload, indent2)) # 根据通知渠道调用对应方法 for channel in payload[event][notify_channels]: if channel sms: Sender.send_sms(payload) except Exception as e: print(fScript error: {str(e)}) if __name__ __main__: main()4.2 对接短信服务商API不同短信服务商的API各有差异但通常都会提供HTTP接口。以下是几个常见服务商的对接示例阿里云短信服务示例classmethod def call_sms_api(cls, phones, content): params { PhoneNumbers: ,.join(phones), SignName: 你的签名, TemplateCode: SMS_123456, TemplateParam: json.dumps({code: content}) } response requests.post( https://dysmsapi.aliyuncs.com/, paramsparams, auth(你的AccessKey, 你的Secret) ) if response.json().get(Code) ! OK: raise Exception(response.text)腾讯云短信服务示例classmethod def call_sms_api(cls, phones, content): data { tel: [{nationcode: 86, mobile: phone} for phone in phones], type: 0, msg: content, sig: 你的签名, time: int(time.time()), extend: , ext: } response requests.post( https://yun.tim.qq.com/v5/tlssmssvr/sendmultisms2, jsondata ) if response.json().get(result) ! 0: raise Exception(response.text)4.3 脚本调试技巧开发过程中可以通过以下方法调试手动测试脚本cat test_payload.json | python3 sms_notify.py查看调试文件 脚本会自动在相同目录下生成.sms_payload文件包含完整的告警信息。夜莺日志监控docker logs -f nightingale | grep -i sms5. 全流程测试验证5.1 配置告警接收人进入系统配置 → 用户管理为相关用户设置手机号创建告警接收组并添加这些用户5.2 创建测试告警规则配置一个必定触发的测试规则PromQLnode_memory_MemAvailable_bytes / node_memory_MemTotal_bytes 1持续时长0立即触发通知媒介勾选短信告警告警接收组选择刚创建的组5.3 验证短信接收触发告警后检查夜莺日志中是否有脚本执行记录短信接口是否被正确调用目标手机是否实际收到短信6. 生产环境注意事项在实际运维中我发现有几个关键点需要特别注意短信频率限制配置合理的告警聚合规则避免短时间内发送大量短信。我曾经遇到过某个服务异常导致每分钟发送上百条短信的情况。接口超时处理在脚本中添加重试机制建议这样实现classmethod def call_sms_api(cls, phones, content, retry3): for i in range(retry): try: response requests.post(..., timeout5) if response.ok: return except Exception: if i retry - 1: raise time.sleep(1)敏感信息保护不要在短信中暴露服务器IP等敏感信息可以使用别名代替。多服务商备用重要业务建议对接两个短信服务商在主服务商不可用时自动切换。脚本权限设置确保夜莺进程有权限执行脚本chmod x /home/n9e/scripts/sms_notify.py chown -R n9e:n9e /home/n9e/scripts这套短信告警方案在某大型电商平台稳定运行了两年多日均处理告警300条在多次重大故障中及时通知了运维团队。特别是在网络抖动导致其他通知方式不可用时短信告警成为了最可靠的通知渠道。

相关新闻