当前位置: 首页 > 知识库问答 >
问题:

侦查行李在联调局不起作用

袁耀
2023-03-14

请提示我如何让侦察行李在联调系统中工作。它在测试通过模拟HTTP请求时按预期工作,但在测试直接调用服务时不工作。我的应用程序是(Spring Boot 2.5.4,Spring Cloud 2020.0.3):

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    BaggageField myBaggageField() {
        return BaggageField.create("my-field-name");
    }

    @RestController
    static class MyController {

        @AutowiredMyService myService;

        @GetMapping
        String callService() {
            return myService.updateAndGet();
        }
    }

    @Service
    static class MyService {

        @Autowired BaggageField baggageField;

        public String updateAndGet() {
            baggageField.updateValue("value");
            return baggageField.getValue();
        }
    }
}

应用yml:spring。侦探。行李远程字段:我的字段名

测试:

@SpringBootTest
@AutoConfigureMockMvc
class MyApplicationTests {

    @Autowired
    MyService myService;

    @Autowired
    MockMvc mockMvc;

    @Test
    void testBaggageByService() {
        assertThat(myService.updateAndGet()).isEqualTo("value");         // FAILS
    }

    @Test
    void testBaggageByController() throws Exception {
        mockMvc.perform(get("/")).andExpect(content().string("value"));  // PASS
    }
}

共有3个答案

梁丘佑运
2023-03-14

如果出于任何原因,启动一个span应该在许多测试中重用,那就是我的JUnit 5扩展:

public class SleuthExtension implements BeforeEachCallback, AfterEachCallback {

    private static final Namespace SPAN_STORE_KEY = Namespace.create(SleuthExtension.class.getName());
    private static final String SPAN_KEY = "test span";

    @Override
    public void beforeEach(ExtensionContext context) {
        Tracer tracer = SpringExtension.getApplicationContext(context)
            .getBean(Tracer.class);
        ScopedSpan span = tracer.startScopedSpan("span for " + context.getDisplayName());

        context.getStore(SPAN_STORE_KEY)
            .put(SPAN_KEY, span);
    }

    @Override
    public void afterEach(ExtensionContext context) {
        context.getStore(SPAN_STORE_KEY)
            .remove(SPAN_KEY, ScopedSpan.class)
            .end();
    }

}
燕宜修
2023-03-14

这是意料之中的,因为您只是调用控制器的方法。Sleuth仪表基本上是一个Servlet过滤器,在第一次测试中没有调用,但在第二次测试中使用,因为它模拟接收真实的请求(而且,它也不是真正的联调)。

您可以手动创建跨度,并设置行李以模拟您跳过的行为。

汤昊
2023-03-14

请阅读文档关于冲洗和更新选项在勇敢-https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/project-features.html#features-baggage

设置此选项,然后重试

// configuration
@Bean
BaggageField countryCodeField() {
    return BaggageField.create("my-field-name");
}

@Bean
ScopeDecorator mdcScopeDecorator() {
    return MDCScopeDecorator.newBuilder()
            .clear()
            .add(SingleCorrelationField.newBuilder(countryCodeField())
                    .flushOnUpdate()
                    .build())
            .build();
}

编辑:

在你的评论中,你说:

好吧,Sleuth instrumentation是一个Servlet过滤器,但是另外还有很多其他的instrumentation,例如message listener、quartz scheduler等。我只是想也应该有用于集成测试的instrumentation

没有这样的集成,我看不出有任何意义。你必须自己启动一个跨度,在测试中手动启动,并将其放入范围内。你可以在这里找到一个例子https://github.com/spring-cloud/spring-cloud-sleuth/blob/v3.0.3/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java#L55-L71

@Autowired
Tracer tracer;

@Autowired
CircuitBreakerFactory factory;

@Test
public void should_pass_tracing_information_when_using_circuit_breaker() {
    // given
    Tracer tracer = this.tracer;
    ScopedSpan scopedSpan = null;
    try {
        scopedSpan = tracer.startScopedSpan("start");
        // when
        Span span = this.factory.create("name").run(tracer::currentSpan);

        BDDAssertions.then(span).isNotNull();
        BDDAssertions.then(scopedSpan.context().traceId()).isEqualTo(span.context().traceId());
    }
    finally {
        scopedSpan.end();
    }
}
 类似资料:
  • 问题内容: 我有两个表:和。 我想基于item_number从两个表中检索数据,并且在以下查询中工作正常。(使用内联接) 但是我也希望’items’表中的所有行,即使在opensalesorder和items中找不到与ItemName匹配的内容。 但是使用下面的查询似乎对我不起作用。 即使在左侧找不到匹配项,右联接也会从右表返回结果。 查询正确吗? 谢谢 问题答案: 这是您的查询: 该条件是“撤销

  • 我第一次使用侦探需要一些帮助。我目前正在使用sleuth 2.2.3。释放我的要求是我想传播两个字段product id和product type,这样我就可以从其他微服务中读取这两个值,因为我正在使用baggage传播。

  • 问题内容: 我有一个问题: 虽然我从另一个带有ajax的页面调用内联脚本(也使用jQuery),但似乎不再定义jQuery(?),并且我无法使用任何jQuery函数,应该使用(根据内联脚本)。 它基本上是新闻列表,其中包含指向特定新闻项目的链接。我现在更喜欢使用内联脚本,因为在其他地方不需要此功能。 如您所见,我只是在调用另一个页面的一部分并将其内容附加到页面上。 当我加载整个页面(不是页面的一部

  • 我试图建立一个应用程序,它有一个角前端和一个Maven/Spring Boot后端,并建立了我的第一个REST控制器。我的问题是,当我从Angular IDE向后端发送GET HTTP请求时,它会返回一个错误,说明: 我的角代码只是试图使用GET方法(即。httpclient.GET('http://localhost:8080/api/getdata')将数据打印到浏览器控制台,但错误阻止了它的

  • 我有这样的布局: 我试图将其用于我的索引页面,如下所示: 但它就是不起作用,引导和css文件没有被索引页使用,页脚和页眉也没有。我使用thymeleaf布局方言2.2.2我缺少什么?

  • 问题内容: 我正在尝试占用和div未使用的任何空间。为此,我将flex显示设置为列方向。然后,我将属性设置为1。似乎没有做任何事情。 注意:不确定这是否重要,但是我正在进行一些嵌套的flex显示。 HTML CSS 问题答案: 您代码中的所有内容都可以正常工作。 唯一的问题是 您的flex容器没有指定的高度 。因此,高度解析为,表示内容的高度。 该属性在容器中分配 可用 空间。容器中没有可用空间,