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

OpenTelemetry与Spring Cloud Sleuth集成后Header传递异常问题

解决方案

针对你遇到的两个问题,需要调整Spring Cloud Sleuth OTel的传播配置和头映射规则,具体如下:

1. 核心配置调整

更新你的application.yml配置,添加传播格式和自定义Trace ID头映射:

spring:
  application:
    name: spring-cloud-sleuth-otel-slf4j
  sleuth:
    otel:
      config:
        trace-id-ratio-based: 1.0
      exporter:
        otlp:
          endpoint: http://otel-collector:4317
      # 配置自定义traceId头作为链路Trace ID的来源
      propagation:
        headers:
          trace-id: traceId
    # 配置B3传播为分离头模式(传递X-B3-TraceId等独立头,而非单一b3头)
    propagation:
      type: B3_MULTI
    baggage:
      remoteFields: requestId,serviceName,traceId
      correlationFields: requestId,serviceName,traceId
      tagFields: requestId,serviceName,traceId

2. 配置说明

  • spring.sleuth.propagation.type: B3_MULTI:强制Sleuth使用分离式B3头格式(X-B3-TraceId、X-B3-SpanId、X-B3-Sampled)进行跨服务传播,解决App1调用App2时只传b3头的问题,确保下游收到X-B3-TraceId。
  • spring.sleuth.otel.propagation.headers.trace-id: traceId:让OTel识别自定义的traceId请求头作为链路的Trace ID,这样App1收到该头时会直接复用,而非生成新ID。
  • 保留baggage配置:确保traceId、requestId等字段作为 baggage 在服务间传递,下游服务能获取到这些自定义头。

3. 场景验证

  • 携带X-B3-TraceId调用App1:App1复用该ID,调用App2时会传递X-B3-TraceId等分离头,App2自动识别并复用同一Trace ID。
  • 携带traceId调用App1:App1复用该ID作为链路Trace ID,同时通过baggage将traceId头传递到App2(若App2配置了相同的trace-id映射,也会复用该ID)。

补充注意事项

如果你的RestTemplate是手动创建的实例,需要确保它被Sleuth的拦截器增强——可以添加@LoadBalanced注解,或者手动注入TraceRestTemplateInterceptor到RestTemplate实例中,否则跨服务调用时不会自动传递追踪头。

内容的提问来源于stack exchange,提问作者Sumit Desai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:50:29