监控指标体系
RabbitMQ 提供丰富的运行时指标,构建合理的指标体系是保障消息系统稳定运行的前提。
核心指标分类
1. 消息速率指标
| 指标名 | 含义 | 单位 |
|---|---|---|
messages_publish_rate | 生产者发布速率 | msg/s |
messages_deliver_rate | 消费者投递速率 | msg/s |
messages_confirm_rate | 消息确认速率 | msg/s |
messages_redeliver_rate | 重新投递速率 | msg/s |
发布速率持续高于投递速率时,队列将产生积压。
Java
// 通过 HTTP API 获取消息速率
import com.rabbitmq.client.HttpFirehose;
public class MetricsExample {
public static void main(String[] args) throws Exception {
// 实际通过 /api/overview 或 Prometheus exporter 获取
// 示例:GET http://localhost:15672/api/overview
String overview = "
{
"queue_totals": {
"messages": 15230,
"messages_ready": 12000,
"messages_unacknowledged": 3230
},
"message_stats": {
"publish_details": {"rate": 1250.5},
"deliver_details": {"rate": 1100.3},
"ack_details": {"rate": 1080.0}
}
}
";
System.out.println(overview);
}
}
2. 队列深度指标
| 指标名 | 含义 |
|---|---|
queue_messages | 队列中总消息数(含未确认) |
queue_messages_ready | 可投递的就绪消息数 |
queue_messages_unacknowledged | 消费者已获取但未 ACK 的消息数 |
messages = messages_ready + messages_unacknowledged
3. 连接与通道指标
| 指标名 | 含义 |
|---|---|
object_channels | 当前活跃通道数 |
object_connections | 当前活跃连接数 |
fd_used | 文件描述符使用量 |
连接数过多会导致文件描述符耗尽,触发 too many open files 错误。
4. 内存与磁盘指标
| 指标名 | 含义 |
|---|---|
mem_used | 已用内存(字节) |
mem_limit | 内存水位线 |
disk_free | 可用磁盘空间 |
disk_free_limit | 磁盘空间下限 |
达到内存水位线(默认 40% 可用内存)时触发 Flow Control,生产者将被阻塞。
告警规则配置
基础告警阈值
| 指标 | 警告阈值 | 严重阈值 | 说明 |
|---|---|---|---|
queue_messages_ready | > 10,000 | > 50,000 | 队列积压告警 |
messages_publish_rate / messages_deliver_rate | > 1.2 | > 2.0 | 产销比失衡 |
object_connections | > 500 | > 1000 | 连接数过载 |
mem_used / mem_limit | > 0.6 | > 0.8 | 内存使用告警 |
disk_free / disk_free_limit | < 2.0 | < 1.0 | 磁盘空间告警(倍数) |
Prometheus AlertManager 规则示例
YAML
groups:
- name: rabbitmq.rules
rules:
- alert: RabbitMQQueueBuildup
expr: rabbitmq_queue_messages_ready > 50000
for: 5m
labels:
severity: critical
annotations:
summary: "队列积压超过 50000 条"
- alert: RabbitMQFlowControl
expr: rabbitmq_node_mem_used / rabbitmq_node_mem_limit > 0.8
for: 2m
labels:
severity: warning
annotations:
summary: "RabbitMQ 触发流控,生产者被阻塞"
- alert: RabbitMQDiskLow
expr: rabbitmq_node_disk_free < rabbitmq_node_disk_free_limit
for: 1m
labels:
severity: critical
annotations:
summary: "磁盘空间不足,已触达下限"
告警触发时间(
for)需根据业务容忍度调整:队列积压可容忍较长时间,内存和磁盘告警应快速响应。
指标采集方式
RabbitMQ 支持三种指标采集方式:
- HTTP API:
/api/overview、/api/queues等端点,适合低频轮询 - Prometheus 插件:
rabbitmq_prometheus,暴露/metrics端点 - Management Plugin:Web UI 直接查看
Java
// 使用 HTTP API 批量获取队列指标
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;
public class QueueMetricsCollector {
private static final String API_URL = "http://localhost:15672/api/queues";
private static final String AUTH = Base64.getEncoder()
.encodeToString("guest:guest".getBytes());
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL))
.header("Authorization", "Basic " + AUTH)
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
注意事项
- 指标采集频率不宜过高,建议 15s~30s 一次,避免对 Broker 造成额外压力
messages_unacknowledged突增说明消费者处理缓慢或卡死,需优先排查- 内存和磁盘指标必须设置硬性告警,Flow Control 触发后恢复成本较高
- 产销比(publish/deliver)持续大于 1 说明消费者能力不足或存在慢查询
- 连接数和通道数应设置上限,通过
max_connections参数限制
要点总结
- 消息速率、队列深度、连接数、资源使用率是四大核心指标类别
- 队列积压、产销比失衡、内存/磁盘触达是三类典型告警场景
- Prometheus 插件是推荐的采集方式,配合 AlertManager 实现自动告警
- HTTP API 适合低频采集或临时诊断场景
- 告警阈值需结合业务容忍度与集群容量综合设定
📝 发现内容有误?点击此处直接编辑