From a0f39d66feae7b03b5a6266cd37159672ca5fbdf Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 16 Nov 2022 16:49:38 -0800 Subject: [PATCH] Polish 'Align Wavefront application tags support with Spring Boot 2.x' See gh-32844 --- ...vefrontMetricsExportAutoConfiguration.java | 8 ++--- .../WavefrontTracingAutoConfiguration.java | 31 ++++++++++--------- .../wavefront/WavefrontProperties.java | 25 +++------------ ...ntMetricsExportAutoConfigurationTests.java | 11 +++---- 4 files changed, 30 insertions(+), 45 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfiguration.java index 883a80044bfa..4204950b7222 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfiguration.java @@ -77,13 +77,13 @@ public WavefrontMeterRegistry wavefrontMeterRegistry(WavefrontConfig wavefrontCo @Bean @ConditionalOnBean(ApplicationTags.class) - MeterRegistryCustomizer applicationTagsCustomizer(ApplicationTags applicationTags) { - Tags commonTags = Tags.of(applicationTags.toPointTags().entrySet().stream() - .map(WavefrontMetricsExportAutoConfiguration::asTag).toList()); + MeterRegistryCustomizer wavefrontApplicationTagsCustomizer( + ApplicationTags wavefrontApplicationTags) { + Tags commonTags = Tags.of(wavefrontApplicationTags.toPointTags().entrySet().stream().map(this::asTag).toList()); return (registry) -> registry.config().commonTags(commonTags); } - private static Tag asTag(Map.Entry entry) { + private Tag asTag(Map.Entry entry) { return Tag.of(entry.getKey(), entry.getValue()); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/wavefront/WavefrontTracingAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/wavefront/WavefrontTracingAutoConfiguration.java index 8fad8a8fd7bd..a07fb4217d95 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/wavefront/WavefrontTracingAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/wavefront/WavefrontTracingAutoConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.boot.actuate.autoconfigure.tracing.wavefront; import java.util.Collections; +import java.util.function.Supplier; import brave.handler.SpanHandler; import com.wavefront.sdk.common.WavefrontSender; @@ -40,10 +41,12 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; /** * {@link EnableAutoConfiguration Auto-configuration} for Wavefront tracing. @@ -65,7 +68,7 @@ public class WavefrontTracingAutoConfiguration { * "https://docs.wavefront.com/trace_data_details.html#application-tags">Wavefront * Application Tags */ - private static final String DEFAULT_WAVEFRONT_APPLICATION_NAME = "unnamed_application"; + private static final String DEFAULT_APPLICATION_NAME = "unnamed_application"; /** * Default value for the Wavefront Service name if {@code spring.application.name} is @@ -74,28 +77,26 @@ public class WavefrontTracingAutoConfiguration { * "https://docs.wavefront.com/trace_data_details.html#application-tags">Wavefront * Application Tags */ - private static final String DEFAULT_WAVEFRONT_SERVICE_NAME = "unnamed_service"; + private static final String DEFAULT_SERVICE_NAME = "unnamed_service"; @Bean @ConditionalOnMissingBean - public ApplicationTags applicationTags(Environment environment, WavefrontProperties properties) { - String fallbackWavefrontServiceName = environment.getProperty("spring.application.name", - DEFAULT_WAVEFRONT_SERVICE_NAME); + public ApplicationTags wavefrontApplicationTags(Environment environment, WavefrontProperties properties) { Tracing tracing = properties.getTracing(); - String wavefrontServiceName = (tracing.getServiceName() != null) ? tracing.getServiceName() - : fallbackWavefrontServiceName; - String wavefrontApplicationName = (tracing.getApplicationName() != null) ? tracing.getApplicationName() - : DEFAULT_WAVEFRONT_APPLICATION_NAME; + String wavefrontServiceName = getName(tracing.getServiceName(), + () -> environment.getProperty("spring.application.name", DEFAULT_SERVICE_NAME)); + String wavefrontApplicationName = getName(tracing.getApplicationName(), () -> DEFAULT_APPLICATION_NAME); + PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); ApplicationTags.Builder builder = new ApplicationTags.Builder(wavefrontApplicationName, wavefrontServiceName); - if (tracing.getClusterName() != null) { - builder.cluster(tracing.getClusterName()); - } - if (tracing.getShardName() != null) { - builder.shard(tracing.getShardName()); - } + map.from(tracing::getClusterName).to(builder::cluster); + map.from(tracing::getShardName).to(builder::shard); return builder.build(); } + private String getName(String value, Supplier fallback) { + return (StringUtils.hasText(value)) ? value : fallback.get(); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnClass(WavefrontSpanHandler.class) static class WavefrontMicrometer { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontProperties.java index 741a7438f8bc..4d8fac75fa33 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontProperties.java @@ -21,8 +21,6 @@ import java.net.UnknownHostException; import java.time.Duration; -import com.wavefront.sdk.common.application.ApplicationTags; - import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.PushRegistryProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException; @@ -264,37 +262,24 @@ public void setBatchSize(Integer batchSize) { public static class Tracing { /** - * Wavefront Application name used in {@link ApplicationTags}. Defaults to + * Wavefront Application name used in ApplicationTags. Defaults to * 'unnamed_application'. - * @see Wavefront - * Application Tags */ private String applicationName; /** - * Wavefront Service name used in {@link ApplicationTags}, falling back to - * {@code spring.application.name}. If both are unset it defaults to - * 'unnamed_service'. - * @see Wavefront - * Application Tags + * Wavefront Service name used in ApplicationTags, falling back to + * 'spring.application.name'. If both are unset it defaults to 'unnamed_service'. */ private String serviceName; /** - * Optional Wavefront Cluster name used in {@link ApplicationTags}. - * @see Wavefront - * Application Tags + * Optional Wavefront Cluster name used in ApplicationTags. */ private String clusterName; /** - * Optional Wavefront Shard name used in {@link ApplicationTags}. - * @see Wavefront - * Application Tags + * Optional Wavefront Shard name used in ApplicationTags. */ private String shardName; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfigurationTests.java index 449266c3f2c2..28efcc5463ab 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/wavefront/WavefrontMetricsExportAutoConfigurationTests.java @@ -88,13 +88,12 @@ void allowsRegistryToBeCustomized() { @Test void exportsApplicationTagsInWavefrontRegistry() { - ApplicationTags.Builder appTagsBuilder = new ApplicationTags.Builder("super-application", "super-service"); - appTagsBuilder.cluster("super-cluster"); - appTagsBuilder.shard("super-shard"); - appTagsBuilder.customTags(Map.of("custom-key", "custom-val")); - + ApplicationTags.Builder builder = new ApplicationTags.Builder("super-application", "super-service"); + builder.cluster("super-cluster"); + builder.shard("super-shard"); + builder.customTags(Map.of("custom-key", "custom-val")); this.contextRunner.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class)) - .withUserConfiguration(BaseConfiguration.class).withBean(ApplicationTags.class, appTagsBuilder::build) + .withUserConfiguration(BaseConfiguration.class).withBean(ApplicationTags.class, builder::build) .run((context) -> { WavefrontMeterRegistry registry = context.getBean(WavefrontMeterRegistry.class); registry.counter("my.counter", "env", "qa");