MongoDB 告警规则:8 条 PromQL 规则与处置步骤
8 条开箱可用的 MongoDB 告警规则(PromQL),每条附级别、持续时间和处置步骤。指标来自 mongodb_exporter。可下载为 Prometheus 规则文件,或导入夜莺。
最后校对于
MongoDB 告警规则:实例宕机或刚重启、连接数逼近上限、平均操作延迟过高、Assert 错误、游标超时、缺页中断、副本集主从延迟。使用 mongodb_exporter 的指标名。
概览
- 8 条规则,每条都有 PromQL 触发条件、级别、持续时间(
for)和处置步骤 - 指标来源:mongodb_exporter
- 下载:
mongodb.yml,标准 Prometheus 规则文件(groups:格式),已用promtool check rules校验 - 阈值只是起点,启用前请按自己的环境调整。
规则一览
| 规则 | 级别 | 持续 |
|---|---|---|
| MongoDB average operation latency exceeds 250ms - exporter | 警告 | 10 分钟 |
| Mongo connection number has exceeded 80% - exporter | 警告 | 2 分钟 |
| Mongo has encountered an Assert error - exporter | 提醒 | 30 分钟 |
| Mongo has encountered cursor timeout - exporter | 警告 | 30 分钟 |
| Mongo has encountered page fault interrupt - exporter | 警告 | 30 分钟 |
| Mongo has just restarted, please pay attention - exporter | 提醒 | — |
| Mongo instance has crashed - exporter | 紧急 | — |
| Mongo replica set master-slave delay exceeds 30 seconds - exporter | 紧急 | 1 分钟 |
Prometheus exporter(8)
MongoDB average operation latency exceeds 250ms - exporter
警告 · 10 分钟 · 触发条件:
rate(mongodb_mongod_op_latencies_latency_total[5m]) / rate(mongodb_mongod_op_latencies_ops_total[5m]) > 250000
处置步骤:
- db.currentOp({"secs_running":{$gt:5}}) 找当前长时间运行的操作,必要时 db.killOp(opid) 止血;
- 开 profiler 定位慢查询:db.setProfilingLevel(1,100) 后 db.system.profile.find().sort({millis:-1}).limit(10);
- 对慢查询执行 explain("executionStats"),看是否走了 COLLSCAN 全表扫描并补索引;
- 排查是否有大批量写入或索引重建正在占住磁盘 IO。
Mongo connection number has exceeded 80% - exporter
警告 · 2 分钟 · 触发条件:
avg by (instance) (mongodb_connections{state="current"}) / (avg by (instance) (mongodb_connections{state="current"}) + avg by (instance) (mongodb_connections{state="available"})) * 100 > 80
处置步骤:
- db.serverStatus().connections 确认 current 与 available 的真实水位;
- db.currentOp(true) 按 client 分组,找出连接数异常的应用;
- 区分业务增长与驱动连接池泄漏(应用侧 maxPoolSize 配置过大或没有复用 MongoClient);
- 应急可调大 mongod 的 net.maxIncomingConnections,同时核对系统 ulimit -n 是否足够。
Mongo has encountered an Assert error - exporter
提醒 · 30 分钟 · 触发条件:
rate(mongodb_asserts_total{type=~"regular|message"}[5m]) > 0
处置步骤:
- 用 db.adminCommand({getLog:"global"}) 看日志中 assert 的上下文;
- db.serverStatus().asserts 确认是 regular 还是 message 类在涨;
- regular 多为存储层异常,检查磁盘健康与数据文件完整性;message 多为协议或驱动不匹配,核对驱动版本;
- 确认是否与近期升级、schema 变更的时间吻合。
Mongo has encountered cursor timeout - exporter
警告 · 30 分钟 · 触发条件:
rate(mongodb_mongod_metrics_cursor_timed_out_total[5m]) > 0
处置步骤:
- db.serverStatus().metrics.cursor 看 timedOut 与 open.total 的变化;
- 应用侧确认游标用完是否 close(),批处理单批耗时是否过长;
- 长耗时遍历改用 noCursorTimeout 并自行管理生命周期,或调小 batchSize 加快消费;
- 检查是否有慢查询把游标撑过了 cursorTimeoutMillis(默认 10 分钟)。
Mongo has encountered page fault interrupt - exporter
警告 · 30 分钟 · 触发条件:
rate(mongodb_extra_info_page_faults_total[5m]) > 0
处置步骤:
- db.serverStatus().wiredTiger.cache 看 "bytes currently in the cache" 与配置上限的比值;
- 用 db.stats() 和索引大小对比物理内存,评估工作集是否已超内存;
- 优先删除无用索引、归档冷数据来缩小工作集;
- 确认宿主机没有 swap 抖动,必要时扩内存或做分片。
Mongo has just restarted, please pay attention - exporter
提醒 · — · 触发条件:
mongodb_instance_uptime_seconds < 60
处置步骤:
- 看 mongod 日志尾部确认是崩溃、被 OOM kill 还是人工重启;
- 若是 OOM,核对 wiredTigerCacheSizeGB 与宿主机内存后调小;
- 副本集场景用 rs.status() 确认是否已自动选出新主、应用是否已重连;
- 非计划内重启要检查 systemd 或容器编排是否在反复拉起。
Mongo instance has crashed - exporter
紧急 · — · 触发条件:
mongodb_up == 0
处置步骤:
- 登录主机用 systemctl status mongod 或 docker ps 确认进程是否存活;
- 进程存活则用 mongosh 手工连一次,区分实例夯住与网络/认证问题;
- 进程不在则先看日志尾部定位原因(OOM、磁盘满、数据文件损坏)再拉起,不要盲目重启;
- 副本集场景立即执行 rs.status() 确认是否已完成主从切换,并确认应用已摘除该节点。
Mongo replica set master-slave delay exceeds 30 seconds - exporter
紧急 · 1 分钟 · 触发条件:
(max by (rs_nm) (mongodb_rs_members_optimeDate) - min by (rs_nm) (mongodb_rs_members_optimeDate)) / 1000 > 30
处置步骤:
- 在主节点执行 rs.status(),对比各成员的 optimeDate 与 lastHeartbeat 定位落后的成员;
- 到落后节点看 mongod 日志是否有 oplog 拉取报错或磁盘 IO 瓶颈;
- 主节点用 db.currentOp() 确认是否有大批量写入把 oplog 灌满导致从节点追不上;
- 落后超过 oplog 窗口时从节点需要重新初始同步(initial sync),期间先把读流量切走。
怎么使用这些规则
- 用 Prometheus 或 vmalert:下载
mongodb.yml,加到rule_files(vmalert 用-rule参数),对照自己的 exporter 版本核对指标名,再调整阈值。级别写在severity标签里(critical / warning / info),runbook_url指回本页;有单独页面的规则指向它自己的页面。 - 用夜莺:同样的规则内置在 MongoDB 集成模板里。在集成中心把规则导入到业务组,再逐条启用。夜莺会把处置步骤带进每条告警,规则可以对 Prometheus、VictoriaMetrics 等多种数据源求值。
来源与许可
处置步骤和其余规则来自夜莺的集成模板(MongoDB,Apache-2.0),欢迎在那里提 PR 修正。
相关链接
- 用夜莺监控 MongoDB:采集配置、仪表盘与指标说明
- 在夜莺里写指标告警规则
- 全部告警规则