Prometheus 监控 RabbitMQ 终极实战:从队列深度到集群脑裂的一站式可观测性
Prometheus 监控 RabbitMQ 终极实战:从队列深度到集群脑裂的一站式可观测性
RabbitMQ 作为消息队列的常青树,其 队列堆积、消费速率、连接/通道数、内存与磁盘水位以及 集群网络分区 是保障消息系统高可用的命脉。RabbitMQ 3.8 起内置了 rabbitmq_prometheus 插件,可直接暴露符合 Prometheus 标准的指标,彻底淘汰了古老的独立 rabbitmq_exporter。本文将带你从插件启用到告警落地,全面掌握 RabbitMQ 的原生可观测性。
1. 方案选型:内置插件 vs 独立导出器
| 方案 | 优点 | 缺点 |
|---|---|---|
| rabbitmq_prometheus(内置) | 官方维护,指标丰富(涵盖所有 Erlang 指标、队列、连接、通道等);无需额外进程;支持聚合(/metrics/per-object);实时性好 |
仅 RabbitMQ 3.8+ 可用 |
| 独立 rabbitmq_exporter | 支持旧版本(3.6/3.7) | 指标较少,社区维护,已不推荐 |
明确选择:使用内置插件 rabbitmq_prometheus,所有现代部署都应首选。
2. 启用 rabbitmq_prometheus 插件
2.1 启用插件并配置
在任意 RabbitMQ 节点上执行:
rabbitmq-plugins enable rabbitmq_prometheus
插件默认会在 15692 端口上暴露指标,路径为:
/metrics:聚合的集群级别指标(节点、连接总数等)/metrics/per-object:每个队列、连接、通道的详细指标(会产生大量数据,适合精细化监控)
2.2 创建监控用户(可选,但强烈建议)
为 Prometheus 创建一个最小权限的用户,而非使用 guest:
rabbitmqctl add_user prometheus StrongPassword
rabbitmqctl set_permissions -p / prometheus "" "" ".*" # 只读权限
rabbitmqctl set_user_tags prometheus monitoring # 允许访问管理 API
注意:内置插件本身不需要认证即可访问
/metrics,但如果你希望加入认证,需在advanced.config中配置prometheus.return_per_object_metrics以及启用 HTTP 认证(配置management.oauth或反向代理)。
如果你想保护指标端点,可使用 Nginx/Caddy 反代并添加 basic_auth。因为插件默认无鉴权,生产环境强烈建议反代或防火墙。
2.3 验证
curl http://localhost:15692/metrics | head -20
应看到大量 rabbitmq_ 开头的指标。
3. 配置 Prometheus 抓取
scrape_configs:
- job_name: 'rabbitmq'
scrape_interval: 30s
static_configs:
- targets:
- 'rabbitmq-node1:15692'
- 'rabbitmq-node2:15692'
- 'rabbitmq-node3:15692'
labels:
cluster: 'rmq-prod'
env: 'production'
如果使用了反向代理加认证,需配置 basic_auth 和 metrics_path。
对于 /metrics/per-object,建议单独创建一个 job,抓取间隔可以更长(如 60s),以防指标量爆炸。
- job_name: 'rabbitmq-per-object'
scrape_interval: 60s
metrics_path: /metrics/per-object
static_configs:
- targets: ['rabbitmq-node1:15692']
labels:
cluster: 'rmq-prod'
4. 核心指标解读与 PromQL
内置插件的指标按照 对象类型 分组,最常用的如下:
| 分类 | 核心指标 | 含义 | PromQL 示例 |
|---|---|---|---|
| 节点存活 | rabbitmq_up(或 erlang_vm_uptime_seconds) |
1 = 节点运行 | 直接告警 |
| 内存 | rabbitmq_process_memory_used_bytesrabbitmq_disk_space_available_bytes |
节点内存使用 / 磁盘可用 | 与内存限额比较:rabbitmq_process_memory_used_bytes / rabbitmq_resident_memory_limit_bytes |
| 内存水位 | rabbitmq_memory_limit_bytes |
内存上限 | 使用率 > 80% 需告警 |
| 磁盘水位 | rabbitmq_disk_space_available_bytes |
可用磁盘字节 | 低于磁盘限额阈值时告警 |
| 文件描述符 | rabbitmq_process_max_fds / rabbitmq_process_open_fds |
已用/最大文件描述符 | rabbitmq_process_open_fds / rabbitmq_process_max_fds |
| 连接数 | rabbitmq_connections_total |
当前连接数 | 直接查看 |
| 通道数 | rabbitmq_channels_total |
当前通道数 | 连接与通道比值 |
| 队列消息 | rabbitmq_queue_messages (per-object) |
队列中消息总数 | 按队列求和 |
| 消息速率 | rabbitmq_channel_messages_published_totalrabbitmq_channel_messages_delivered_total |
发布/投递计数 | rate(rabbitmq_channel_messages_published_total[1m]) |
| 消息确认 | rabbitmq_channel_messages_acked_total |
已确认计数 | 配合未确认:rabbitmq_channel_messages_unacked |
| 未确认消息 | rabbitmq_channel_messages_unacked |
未确认消息数(可能堆积) | > 1000 需关注 |
| 消费者数量 | rabbitmq_queue_consumers |
队列上的消费者数 | 为 0 且队列有消息 → 告警 |
| 不可路由消息 | rabbitmq_channel_messages_unroutable_returned_total |
无法路由的消息 | rate(... [5m]) > 0 可能配置错误 |
| 网络分区 | rabbitmq_partition_handling_mode (集群) |
当前分区状态 | 值变化或脑裂指示器 |
重要 PromQL 计算:
- 内存使用率:
rabbitmq_process_memory_used_bytes / rabbitmq_resident_memory_limit_bytes - 发布速率:
sum(rate(rabbitmq_channel_messages_published_total[1m]))(全局) - 队列堆积深度:
rabbitmq_queue_messages > 10000 - 无消费者队列:
rabbitmq_queue_messages > 0 and rabbitmq_queue_consumers == 0
5. Grafana 仪表盘推荐
- RabbitMQ-Overview (Official):Dashboard ID 10991(官方出品,完美适配内置插件),展示节点资源、队列、连接、消息速率等。
- RabbitMQ Quorum Queues:ID 12675,若使用 Quorum 队列。
- RabbitMQ Dashboard for Prometheus:ID 4279,备选轻量级。
导入后选择数据源,设置 cluster 变量,即可看到全局健康视图。
6. 告警规则实战
groups:
- name: rabbitmq_alerts
rules:
- alert: RabbitMQNodeDown
expr: rabbitmq_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "RabbitMQ 节点 {{ $labels.instance }} 宕机"
- alert: RabbitMQMemoryHigh
expr: (rabbitmq_process_memory_used_bytes / rabbitmq_resident_memory_limit_bytes) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} 内存使用率超过 85%"
- alert: RabbitMQDiskSpaceLow
expr: rabbitmq_disk_space_available_bytes / 1024 / 1024 / 1024 < 2
for: 5m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.instance }} 剩余磁盘空间不足 2GB"
- alert: RabbitMQUnackedMessagesHigh
expr: rabbitmq_channel_messages_unacked > 1000
for: 10m
labels:
severity: warning
annotations:
summary: "未确认消息超过 1000,消费者可能落后"
- alert: RabbitMQQueueMessagesNoConsumer
expr: rabbitmq_queue_messages > 0 and rabbitmq_queue_consumers == 0
for: 5m
labels:
severity: critical
annotations:
summary: "队列 {{ $labels.queue }} 中有消息但没有消费者"
- alert: RabbitMQHighPublishRateDrop
expr: rate(rabbitmq_channel_messages_published_total[5m]) < 1
for: 5m
labels:
severity: info
annotations:
summary: "消息发布速率急剧下降,可能生产者异常"
- alert: RabbitMQPartitionDetected
expr: rabbitmq_partition_handling_mode != "ignore" # 简化,实际需检测具体状态
# 准确做法是监控 rabbitmq_partition_handling_mode 值是否为 1(分区),但指标因版本而异;可通过集群节点心跳间接判断
# 更可靠:监控 `rabbitmq_running_nodes` 总数是否小于预期
expr: rabbitmq_running_nodes < 3
for: 1m
labels:
severity: critical
annotations:
summary: "RabbitMQ 集群可用节点数不足,可能发生网络分区"
建议添加文件描述符使用率、连接数过高等告警。
7. 进阶:集群、安全与多租户
7.1 集群监控要点
- 确保抓取每个节点的
/metrics端口,观察rabbitmq_running_nodes和rabbitmq_cluster_nodes_total。 - 使用
rabbitmq_queue_messages的queue标签定位具体队列的堆积,但不区分 vhost(默认/)。若有多 vhost,需要为每个 vhost 创建单独用户并抓取,或使用per-object指标的vhost标签。 - 镜像队列(classic mirrored queues)已弃用,推荐 quorum queues,其监控指标包含
rabbitmq_quorum_queue_messages等。
7.2 启用 TLS 和认证
若需要保护指标端点,可配置 RabbitMQ 的管理 HTTPS,或者在 Prometheus 与 RabbitMQ 之间放置 Envoy/Nginx 反向代理,添加 TLS 和 Basic Auth。
例如 Nginx 配置:
location /metrics {
proxy_pass http://localhost:15692/metrics;
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
}
然后 Prometheus 抓取 Nginx 端口并设置 basic_auth。
7.3 指标过滤与性能
/metrics 本身已过滤掉部分瞬时指标,体量可控。但 per-object 指标在队列数量超过几百时会显著增加 Prometheus 存储压力。因此:
- 常规监控只抓
/metrics。 - 当需要排查具体队列时,临时启用
/metrics/per-object的抓取,或在 Prometheus 中使用metric_relabel_configs丢弃不需要的指标。
8. 安全与运维建议
- 监控用户权限:仅授予
monitoring标签和空权限("" "" ".*")即可查看所有对象。 - 防火墙:限制 15692 端口的访问来源,仅 Prometheus 服务器可达。
- 插件更新:RabbitMQ 升级时,确认
rabbitmq_prometheus插件的兼容性,并在升级后重启插件。
部署完成后,RabbitMQ 的节点资源、消息吞吐、队列堆积、未确认消息、网络分区等一切信号都将实时汇聚在 Grafana 仪表盘。一旦出现消费者掉线、队列爆炸或内存告急,告警系统会立即通知,让消息中间件从“盲盒”变成透明、可预测、可自愈的核心组件。结合已有的主机与应用监控,你的全栈可观测性拼图至此完美闭环。
更多推荐



所有评论(0)