Tracing 插件
Tracing 插件是 Firehose 的轻量级替代方案,支持按条件过滤的消息日志记录,适用于生产环境长期开启的问题溯源。
与 Firehose 对比
| 特性 | Firehose | Tracing |
|---|---|---|
| 追踪范围 | 全局所有消息 | 按需过滤 |
| 性能影响 | 高(全量复制) | 低(按需记录) |
| 配置方式 | rabbitmqctl | HTTP API / 管理界面 |
| 适用场景 | 临时排查 | 长期审计 |
| 存储方式 | 消息队列 | 日志文件 / 队列 |
Firehose 适合短期集中排查,Tracing 适合长期按需追踪。
安装与启用
启用插件
Bash
# 启用 Tracing 插件
rabbitmq-plugins enable rabbitmq_tracing
# 重启生效
rabbitmqctl shutdown
rabbitmq-server -detached
配置追踪规则
HTTP API 配置
Bash
# 创建追踪规则
curl -X PUT -u guest:guest \
http://localhost:15672/api/traces/my-trace \
-H "Content-Type: application/json" \
-d '{
"vhost": "/",
"format": "json",
"pattern": "#",
"ack": true
}'
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
vhost | 追踪的虚拟主机 | / |
format | 输出格式 | json 或 text |
pattern | 过滤模式(topic 通配符) | # 匹配所有 |
ack | 是否自动确认 | true |
Java 客户端配置追踪
Java
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 TracingConfigurator {
private static final String API_URL = "http://localhost:15672/api/traces";
private static final String AUTH = Base64.getEncoder()
.encodeToString("guest:guest".getBytes());
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
// 创建追踪规则 - 仅追踪 order.exchange
String traceRule = "
{
"vhost": "/",
"format": "json",
"pattern": "publish.order.exchange.#",
"ack": true
}
";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL + "/order-trace"))
.header("Content-Type", "application/json")
.header("Authorization", "Basic " + AUTH)
.PUT(HttpRequest.BodyPublishers.ofString(traceRule))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());
}
}
查看追踪日志
命令行查看
Bash
# 列出所有追踪规则
rabbitmqctl list_traces
# 查看追踪日志文件(默认位置)
tail -f /var/log/rabbitmq/rabbit@hostname-trace-order-trace.log
管理界面查看
访问 http://localhost:15672/#/traces,在 Admin → Tracing 页面可查看和启停追踪规则。
过滤模式
Tracing 使用 topic 通配符进行过滤:
| Pattern | 匹配的路由键 |
|---|---|
# | 所有路由键 |
order.# | order.created、order.deleted 等 |
*.created | order.created、user.created(单层匹配) |
order.* | order.created、order.deleted(不匹配 order.created.new) |
日志格式示例
JSON
{
"timestamp": "2026-05-22 10:30:00.123",
"vhost": "/",
"connection": "127.0.0.1:5672 -> 127.0.0.1:49152",
"channel": 1,
"exchange": "order.exchange",
"routing_key": "order.created",
"type": "publish",
"payload": "{\"orderId\": 1001}",
"headers": {
"x-trace-id": "trace-001"
},
"properties": {
"delivery_mode": 2,
"content_type": "application/json"
}
}
动态启停追踪
Java
public class TracingManager {
private static final String TRACE_API = "http://localhost:15672/api/traces";
private static final String AUTH = "Basic " + Base64.getEncoder()
.encodeToString("guest:guest".getBytes());
// 停止追踪
public static void stopTrace(String traceName) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(TRACE_API + "/" + traceName))
.header("Authorization", AUTH)
.DELETE()
.build();
client.send(request, HttpResponse.BodyHandlers.discarding());
System.out.println("Trace stopped: " + traceName);
}
// 更新追踪规则
public static void updateTrace(String traceName, String rule) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(TRACE_API + "/" + traceName))
.header("Content-Type", "application/json")
.header("Authorization", AUTH)
.PUT(HttpRequest.BodyPublishers.ofString(rule))
.build();
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Trace updated: " + traceName);
}
}
注意事项
- Tracing 插件将日志写入磁盘文件,需定期清理或配置日志轮转
- 过滤模式应尽可能精确,避免记录无用消息浪费磁盘
ack=true表示 Broker 自动确认追踪队列的消息,不需要消费者手动 ACK- 追踪规则按 vhost 隔离,不同 vhost 需分别配置
- 生产环境建议配置日志文件大小上限和自动删除策略
要点总结
- Tracing 插件支持按 vhost、Exchange、路由键等维度按需过滤追踪消息
- 通过 HTTP API 或管理界面创建追踪规则,配置 pattern 进行 topic 模式匹配
- 日志默认写入磁盘文件,需定期清理避免磁盘耗尽
- 相比 Firehose 更适合生产环境长期开启的问题溯源
- 过滤规则应精确匹配目标消息范围,降低无效日志量
📝 发现内容有误?点击此处直接编辑