From 8721c0e64feb557ff4ae958f6315d72ad6e58d81 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 23 Mar 2023 23:17:58 -0700 Subject: [PATCH] Add ConnectionDetail support to Zipkin auto-configuration Update Zipkin auto-configuration so that `ZipkinConnectionDetails` beans may be optionally used to provide connection details. See gh-34657 Co-Authored-By: Mortitz Halbritter Co-Authored-By: Phillip Webb --- .../PropertiesZipkinConnectionDetails.java | 39 +++++++++++++++++++ .../tracing/zipkin/ZipkinConfigurations.java | 21 +++++++--- .../zipkin/ZipkinConnectionDetails.java | 35 +++++++++++++++++ 3 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/PropertiesZipkinConnectionDetails.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConnectionDetails.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/PropertiesZipkinConnectionDetails.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/PropertiesZipkinConnectionDetails.java new file mode 100644 index 0000000000..3997844031 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/PropertiesZipkinConnectionDetails.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.tracing.zipkin; + +/** + * Adapts {@link ZipkinProperties} to {@link ZipkinConnectionDetails}. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + */ +class PropertiesZipkinConnectionDetails implements ZipkinConnectionDetails { + + private final ZipkinProperties properties; + + PropertiesZipkinConnectionDetails(ZipkinProperties properties) { + this.properties = properties; + } + + @Override + public String getSpanEndpoint() { + return this.properties.getEndpoint(); + } + +} 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 f61d4ce2d9..2a58cef528 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 @@ -59,11 +59,14 @@ class ZipkinConfigurations { @Bean @ConditionalOnMissingBean(Sender.class) - URLConnectionSender urlConnectionSender(ZipkinProperties properties) { + URLConnectionSender urlConnectionSender(ZipkinProperties properties, + ObjectProvider connectionDetailsProvider) { + ZipkinConnectionDetails connectionDetails = connectionDetailsProvider + .getIfAvailable(() -> new PropertiesZipkinConnectionDetails(properties)); URLConnectionSender.Builder builder = URLConnectionSender.newBuilder(); builder.connectTimeout((int) properties.getConnectTimeout().toMillis()); builder.readTimeout((int) properties.getReadTimeout().toMillis()); - builder.endpoint(properties.getEndpoint()); + builder.endpoint(connectionDetails.getSpanEndpoint()); return builder.build(); } @@ -77,12 +80,15 @@ class ZipkinConfigurations { @Bean @ConditionalOnMissingBean(Sender.class) ZipkinRestTemplateSender restTemplateSender(ZipkinProperties properties, - ObjectProvider customizers) { + ObjectProvider customizers, + ObjectProvider connectionDetailsProvider) { + ZipkinConnectionDetails connectionDetails = connectionDetailsProvider + .getIfAvailable(() -> new PropertiesZipkinConnectionDetails(properties)); RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder() .setConnectTimeout(properties.getConnectTimeout()) .setReadTimeout(properties.getReadTimeout()); restTemplateBuilder = applyCustomizers(restTemplateBuilder, customizers); - return new ZipkinRestTemplateSender(properties.getEndpoint(), restTemplateBuilder.build()); + return new ZipkinRestTemplateSender(connectionDetails.getSpanEndpoint(), restTemplateBuilder.build()); } private RestTemplateBuilder applyCustomizers(RestTemplateBuilder restTemplateBuilder, @@ -106,10 +112,13 @@ class ZipkinConfigurations { @Bean @ConditionalOnMissingBean(Sender.class) ZipkinWebClientSender webClientSender(ZipkinProperties properties, - ObjectProvider customizers) { + ObjectProvider customizers, + ObjectProvider connectionDetailsProvider) { + ZipkinConnectionDetails connectionDetails = connectionDetailsProvider + .getIfAvailable(() -> new PropertiesZipkinConnectionDetails(properties)); WebClient.Builder builder = WebClient.builder(); customizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); - return new ZipkinWebClientSender(properties.getEndpoint(), builder.build()); + return new ZipkinWebClientSender(connectionDetails.getSpanEndpoint(), builder.build()); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConnectionDetails.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConnectionDetails.java new file mode 100644 index 0000000000..f5cc8ce43c --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinConnectionDetails.java @@ -0,0 +1,35 @@ +/* + * Copyright 2012-2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.tracing.zipkin; + +import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; + +/** + * Details required to establish a connection to a Zipkin server. + * + * @author Moritz Halbritter + * @since 3.1.0 + */ +public interface ZipkinConnectionDetails extends ConnectionDetails { + + /** + * The endpoint for the span reporting. + * @return the endpoint + */ + String getSpanEndpoint(); + +}