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-pluginsenablerabbitmq_prometheus插件默认会在15692端口上暴露指标路径为/metrics聚合的集群级别指标节点、连接总数等/metrics/per-object每个队列、连接、通道的详细指标会产生大量数据适合精细化监控2.2 创建监控用户可选但强烈建议为 Prometheus 创建一个最小权限的用户而非使用guestrabbitmqctl 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 验证curlhttp://localhost:15692/metrics|head-20应看到大量rabbitmq_开头的指标。3. 配置 Prometheus 抓取scrape_configs:-job_name:rabbitmqscrape_interval:30sstatic_configs:-targets:-rabbitmq-node1:15692-rabbitmq-node2:15692-rabbitmq-node3:15692labels:cluster:rmq-prodenv:production如果使用了反向代理加认证需配置basic_auth和metrics_path。对于/metrics/per-object建议单独创建一个 job抓取间隔可以更长如 60s以防指标量爆炸。-job_name:rabbitmq-per-objectscrape_interval:60smetrics_path:/metrics/per-objectstatic_configs:-targets:[rabbitmq-node1:15692]labels:cluster:rmq-prod4. 核心指标解读与 PromQL内置插件的指标按照对象类型分组最常用的如下分类核心指标含义PromQL 示例节点存活rabbitmq_up或erlang_vm_uptime_seconds1 节点运行直接告警内存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 05. Grafana 仪表盘推荐RabbitMQ-Overview (Official)Dashboard ID10991官方出品完美适配内置插件展示节点资源、队列、连接、消息速率等。RabbitMQ Quorum QueuesID12675若使用 Quorum 队列。RabbitMQ Dashboard for PrometheusID4279备选轻量级。导入后选择数据源设置cluster变量即可看到全局健康视图。6. 告警规则实战groups:-name:rabbitmq_alertsrules:-alert:RabbitMQNodeDownexpr:rabbitmq_up 0for:1mlabels:severity:criticalannotations:summary:RabbitMQ 节点 {{ $labels.instance }} 宕机-alert:RabbitMQMemoryHighexpr:(rabbitmq_process_memory_used_bytes / rabbitmq_resident_memory_limit_bytes)0.85for:5mlabels:severity:warningannotations:summary:节点 {{ $labels.instance }} 内存使用率超过 85%-alert:RabbitMQDiskSpaceLowexpr:rabbitmq_disk_space_available_bytes / 1024 / 1024 / 1024 2for:5mlabels:severity:criticalannotations:summary:节点 {{ $labels.instance }} 剩余磁盘空间不足 2GB-alert:RabbitMQUnackedMessagesHighexpr:rabbitmq_channel_messages_unacked1000for:10mlabels:severity:warningannotations:summary:未确认消息超过 1000消费者可能落后-alert:RabbitMQQueueMessagesNoConsumerexpr:rabbitmq_queue_messages0 and rabbitmq_queue_consumers 0for:5mlabels:severity:criticalannotations:summary:队列 {{ $labels.queue }} 中有消息但没有消费者-alert:RabbitMQHighPublishRateDropexpr:rate(rabbitmq_channel_messages_published_total[5m]) 1for:5mlabels:severity:infoannotations:summary:消息发布速率急剧下降可能生产者异常-alert:RabbitMQPartitionDetectedexpr:rabbitmq_partition_handling_mode!ignore# 简化实际需检测具体状态# 准确做法是监控 rabbitmq_partition_handling_mode 值是否为 1分区但指标因版本而异可通过集群节点心跳间接判断# 更可靠监控 rabbitmq_running_nodes 总数是否小于预期expr:rabbitmq_running_nodes 3for:1mlabels:severity:criticalannotations: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 仪表盘。一旦出现消费者掉线、队列爆炸或内存告急告警系统会立即通知让消息中间件从“盲盒”变成透明、可预测、可自愈的核心组件。结合已有的主机与应用监控你的全栈可观测性拼图至此完美闭环。