From 336fdff9df482055fa709ce53b5daa6c6f198650 Mon Sep 17 00:00:00 2001 From: Vanio Begic Date: Sun, 2 Mar 2025 17:53:57 +0100 Subject: [PATCH 1/2] Remove support for URLConnectionSender See gh-44500 Signed-off-by: Vanio Begic --- .../build.gradle | 1 - .../tracing/zipkin/ZipkinConfigurations.java | 28 +--------------- ...pkinAutoConfigurationIntegrationTests.java | 12 +++---- ...onfigurationsSenderConfigurationTests.java | 32 ++++++++----------- 4 files changed, 18 insertions(+), 55 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle index da516dcb0af..0b30ced72d3 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 bd72ccba904..9a95365b6f2 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.HttpEndpointSuppliers; 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 @@ import org.springframework.context.annotation.Import; class ZipkinConfigurations { @Configuration(proxyBeanMethods = false) - @Import({ HttpClientSenderConfiguration.class, UrlConnectionSenderConfiguration.class }) + @Import({ HttpClientSenderConfiguration.class }) static class SenderConfiguration { } @@ -82,31 +81,6 @@ class ZipkinConfigurations { } - @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 b47588d2d3d..249252b828b 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.actuate.autoconfigure.tracing.MicrometerTracingA 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 @@ class ZipkinAutoConfigurationIntegrationTests { , 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 a5ef79a853f..d0e1f4811b8 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 @@ -21,10 +21,8 @@ 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.HttpClientSenderConfiguration; 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; @@ -44,26 +42,23 @@ import static org.mockito.Mockito.mock; 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() { 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); - }); + void shouldNotProvideHttpClientSenderIfHttpClientIsNotAvailable() { + this.contextRunner.withUserConfiguration(HttpClientSenderConfiguration.class) + .withClassLoader(new FilteredClassLoader(HttpClient.class)) + .run((context) -> { + assertThat(context).doesNotHaveBean(ZipkinHttpClientSender.class); + }); } @Test @@ -77,12 +72,11 @@ class ZipkinConfigurationsSenderConfigurationTests { @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); - }); + .run((context) -> { + ZipkinHttpClientSender httpClientSender = context.getBean(ZipkinHttpClientSender.class); + assertThat(httpClientSender).extracting("endpointSupplier") + .isInstanceOf(CustomHttpEndpointSupplier.class); + }); } @Configuration(proxyBeanMethods = false) From ea87b9114dabcf980322b9e5abef258befc658bb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 6 Mar 2025 09:04:53 +0100 Subject: [PATCH 2/2] Polish "Remove support for URLConnectionSender" See gh-44500 --- .../zipkin/ZipkinAutoConfigurationTests.java | 4 +-- ...onfigurationsSenderConfigurationTests.java | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationTests.java index 3a5323cef72..b568900accc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,7 +73,7 @@ class ZipkinAutoConfigurationTests { @Test void shouldWorkWithoutSenders() { this.contextRunner - .withClassLoader(new FilteredClassLoader("zipkin2.reporter.urlconnection", "org.springframework.web.client", + .withClassLoader(new FilteredClassLoader("org.springframework.web.client", "org.springframework.web.reactive.function.client")) .run((context) -> assertThat(context).hasNotFailed()); } 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 d0e1f4811b8..4767ecc2091 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 @@ -21,6 +21,7 @@ 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; @@ -38,11 +39,10 @@ import static org.mockito.Mockito.mock; * @author Moritz Halbritter * @author Wick Dynex */ -@SuppressWarnings({ "deprecation", "removal" }) 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() { @@ -55,10 +55,8 @@ class ZipkinConfigurationsSenderConfigurationTests { @Test void shouldNotProvideHttpClientSenderIfHttpClientIsNotAvailable() { this.contextRunner.withUserConfiguration(HttpClientSenderConfiguration.class) - .withClassLoader(new FilteredClassLoader(HttpClient.class)) - .run((context) -> { - assertThat(context).doesNotHaveBean(ZipkinHttpClientSender.class); - }); + .withClassLoader(new FilteredClassLoader(HttpClient.class)) + .run((context) -> assertThat(context).doesNotHaveBean(ZipkinHttpClientSender.class)); } @Test @@ -72,15 +70,15 @@ class ZipkinConfigurationsSenderConfigurationTests { @Test void shouldUseCustomHttpEndpointSupplierFactory() { this.contextRunner.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class) - .run((context) -> { - ZipkinHttpClientSender httpClientSender = context.getBean(ZipkinHttpClientSender.class); - assertThat(httpClientSender).extracting("endpointSupplier") - .isInstanceOf(CustomHttpEndpointSupplier.class); - }); + .run((context) -> { + ZipkinHttpClientSender httpClientSender = context.getBean(ZipkinHttpClientSender.class); + assertThat(httpClientSender).extracting("endpointSupplier") + .isInstanceOf(CustomHttpEndpointSupplier.class); + }); } @Configuration(proxyBeanMethods = false) - private static final class CustomConfiguration { + static class CustomConfiguration { @Bean BytesMessageSender customSender() { @@ -90,7 +88,7 @@ class ZipkinConfigurationsSenderConfigurationTests { } @Configuration(proxyBeanMethods = false) - private static final class CustomHttpEndpointSupplierFactoryConfiguration { + static class CustomHttpEndpointSupplierFactoryConfiguration { @Bean HttpEndpointSupplier.Factory httpEndpointSupplier() { @@ -99,7 +97,7 @@ class ZipkinConfigurationsSenderConfigurationTests { } - private static final class CustomHttpEndpointSupplierFactory implements HttpEndpointSupplier.Factory { + static class CustomHttpEndpointSupplierFactory implements HttpEndpointSupplier.Factory { @Override public HttpEndpointSupplier create(String endpoint) { @@ -108,7 +106,13 @@ class ZipkinConfigurationsSenderConfigurationTests { } - private record CustomHttpEndpointSupplier(String endpoint) implements HttpEndpointSupplier { + static class CustomHttpEndpointSupplier implements HttpEndpointSupplier { + + private final String endpoint; + + CustomHttpEndpointSupplier(String endpoint) { + this.endpoint = endpoint; + } @Override public String get() { @@ -118,6 +122,7 @@ class ZipkinConfigurationsSenderConfigurationTests { @Override public void close() { } + } }