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

如何在Micrometer-Tracing(OpenTelemetry桥)中设置自定义Trace ID

基于OpenTelemetry桥实现自定义Trace ID的Span创建与激活

我需要创建并激活一个使用指定Trace ID的Span,而非自动生成的ID,具体场景:

  • 基于OpenTelemetry桥进行链路追踪
  • Trace ID通过自定义遗留Header传递(非标准traceparent Header)
  • 保留traceparent Header的正常功能,仅当该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代码后,正确的实现步骤如下:

  1. 实现自定义TextMapPropagator
    逻辑:若请求中存在traceparent Header,则委托给W3CTraceContextPropagator处理;若traceparent为空,则提取自定义遗留Header中的Trace ID构建上下文。

  2. 注册条件化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);
    }
    
  3. 启用自定义配置
    在Spring应用配置文件中添加配置,启用自定义Propagator:

    management.tracing.propagation.type=my-custom-w3c-extension
    

补充方案

也可以不依赖委托逻辑,直接通过TextMapPropagator.composite将自定义Propagator和标准W3C Propagator组合为一个Bean。但这种方式无法保证两者的执行顺序,需根据业务场景评估是否适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:27:53