如何在Micrometer-Tracing(OpenTelemetry桥)中设置自定义Trace ID
基于OpenTelemetry桥实现自定义Trace ID的Span创建与激活
我需要创建并激活一个使用指定Trace ID的Span,而非自动生成的ID,具体场景:
- 基于OpenTelemetry桥进行链路追踪
- Trace ID通过自定义遗留Header传递(非标准
traceparentHeader) - 保留
traceparentHeader的正常功能,仅当该Header为空时,使用遗留Header提供的Trace ID启动Span
我之前的尝试(无效)
以下代码虽能启动新Span,但Trace ID仍为自动生成:
var traceId = legacyTraceIdHeaderValue.replaceAll("-", ""); LOG.info("legacy traceId: {}", traceId); var contextWithCustomTraceId = tracer.traceContextBuilder() .traceId(traceId) .sampled(true) .build(); var span = this.tracer.spanBuilder().setParent(contextWithCustomTraceId); try (Tracer.SpanInScope ws = tracer.withSpan(span.start())) { // 业务代码示例:Spring Servlet Filter中的chain.doFilter(req, res); LOG.info("Span started"); } finally { span.end(); }
正确实现方案(基于Micrometer-Tracing)
查看Micrometer-Tracing代码后,正确的实现步骤如下:
实现自定义TextMapPropagator
逻辑:若请求中存在traceparentHeader,则委托给W3CTraceContextPropagator处理;若traceparent为空,则提取自定义遗留Header中的Trace ID构建上下文。注册条件化Bean
参考OpenTelemetryAutoConfiguration的实现,将自定义Propagator注册为条件Bean:@Bean @ConditionalOnProperty(prefix = "management.tracing.propagation", name = "type", havingValue = "my-custom-w3c-extension") public TextMapPropagator customW3cExtensionPropagator() { W3CTraceContextPropagator w3cPropagator = W3CTraceContextPropagator.getInstance(); return new CustomTracePropagator(w3cPropagator); }启用自定义配置
在Spring应用配置文件中添加配置,启用自定义Propagator:management.tracing.propagation.type=my-custom-w3c-extension
补充方案
也可以不依赖委托逻辑,直接通过TextMapPropagator.composite将自定义Propagator和标准W3C Propagator组合为一个Bean。但这种方式无法保证两者的执行顺序,需根据业务场景评估是否适用。
内容的提问来源于stack exchange,提问作者mckulpa
相关产品推荐
相关产品推荐

