Sleuth Baggage集成测试直接调用服务不生效问题求助
问题根因
Sleuth 的 Baggage 能力必须依附于*活跃的追踪上下文(Trace/Span)*才能正常工作:
- 通过MockMvc发起HTTP请求时,Sleuth内置的请求过滤器会自动为请求初始化完整的追踪上下文,所以Baggage读写正常
- 直接调用服务层方法时,没有请求链路触发上下文初始化,当前线程不存在活跃Span,BaggageField的读写操作会直接失效
解决方案
只需在直接调用服务层的测试用例中,手动初始化追踪上下文即可,修改测试代码如下:
@SpringBootTest @AutoConfigureMockMvc class MyApplicationTests { @Autowired MyService myService; @Autowired MockMvc mockMvc; // 注入Sleuth的Tracer工具类 @Autowired Tracer tracer; @Test void testBaggageByService() { // 手动创建并启动一个Span,激活当前线程的追踪上下文 try (Tracer.SpanInScope ignored = tracer.nextSpan().start()) { assertThat(myService.updateAndGet()).isEqualTo("value"); // 测试可正常通过 } } @Test void testBaggageByController() throws Exception { mockMvc.perform(get("/")).andExpect(content().string("value")); // 无需修改,原有逻辑保持正常 } }
可选扩展
如果需要模拟上游传递的Baggage初始值,可在激活Span后手动设置初始值即可,示例如下:
@Test void testBaggageWithInitialValue() { try (Tracer.SpanInScope ignored = tracer.nextSpan().start()) { // 模拟上游传递的Baggage值 myBaggageField.updateValue("initial-value"); // 后续调用业务逻辑即可读取到设置的初始值 // ... } }
内容的提问来源于stack exchange,提问作者michaldo
相关产品推荐
相关产品推荐

