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

如何通过代码生成Micrometer Tracer的TraceId并验证链路传递

解决TraceId在集成测试中传递为空的问题

你当前的代码问题在于:仅创建了TraceContext并设置为Span的父级,但没有将这个Span绑定为当前线程的活跃上下文,导致后续代码(包括Feign调用)无法识别该Trace上下文,甚至Span自身的traceId也未正确关联。

正确实现方式:绑定Span到线程作用域

使用Tracer的withSpanInScope方法,将启动后的Span绑定到当前线程上下文,确保后续组件能读取到TraceId。修改后的代码如下:

@Autowired
Tracer tracer;

@Test
void shouldUseCreatedSpanTraceId() {
    TraceContext context = tracer.traceContextBuilder()
        .traceId("4bf92f3577b34da6a3ce929d0e0e4736")
        .spanId("00f067aa0ba902b7")
        .sampled(false)
        .build();

    Span span = tracer.spanBuilder().setParent(context).start();
    // 用try-with-resources自动管理作用域,避免线程上下文污染
    try (Tracer.SpanInScope scope = tracer.withSpanInScope(span)) {
        assertThat(span.context().traceId()).isEqualTo("4bf92f3577b34da6a3ce929d0e0e4736");
        feignClient.create(testRequest());
    } finally {
        span.end();
    }
}

关键说明

  • try-with-resources语法会在代码块结束后自动关闭SpanInScope,恢复线程原有上下文,不会影响其他测试用例。
  • 无论是Spring Cloud Sleuth还是OpenTelemetry(从代码风格判断更偏向后者),都需要将Span纳入当前线程的作用域,才能让Feign、RestTemplate等组件感知并传递TraceId。

替代方案:直接绑定OpenTelemetry Context

如果使用OpenTelemetry,也可以通过Context类手动将TraceContext绑定到线程:

import io.opentelemetry.context.Context;

@Autowired
Tracer tracer;

@Test
void shouldUseCreatedSpanTraceId() {
    TraceContext context = tracer.traceContextBuilder()
        .traceId("4bf92f3577b34da6a3ce929d0e0e4736")
        .spanId("00f067aa0ba902b7")
        .sampled(false)
        .build();

    Context otelContext = Context.root().with(context);
    try (Scope scope = otelContext.makeCurrent()) {
        Span span = tracer.spanBuilder("test-integration-span").setParent(otelContext).start();
        try (Tracer.SpanInScope spanScope = tracer.withSpanInScope(span)) {
            assertThat(span.context().traceId()).isNotBlank();
            feignClient.create(testRequest());
        } finally {
            span.end();
        }
    }
}

核心逻辑

无论采用哪种方式,核心都是让你创建的Trace上下文成为当前线程的活跃上下文,这样下游组件才能从线程上下文中读取TraceId完成传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:13:26