全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-22 10 分钟 ✍️ juanwangdev

Tracing 插件

Tracing 插件是 Firehose 的轻量级替代方案,支持按条件过滤的消息日志记录,适用于生产环境长期开启的问题溯源。

与 Firehose 对比

特性FirehoseTracing
追踪范围全局所有消息按需过滤
性能影响高(全量复制)低(按需记录)
配置方式rabbitmqctlHTTP 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输出格式jsontext
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 等
*.createdorder.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);
    }
}

注意事项

  1. Tracing 插件将日志写入磁盘文件,需定期清理或配置日志轮转
  2. 过滤模式应尽可能精确,避免记录无用消息浪费磁盘
  3. ack=true 表示 Broker 自动确认追踪队列的消息,不需要消费者手动 ACK
  4. 追踪规则按 vhost 隔离,不同 vhost 需分别配置
  5. 生产环境建议配置日志文件大小上限和自动删除策略

要点总结

  • Tracing 插件支持按 vhost、Exchange、路由键等维度按需过滤追踪消息
  • 通过 HTTP API 或管理界面创建追踪规则,配置 pattern 进行 topic 模式匹配
  • 日志默认写入磁盘文件,需定期清理避免磁盘耗尽
  • 相比 Firehose 更适合生产环境长期开启的问题溯源
  • 过滤规则应精确匹配目标消息范围,降低无效日志量

📝 发现内容有误?点击此处直接编辑

← 上一篇 Prometheus 集成
下一篇 → 日志分析与解读
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库