You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JaegerUI无法展示OpenTelemetry的嵌套请求追踪层级问题

OpenTelemetry RabbitMQ追踪Jaeger层级丢失的解决办法

先从这几个核心点排查

1. 确认Trace上下文传递没毛病

OpenTelemetry靠TraceParent和TraceState这俩头在RabbitMQ消息里传递追踪信息,得检查生产者和消费者两边的配置:

  • 生产者:必须使用OpenTelemetry.Instrumentation.RabbitMQ包,发消息时要自动把追踪头注入消息属性。看看代码里是否正确启用了RabbitMQ instrumentation:
services.AddOpenTelemetry()
  .WithTracing(tracerProviderBuilder =>
    tracerProviderBuilder
      .AddRabbitMQInstrumentation(options =>
      {
        options.IncludeInternalQueues = false;
        options.TracePublish = true;
        options.TraceReceive = true;
      })
      .AddJaegerExporter());
  • 消费者:别手动创建根Span,得让instrumentation自动从消息属性里提取父上下文生成子Span,手动建根Span会直接打断层级:
// 错误示范:手动创建根Span会搞乱层级
using var rootSpan = TracerProvider.Default.GetTracer("MyTracer").StartActiveSpan("ConsumerRoot");
// 正确操作:让instrumentation自动处理,只写业务逻辑即可
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
  // 直接编写消息处理逻辑
};

2. 手动创建Span时必须绑定父上下文

如果非得手动创建Span,一定要关联上父上下文,否则会变成独立的根Span:

// 从消息头提取父上下文
if (ea.BasicProperties.Headers.TryGetValue("traceparent", out var traceParentBytes))
{
  var traceParent = Encoding.UTF8.GetString((byte[])traceParentBytes);
  if (TraceParent.TryParse(traceParent, out var parentContext))
  {
    using var childSpan = TracerProvider.Default.GetTracer("MyTracer")
      .StartActiveSpan("ProcessMessage", parentContext);
    // 消息处理逻辑写在这里
  }
}

3. 统一所有OpenTelemetry包版本

版本不兼容很容易引发问题,把OpenTelemetry、OpenTelemetry.Instrumentation.RabbitMQ、OpenTelemetry.Exporter.Jaeger这些包的版本统一成一致的,同时删掉所有旧的OpenTracing相关依赖,避免两者冲突。

4. 检查JaegerExporter配置

确保Jaeger exporter的配置能完整传递Span层级信息:

tracerProviderBuilder.AddJaegerExporter(options =>
{
  options.AgentHost = "localhost";
  options.AgentPort = 6831;
  options.ExportProcessorType = ExportProcessorType.Batch;
});

验证步骤

  1. 开启OpenTelemetry调试日志,查看Span创建和上下文传递的细节:
services.AddLogging(logging =>
{
  logging.AddConsole();
  logging.SetMinimumLevel(LogLevel.Debug);
});

搜索日志中的Span started、Context extracted关键字,确认子Span的父ID是否和生产者的Span ID匹配。
2. 登录RabbitMQ管理后台查看消息属性,确认traceparent和tracestate这两个头存在且格式正确。

内容的提问来源于stack exchange,提问作者Silvair L. Soares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:32:25