From 4f47bce169b25ab1be7f2f23ec5fe7a4b6c88c9a Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 9 Feb 2024 14:19:52 +0100 Subject: [PATCH] Fixed Zipkin with WebFlux to use filter function; related to gh-2339 --- .../zipkin2/ZipkinHttpSenderConfiguration.java | 16 +++++++++------- ...pkinHttpSenderConfigurationReactiveTests.java | 3 ++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfiguration.java index 7c1d8405e..b5350c56d 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.cloud.sleuth.autoconfig.zipkin2; -import java.net.URI; - import zipkin2.reporter.Sender; import org.springframework.beans.factory.annotation.Autowired; @@ -30,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancedExchangeFilterFunction; import org.springframework.cloud.sleuth.zipkin2.CachingZipkinUrlExtractor; import org.springframework.cloud.sleuth.zipkin2.LoadBalancerClientZipkinLoadBalancer; import org.springframework.cloud.sleuth.zipkin2.RestTemplateSender; @@ -45,6 +44,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.Nullable; import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.function.client.WebClient; @@ -84,17 +84,19 @@ ZipkinUrlExtractor defaultZipkinUrlExtractor(final ZipkinLoadBalancer zipkinLoad static class ZipkinReactiveConfiguration { @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) - Sender webClientSender(ZipkinProperties zipkin, ZipkinWebClientBuilderProvider zipkinWebClientBuilderProvider, - ZipkinUrlExtractor zipkinUrlExtractor) { + Sender webClientSender(ZipkinProperties zipkin, ZipkinWebClientBuilderProvider zipkinWebClientBuilderProvider) { WebClient.Builder webClientBuilder = zipkinWebClientBuilderProvider.zipkinWebClientBuilder(); - URI uri = zipkinUrlExtractor.zipkinUrl(zipkin); - return new WebClientSender(webClientBuilder.build(), uri.toString(), zipkin.getApiPath(), + return new WebClientSender(webClientBuilder.build(), zipkin.getBaseUrl(), zipkin.getApiPath(), zipkin.getEncoder(), zipkin.getCheckTimeout()); } @Bean @ConditionalOnMissingBean - ZipkinWebClientBuilderProvider defaultZipkinWebClientProvider() { + ZipkinWebClientBuilderProvider defaultZipkinWebClientProvider( + final @Nullable LoadBalancedExchangeFilterFunction filterFunction) { + if (filterFunction != null) { + return () -> WebClient.builder().filter(filterFunction); + } return WebClient::builder; } diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfigurationReactiveTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfigurationReactiveTests.java index 3f973deac..cfe2963f9 100644 --- a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfigurationReactiveTests.java +++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinHttpSenderConfigurationReactiveTests.java @@ -49,7 +49,8 @@ void should_work_when_using_web_client_without_the_web_environment() { springApplication.setWebApplicationType(WebApplicationType.REACTIVE); try (ConfigurableApplicationContext context = springApplication.run("--spring.sleuth.noop.enabled=true", - "--server.port=0", "--spring.zipkin.base-url=http://cloudUrl")) { + "--server.port=0", "--spring.zipkin.base-url=http://cloudUrl", + "--spring.cloud.discovery.client.simple.instances.cloudUrl[0].uri=http://localhost:9411")) { then(context.getBean(Sender.class)).isInstanceOf(WebClientSender.class); } }