From 326a88a8a9a233c93296d07bf4c2b83457b77c80 Mon Sep 17 00:00:00 2001 From: Vanio Begic Date: Sun, 2 Mar 2025 17:53:57 +0100 Subject: [PATCH 1/2] Remove dependency on io.zipkin.reporter2:zipkin-sender-urlconnection by removal of URLConnectionSender usages in codebase Signed-off-by: Vanio Begic --- .../build.gradle | 1 - .../tracing/zipkin/ZipkinConfigurations.java | 28 +---------- ...pkinAutoConfigurationIntegrationTests.java | 12 ++--- ...onfigurationsSenderConfigurationTests.java | 47 ------------------- 4 files changed, 5 insertions(+), 83 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle index da516dcb0af8..0b30ced72d39 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle @@ -58,7 +58,6 @@ dependencies { optional("io.micrometer:micrometer-registry-statsd") optional("io.micrometer:micrometer-registry-wavefront") optional("io.zipkin.reporter2:zipkin-reporter-brave") - optional("io.zipkin.reporter2:zipkin-sender-urlconnection") optional("io.opentelemetry:opentelemetry-exporter-zipkin") optional("io.opentelemetry:opentelemetry-exporter-otlp") optional("io.projectreactor.netty:reactor-netty-http") diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurations.java index bd72ccba9045..9a95365b6f2f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurations.java @@ -32,7 +32,6 @@ import zipkin2.reporter.SpanBytesEncoder; import zipkin2.reporter.brave.AsyncZipkinSpanHandler; import zipkin2.reporter.brave.MutableSpanBytesEncoder; -import zipkin2.reporter.urlconnection.URLConnectionSender; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.tracing.ConditionalOnEnabledTracing; @@ -54,7 +53,7 @@ class ZipkinConfigurations { @Configuration(proxyBeanMethods = false) - @Import({ HttpClientSenderConfiguration.class, UrlConnectionSenderConfiguration.class }) + @Import({ HttpClientSenderConfiguration.class }) static class SenderConfiguration { } @@ -82,31 +81,6 @@ ZipkinHttpClientSender httpClientSender(ZipkinProperties properties, Encoding en } - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(URLConnectionSender.class) - @EnableConfigurationProperties(ZipkinProperties.class) - static class UrlConnectionSenderConfiguration { - - @Bean - @ConditionalOnMissingBean(BytesMessageSender.class) - URLConnectionSender urlConnectionSender(ZipkinProperties properties, Encoding encoding, - ObjectProvider connectionDetailsProvider, - ObjectProvider endpointSupplierFactoryProvider) { - ZipkinConnectionDetails connectionDetails = connectionDetailsProvider - .getIfAvailable(() -> new PropertiesZipkinConnectionDetails(properties)); - HttpEndpointSupplier.Factory endpointSupplierFactory = endpointSupplierFactoryProvider - .getIfAvailable(HttpEndpointSuppliers::constantFactory); - URLConnectionSender.Builder builder = URLConnectionSender.newBuilder(); - builder.connectTimeout((int) properties.getConnectTimeout().toMillis()); - builder.readTimeout((int) properties.getReadTimeout().toMillis()); - builder.endpointSupplierFactory(endpointSupplierFactory); - builder.endpoint(connectionDetails.getSpanEndpoint()); - builder.encoding(encoding); - return builder.build(); - } - - } - @Configuration(proxyBeanMethods = false) @ConditionalOnClass(AsyncZipkinSpanHandler.class) static class BraveConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationIntegrationTests.java index b47588d2d3d8..249252b828bb 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationIntegrationTests.java @@ -17,7 +17,6 @@ package org.springframework.boot.actuate.autoconfigure.tracing.zipkin; import org.junit.jupiter.api.Test; -import zipkin2.reporter.urlconnection.URLConnectionSender; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; @@ -28,7 +27,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; -import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.ApplicationContextAssertProvider; import org.springframework.boot.test.context.runner.AbstractApplicationContextRunner; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; @@ -61,12 +59,10 @@ void zipkinsUseOfWebClientDoesNotCauseACycle() { , C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider> AbstractApplicationContextRunner configure( AbstractApplicationContextRunner runner) { - return runner - .withConfiguration(AutoConfigurations.of(MicrometerTracingAutoConfiguration.class, - ObservationAutoConfiguration.class, BraveAutoConfiguration.class, ZipkinAutoConfiguration.class, - HttpClientObservationsAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class)) - .withClassLoader(new FilteredClassLoader(URLConnectionSender.class)); + return runner.withConfiguration(AutoConfigurations.of(MicrometerTracingAutoConfiguration.class, + ObservationAutoConfiguration.class, BraveAutoConfiguration.class, ZipkinAutoConfiguration.class, + HttpClientObservationsAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class)); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java index a5ef79a853f1..d2b591a5c39c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java @@ -16,17 +16,12 @@ package org.springframework.boot.actuate.autoconfigure.tracing.zipkin; -import java.net.http.HttpClient; - import org.junit.jupiter.api.Test; import zipkin2.reporter.BytesMessageSender; import zipkin2.reporter.HttpEndpointSupplier; -import zipkin2.reporter.urlconnection.URLConnectionSender; import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.SenderConfiguration; -import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.UrlConnectionSenderConfiguration; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -51,21 +46,9 @@ void shouldSupplyDefaultHttpClientSenderBean() { this.contextRunner.run((context) -> { assertThat(context).hasSingleBean(BytesMessageSender.class); assertThat(context).hasSingleBean(ZipkinHttpClientSender.class); - assertThat(context).doesNotHaveBean(URLConnectionSender.class); }); } - @Test - void shouldUseUrlConnectionSenderIfHttpClientIsNotAvailable() { - this.contextRunner.withUserConfiguration(UrlConnectionSenderConfiguration.class) - .withClassLoader(new FilteredClassLoader(HttpClient.class)) - .run((context) -> { - assertThat(context).doesNotHaveBean(ZipkinHttpClientSender.class); - assertThat(context).hasSingleBean(BytesMessageSender.class); - assertThat(context).hasSingleBean(URLConnectionSender.class); - }); - } - @Test void shouldBackOffOnCustomBeans() { this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> { @@ -74,17 +57,6 @@ void shouldBackOffOnCustomBeans() { }); } - @Test - void shouldUseCustomHttpEndpointSupplierFactory() { - this.contextRunner.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class) - .withClassLoader(new FilteredClassLoader(HttpClient.class)) - .run((context) -> { - URLConnectionSender urlConnectionSender = context.getBean(URLConnectionSender.class); - assertThat(urlConnectionSender).extracting("delegate.endpointSupplier") - .isInstanceOf(CustomHttpEndpointSupplier.class); - }); - } - @Configuration(proxyBeanMethods = false) private static final class CustomConfiguration { @@ -95,25 +67,6 @@ BytesMessageSender customSender() { } - @Configuration(proxyBeanMethods = false) - private static final class CustomHttpEndpointSupplierFactoryConfiguration { - - @Bean - HttpEndpointSupplier.Factory httpEndpointSupplier() { - return new CustomHttpEndpointSupplierFactory(); - } - - } - - private static final class CustomHttpEndpointSupplierFactory implements HttpEndpointSupplier.Factory { - - @Override - public HttpEndpointSupplier create(String endpoint) { - return new CustomHttpEndpointSupplier(endpoint); - } - - } - private record CustomHttpEndpointSupplier(String endpoint) implements HttpEndpointSupplier { @Override From 5ccb11d7ace8afb61380bed3f70a53cff56da94d Mon Sep 17 00:00:00 2001 From: Vanio Begic Date: Wed, 5 Mar 2025 21:47:09 +0100 Subject: [PATCH 2/2] Adapt the deleted tests to apply to ZipkinHttpClientSender instead of the originally applied to UrlConnectionSender Signed-off-by: Vanio Begic --- ...onfigurationsSenderConfigurationTests.java | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java index d2b591a5c39c..d0e1f4811b83 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConfigurationsSenderConfigurationTests.java @@ -16,12 +16,15 @@ package org.springframework.boot.actuate.autoconfigure.tracing.zipkin; +import java.net.http.HttpClient; + import org.junit.jupiter.api.Test; import zipkin2.reporter.BytesMessageSender; import zipkin2.reporter.HttpEndpointSupplier; - +import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.HttpClientSenderConfiguration; import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.SenderConfiguration; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -39,7 +42,7 @@ class ZipkinConfigurationsSenderConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(DefaultEncodingConfiguration.class, SenderConfiguration.class)); + .withConfiguration(AutoConfigurations.of(DefaultEncodingConfiguration.class, SenderConfiguration.class)); @Test void shouldSupplyDefaultHttpClientSenderBean() { @@ -49,6 +52,15 @@ void shouldSupplyDefaultHttpClientSenderBean() { }); } + @Test + void shouldNotProvideHttpClientSenderIfHttpClientIsNotAvailable() { + this.contextRunner.withUserConfiguration(HttpClientSenderConfiguration.class) + .withClassLoader(new FilteredClassLoader(HttpClient.class)) + .run((context) -> { + assertThat(context).doesNotHaveBean(ZipkinHttpClientSender.class); + }); + } + @Test void shouldBackOffOnCustomBeans() { this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> { @@ -57,6 +69,16 @@ void shouldBackOffOnCustomBeans() { }); } + @Test + void shouldUseCustomHttpEndpointSupplierFactory() { + this.contextRunner.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class) + .run((context) -> { + ZipkinHttpClientSender httpClientSender = context.getBean(ZipkinHttpClientSender.class); + assertThat(httpClientSender).extracting("endpointSupplier") + .isInstanceOf(CustomHttpEndpointSupplier.class); + }); + } + @Configuration(proxyBeanMethods = false) private static final class CustomConfiguration { @@ -67,6 +89,25 @@ BytesMessageSender customSender() { } + @Configuration(proxyBeanMethods = false) + private static final class CustomHttpEndpointSupplierFactoryConfiguration { + + @Bean + HttpEndpointSupplier.Factory httpEndpointSupplier() { + return new CustomHttpEndpointSupplierFactory(); + } + + } + + private static final class CustomHttpEndpointSupplierFactory implements HttpEndpointSupplier.Factory { + + @Override + public HttpEndpointSupplier create(String endpoint) { + return new CustomHttpEndpointSupplier(endpoint); + } + + } + private record CustomHttpEndpointSupplier(String endpoint) implements HttpEndpointSupplier { @Override