PM2 Health批量告警配置失效,请求优化异常告警频率
解决PM2-health告警频率过高的问题
问题背景
我需要限制PM2发送异常告警的频率:应用崩溃触发异常时立即发送告警,但下一次告警需至少间隔5分钟。目前异常发生时,每分钟都会收到告警邮件,甚至1秒内产生1000次请求时,会收到pm2-health发来的1000条告警,完全不符合预期。
我已经配置了batchPeriodM: 5和batchMaxMessages: 1,本以为能将5分钟内的消息批量聚合只发1条,但配置未生效。
当前配置文件
module_conf.json
{ "pm2-health": { "smtp": { "host": "", "port": 465, "user": "", "password": "", "secure": true, "disabled": false }, "mailTo": "", "replyTo": "", "batchPeriodM": 5, "batchMaxMessages": 1, "events": [ "exit" ], "exceptions": true, "messages": true, "messageExcludeExps": [], "metric": {}, "metricIntervalS": 60, "aliveTimeoutS": 300, "addLogs": true, "appsExcluded": [], "snapshot": { "url": "", "token": "", "auth": { "user": "", "password": "" }, "disabled": false } } }
ecosystem.config.js
{ "apps":[ { "name":"Server", "script":"server.js", "exec_mode":"fork", "merge_logs":true, "cwd":"/home/ubuntu/code/apps/server", "error_file":"/var/log/pm2/service/server-error.log", "out_file":"/var/log/pm2/service/server-out.log", "env":{ "NODE_ENV":"production", "PORT" : "5002" } } ] }
解决方案
1. 升级pm2-health到最新版本
部分旧版本的pm2-health对批量告警逻辑存在bug,先升级到最新稳定版:
pm2 uninstall pm2-health pm2 install pm2-health@latest pm2 reload ecosystem.config.js
2. 调整pm2-health配置,添加去重与聚合逻辑
修改module_conf.json,补充关键参数来限制告警频率:
{ "pm2-health": { // 保留原有SMTP、收件人等配置 "smtp": { /* ... */ }, "mailTo": "", "replyTo": "", // 批量聚合配置(保留原有设置) "batchPeriodM": 5, "batchMaxMessages": 1, // 新增:设置事件冷却时间,同一事件5分钟内仅触发一次告警 "eventCoolDownM": 5, // 确保仅监听必要事件,避免冗余触发 "events": ["exit"], // 关闭单独的消息告警(若告警主要来自exit事件) "messages": false, // 开启异常聚合,合并同周期内的同类异常 "aggregateExceptions": true, // 保留其他原有配置 "exceptions": true, "messageExcludeExps": [], "metric": {}, "metricIntervalS": 60, "aliveTimeoutS": 300, "addLogs": true, "appsExcluded": [], "snapshot": { /* ... */ } } }
3. 优化PM2应用重启策略,减少崩溃触发次数
在ecosystem.config.js中添加重启限制,避免应用短时间内反复崩溃:
{ "apps":[ { "name":"Server", "script":"server.js", "exec_mode":"fork", "merge_logs":true, "cwd":"/home/ubuntu/code/apps/server", "error_file":"/var/log/pm2/service/server-error.log", "out_file":"/var/log/pm2/service/server-out.log", // 崩溃后延迟3秒重启,避免瞬间重复崩溃 "restart_delay": 3000, // 5分钟内最多重启5次,超过则停止应用(避免无限循环) "max_restarts": 5, "env":{ "NODE_ENV":"production", "PORT" : "5002" } } ] }
4. 验证配置生效
修改完成后,重启PM2和pm2-health模块:
pm2 restart all pm2 reload pm2-health
手动模拟应用崩溃(比如pm2 delete Server再重启后触发崩溃),观察5分钟内是否仅收到1条告警。
内容的提问来源于stack exchange,提问作者Anjali Rajput
相关产品推荐
相关产品推荐

