Spring Boot3迁移Micrometer后,WebTestClient测试TraceId传播失败
迁移至Spring Boot 3并从Sleuth切换到Micrometer后,WebTestClient无法测试TraceId传播
将项目迁移到Spring Boot 3,同时把Sleuth替换成Micrometer后,我没法再用WebTestClient结合Tracer来测试TraceId的传播了。
我写了一个简单的@RestController,期望TraceId能通过Tracer传播:
@RestController class MyTraceIdController(@Autowired private val tracer: Tracer) { @GetMapping("/trace") fun info(): ResponseEntity<String> { val traceKey = "x-b3-traceid" // 运行时能通过tracer拿到traceId,但测试时拿不到 val responseHeaders = HttpHeaders() responseHeaders.set(traceKey, tracer.currentSpan()?.context()?.traceId().toString()) return ResponseEntity .ok() .headers(responseHeaders) .body("OK") } }
我的目标是用WebTestClient对这个接口进行测试:
@AutoConfigureWebTestClient @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) class MyTraceIdTests(@Autowired private val webTestClient: WebTestClient) { @Test fun `Assert info endpoint works as expected with webTestClient`() { val traceKey = "x-b3-traceid" val traceValue = "463ac35c9f6413ad48485a3953bb6124" val spanKey = "x-b3-spanid" val spanValue = "a2fb4a1d1a96d312" webTestClient.get() .uri("http://localhost:9080/trace") .header(traceKey, traceValue) .header(spanKey, spanValue) .exchange() .expectStatus().isOk .expectHeader().valueEquals(traceKey, traceValue) .expectBody<String>().isEqualTo("OK") } }
之前用Sleuth的时候,测试中注入的BraveTracer能完美实现TraceId传播,但切换到Micrometer后,无法注入可正常工作的Tracer。
我观察到两种不同的行为:
- 运行时:执行bootRun后用curl调用端点,通过BraveAutoconfiguration注入的BraveTracer工作正常 => 符合预期
- 测试时:无法注入正确的BraveTracer Bean => TraceId始终为空
我尝试了多种方法但均未成功:
- 使用
SimpleTracer() - 按照Micrometer文档实现自定义Tracer Bean
- 在测试中引入BraveAutoconfiguration或手动实例化相关Bean
这些方法都无法生成可传播TraceId的Bean。我希望能找到一种简单的方式注入BraveAutoconfiguration提供的可用Bean,请问我遗漏了什么?是否需要调整测试方式?
内容的提问来源于stack exchange,提问作者Benoît Voglevette
相关产品推荐
相关产品推荐

