gpt4 book ai didi

spring-boot - 使用 SpringBootTest 时如何在 Controller 中使用 span 初始化默认跟踪上下文

转载 作者:行者123 更新时间:2023-12-03 16:48:42 28 4
gpt4 key购买 nike

我正在从 Spring Boot 1.5.21 迁移到 2.2.5,并且在此过程中也从 spring-boot-cloud 版本 Edgware.SR6 迁移到 Hoxton.SR3。这一举动迫使我放弃了侦探自己实现的跟踪器/跨度模型,并接受了勇敢的新模型。但是,我的 Controller 集成测试有问题。

我有一个名为 Edge 的微服务有一个名为 EdgeApplication 的主类我使用 Spock 作为测试框架。
我的代码包括以下测试类:

@ContextConfiguration(classes = EdgeApplication.class)
@SpringBootTest(classes = EdgeApplication.class)
@ActiveProfiles(profiles = ["test"])
@AutoConfigureMockMvc
class VerificationCodeControllerSpecIT extends Specification {

@Autowired
MockMvc mockMvc

def setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
}

def "Generate change password verification code"() {
// Some code calling a PrincipalController via mockMvc.perform()
}
}

以前,在 Spring Boot 1.5.21 中,当调用到达 PrincipalController 时, 一个默认的带有 span 的跟踪上下文被初始化。现在,在 Spring Boot 2 中,情况并非如此。我必须强调, PrincipalController 中缺乏上下文。仅发生在测试代码中,而不发生在微服务的实际运行中。

为什么这种行为改变了,我怎样才能恢复旧的行为,即在调用 Controller 时有一个带有 span 的默认跟踪上下文?

我添加了一个演示项目:
Demo
您将能够运行集成测试并在调试中看到 Controller tracer.currentSpan()为空(同时包含正常项目运行的值)

最佳答案

在 Spring Boot 1.5.21,spring-cloud-sleuth 的最新支持版本是 1.3.6.RELEASE。

在旧版本中,Sleuth 曾经有过interceptor: 'TraceHandlerInterceptor' 来在Servlet 调度器触发这个拦截器时创建一个span。

在版本 1.5.21 上运行 Spring Boot 测试时,触发上述拦截器的 MockMvc init TestDispatcherServlet。

作为与 Brave 对齐的 HTTP 检测的一部分,此拦截器已被删除。

使用 MockMvc 时,有必要显式配置您的过滤器链。
你的 MockMvc 缺少 TracingFilter

关于spring-boot - 使用 SpringBootTest 时如何在 Controller 中使用 span 初始化默认跟踪上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com