深色模式
RabbitMQ 监控
摘要:RabbitMQ 出问题最典型的信号是队列持续堆积。本文教你启用内置的 Prometheus 插件暴露队列指标,用命令行快速定位堆积队列,配置分级告警,并给出"消息堆积了先看什么"的处置顺序。
适用环境
bash
sudo rabbitmqctl status | head -10
sudo rabbitmq-plugins list | grep prometheus # 确认插件存在(3.8+ 内置)
sudo ss -ltnp | grep 156721
2
3
2
3
操作步骤
1. 启用 Prometheus 插件
bash
sudo rabbitmq-plugins enable rabbitmq_prometheus
sudo systemctl restart rabbitmq-server
curl -s http://127.0.0.1:15692/metrics | head -5 # 默认端口 156921
2
3
2
3
2. 认识核心指标
bash
curl -s http://127.0.0.1:15692/metrics | grep -E '^rabbitmq_queue_messages' | head1
| 指标 | 含义 | 关注点 |
|---|---|---|
rabbitmq_queue_messages_ready | 等待投递的消息数 | 持续增长 = 消费能力不足 |
rabbitmq_queue_messages_unacknowledged | 已投递未确认数 | 高说明消费者处理慢或卡住 |
rabbitmq_queue_consumers | 消费者数量 | 为 0 说明消费者掉线 |
rabbitmq_queue_messages_published_total | 累计生产速率 | 与消费速率对比看趋势 |
rabbitmq_connections | 连接数 | 突降可能是网络或客户端故障 |
3. 命令行快速定位堆积队列
bash
# 按消息数倒序查看(含消费者数)
sudo rabbitmqctl list_queues name messages messages_ready \
messages_unacknowledged consumers --sort messages -q
# 只看没有消费者的队列(最容易堆积)
sudo rabbitmqctl list_queues name messages consumers -q \
| awk '$4==0 && $2>0 {print "NO CONSUMER:", $1, $2}'1
2
3
4
5
6
7
2
3
4
5
6
7
4. 接入 Prometheus
yaml
scrape_configs:
- job_name: rabbitmq
static_configs:
- targets: ['10.0.0.1:15692']1
2
3
4
2
3
4
5. 配置堆积告警
yaml
groups:
- name: rabbitmq-queue
rules:
- alert: RabbitMQQueueBacklog
expr: rabbitmq_queue_messages_ready > 10000
for: 5m
labels: {severity: warning}
annotations: {summary: "队列 {{ $labels.queue }} 堆积 {{ $value | humanize }} 条"}
- alert: RabbitMQNoConsumer
expr: rabbitmq_queue_consumers == 0 and rabbitmq_queue_messages_ready > 0
for: 2m
labels: {severity: critical}
annotations: {summary: "队列 {{ $labels.queue }} 有消息但无消费者"}
- alert: RabbitMQUnackedHigh
expr: rabbitmq_queue_messages_unacknowledged > 5000
for: 10m
labels: {severity: warning}
annotations: {summary: "大量消息已投递但未 ack,消费者可能卡死"}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
6. 堆积后的处置顺序
bash
# 1) 看消费者是否在线
sudo rabbitmqctl list_consumers -q | head
# 2) 看是否有消息长期 unack(消费线程卡住)
sudo rabbitmqctl list_queues name messages_unacknowledged -q
# 3) 看连接是否异常抖动
sudo rabbitmqctl list_connections -q | wc -l
# 4) 临时扩容消费者实例,观察 ready 是否下降1
2
3
4
5
6
7
2
3
4
5
6
7
DANGER
不要用 rabbitmqctl purge_queue 清理生产堆积队列"恢复指标正常"——这会直接丢弃业务消息。只有在确认消息可丢弃时才使用,且必须走审批。
验证
bash
# 1) 指标端点可访问
curl -sfS http://127.0.0.1:15692/metrics >/dev/null && echo "metrics OK"
# 2) 制造堆积:只生产不消费,观察 ready 上升
curl -u appuser:'StrongPass!2026' -H 'content-type: application/json' \
-X POST http://127.0.0.1:15672/api/exchanges/%2Fprod/amq.default/publish \
-d '{"properties":{},"routing_key":"ha.demo","payload":"test","payload_encoding":"string"}'
sudo rabbitmqctl list_queues name messages_ready -q
# 3) 消费后确认回落
sudo rabbitmqadmin get queue=ha.demo ackmode=ack_requeue_false count=101
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
常见坑
WARNING
messages_unacknowledged 高不等于消费慢,也可能是消费者 prefetch 设置过大,一次性取走大量消息但处理不过来。适当调小 prefetch_count(如 10-50)能让负载更均衡。
WARNING
Prometheus 插件默认监听 15692,若只开放了 15672 会导致抓取失败。检查防火墙与安全组是否放行该端口。
DANGER
死信队列(DLX)里堆积的消息不会计入原队列的 ready 指标,容易被忽略。请为死信队列单独配置告警,否则消息失败后石沉大海。