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
相关产品推荐
相关产品推荐

