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_authmetrics_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_bytes
rabbitmq_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_total
rabbitmq_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_nodesrabbitmq_cluster_nodes_total
  • 使用 rabbitmq_queue_messagesqueue 标签定位具体队列的堆积,但不区分 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 仪表盘。一旦出现消费者掉线、队列爆炸或内存告急,告警系统会立即通知,让消息中间件从“盲盒”变成透明、可预测、可自愈的核心组件。结合已有的主机与应用监控,你的全栈可观测性拼图至此完美闭环。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐