测微计追踪勇敢+休息模板/网络客户端

问题描述 投票:0回答:2

我正在尝试将traceId从一个服务传播到由休息模板/Web客户端调用的另一个服务

我希望 TraceId 会相同,但实际上会生成新的。

服务1:

    @Bean
    public WebClient webClient() {
        return WebClient.create("http://localhost:8080");
    }

简单地拨打服务2:

webClient.get().retrieve().bodyToMono(String.class).block();

我在这两个服务中都有这些依赖项:

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-brave</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

我使用休息模板得到了相同的行为。 根据文档,应该传播

traceparent
标头,但事实并非如此。 我正在使用 Spring Boot 3.0.5

spring-boot micrometer brave micrometer-tracing
2个回答
11
投票

当您从头开始构建 WebClient 时,不会发生自动配置。您应该更改 WebClient bean 方法并注入 WebClient.Builder。

    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder.baseUrl("....").build();
    }

0
投票

尽管例外的解决方案有效,但如果我们也使用发现服务器,我发现会有例外。在这种情况下,您可以执行以下操作:

@Bean
@LoadBalanced
public WebClient.Builder webClient(ObservationRegistry observationRegistry){
        return WebClient.builder().observationRegistry(observationRegistry);
}

然后您可以自动装配构建器而不是 webClient 并在使用时构建它:

@Autowire
WebClient.Builder webClientBuilder;

//usage
String result = webClientBuilder
                .build()
                .get()
                .uri("http://Discovered-service/api/child")
                .retrieve()
                .bodyToMono(String.class)
                .block();
© www.soinside.com 2019 - 2024. All rights reserved.