From d7b5b5aafe7e154a890d07e6195873cd1645bd83 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 15 Feb 2021 14:27:38 +0100 Subject: [PATCH] WIP --- spring-cloud-sleuth-autoconfigure/pom.xml | 5 - .../wavefront/WavefrontProperties.java | 3 +- .../WavefrontSleuthAutoConfiguration.java | 29 +-- .../wavefront/WavefrontSleuthSpanHandler.java | 4 +- .../wavefront/WavefrontTracingCustomizer.java | 42 ++++ .../WavefrontAutoConfigurationTests.java | 199 ++++-------------- .../WavefrontTracingIntegrationTests.java | 23 ++ 7 files changed, 120 insertions(+), 185 deletions(-) create mode 100644 spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingCustomizer.java diff --git a/spring-cloud-sleuth-autoconfigure/pom.xml b/spring-cloud-sleuth-autoconfigure/pom.xml index df682a6d9..459ccfc41 100644 --- a/spring-cloud-sleuth-autoconfigure/pom.xml +++ b/spring-cloud-sleuth-autoconfigure/pom.xml @@ -371,11 +371,6 @@ wavefront-opentracing-sdk-java true - - com.wavefront - wavefront-spring-boot - true - com.wavefront wavefront-runtime-sdk-jvm diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontProperties.java index 7351e8cd4..fb2aa9533 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontProperties.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontProperties.java @@ -25,8 +25,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * Advanced configuration properties for Wavefront. * * @author Stephane Nicoll + * @since 3.0.2 */ -@ConfigurationProperties("wavefront.tracing") +@ConfigurationProperties("spring.sleuth.wavefront") public class WavefrontProperties { /** diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthAutoConfiguration.java index 137dd8659..160eba985 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthAutoConfiguration.java @@ -21,8 +21,6 @@ import brave.TracingCustomizer; import brave.handler.SpanHandler; import com.wavefront.sdk.common.WavefrontSender; import com.wavefront.sdk.common.application.ApplicationTags; -import com.wavefront.spring.autoconfigure.WavefrontAutoConfiguration; -import com.wavefront.spring.autoconfigure.WavefrontTracerBla; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.wavefront.WavefrontConfig; @@ -34,7 +32,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.sleuth.SpanNamer; import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -47,24 +44,25 @@ import org.springframework.context.annotation.Configuration; * @since 3.1.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ SpanNamer.class, MeterRegistry.class, WavefrontConfig.class, WavefrontSender.class }) -@ConditionalOnBean(WavefrontSender.class) -@AutoConfigureBefore({ BraveAutoConfiguration.class, WavefrontAutoConfiguration.class }) +@ConditionalOnClass({ MeterRegistry.class, WavefrontConfig.class, WavefrontSender.class }) +@ConditionalOnBean({ WavefrontSender.class, ApplicationTags.class }) @AutoConfigureAfter(WavefrontMetricsExportAutoConfiguration.class) +@AutoConfigureBefore(BraveAutoConfiguration.class) @EnableConfigurationProperties(WavefrontProperties.class) -@ConditionalOnProperty(value = "wavefront.tracing.enabled", matchIfMissing = true) +@ConditionalOnProperty(value = { "spring.sleuth.enabled", "spring.sleuth.wavefront.enabled" }, matchIfMissing = true) public class WavefrontSleuthAutoConfiguration { static final String BEAN_NAME = "wavefrontTracingCustomizer"; @Bean - @ConditionalOnBean({ MeterRegistry.class, WavefrontConfig.class, WavefrontSender.class }) + @ConditionalOnBean({ MeterRegistry.class, WavefrontConfig.class, WavefrontSender.class, ApplicationTags.class }) WavefrontSleuthSpanHandler wavefrontSleuthSpanHandler(MeterRegistry meterRegistry, WavefrontSender wavefrontSender, ApplicationTags applicationTags, WavefrontConfig wavefrontConfig, WavefrontProperties wavefrontProperties) { return new WavefrontSleuthSpanHandler( // https://github.com/wavefrontHQ/wavefront-opentracing-sdk-java/blob/f1f08d8daf7b692b9b61dcd5bc24ca6befa8e710/src/main/java/com/wavefront/opentracing/reporting/WavefrontSpanReporter.java#L54 50000, // TODO: maxQueueSize should be a property, ya? - wavefrontSender, meterRegistry, wavefrontConfig.source(), applicationTags, wavefrontProperties); + wavefrontSender, meterRegistry, wavefrontConfig.source(), applicationTags, + wavefrontProperties.getRedMetricsCustomTagKeys()); } @Configuration(proxyBeanMethods = false) @@ -72,17 +70,10 @@ public class WavefrontSleuthAutoConfiguration { static class BraveCustomizerConfiguration { @Bean(BEAN_NAME) - @ConditionalOnMissingBean(name = BEAN_NAME) + @ConditionalOnMissingBean(WavefrontTracingCustomizer.class) @ConditionalOnBean({ MeterRegistry.class, WavefrontConfig.class, WavefrontSender.class }) - TracingCustomizer wavefrontTracingCustomizer(WavefrontSleuthSpanHandler spanHandler) { - return t -> t.traceId128Bit(true).supportsJoin(false) - .addSpanHandler(new WavefrontSleuthBraveSpanHandler(spanHandler)); - } - - @Bean - WavefrontTracerBla wavefrontTracerBla() { - return new WavefrontTracerBla() { - }; + WavefrontTracingCustomizer wavefrontTracingCustomizer(WavefrontSleuthSpanHandler spanHandler) { + return new WavefrontTracingCustomizer(spanHandler); } } diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthSpanHandler.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthSpanHandler.java index da70a69aa..8e211ac67 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthSpanHandler.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontSleuthSpanHandler.java @@ -147,7 +147,7 @@ public final class WavefrontSleuthSpanHandler implements Runnable, Closeable { final ApplicationTags applicationTags; WavefrontSleuthSpanHandler(int maxQueueSize, WavefrontSender wavefrontSender, MeterRegistry meterRegistry, - String source, ApplicationTags applicationTags, WavefrontProperties wavefrontProperties) { + String source, ApplicationTags applicationTags, Set redMetricsCustomTagKeys) { this.wavefrontSender = wavefrontSender; this.applicationTags = applicationTags; this.discoveredHeartbeatMetrics = Sets.newConcurrentHashSet(); @@ -165,7 +165,7 @@ public final class WavefrontSleuthSpanHandler implements Runnable, Closeable { } }, 1, 60, TimeUnit.SECONDS); - this.traceDerivedCustomTagKeys = new HashSet<>(wavefrontProperties.getRedMetricsCustomTagKeys()); + this.traceDerivedCustomTagKeys = new HashSet<>(redMetricsCustomTagKeys); // Start the reporter wfInternalReporter = new WavefrontInternalReporter.Builder().prefixedWith(TRACING_DERIVED_PREFIX) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingCustomizer.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingCustomizer.java new file mode 100644 index 000000000..7370df342 --- /dev/null +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2013-2020 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.cloud.sleuth.autoconfig.wavefront; + +import brave.Tracing; +import brave.TracingCustomizer; + +/** + * {@link TracingCustomizer} for Wavefront. + * + * @author Marcin Grzejszczak + * @since 3.0.2 + */ +public class WavefrontTracingCustomizer implements TracingCustomizer { + + private final WavefrontSleuthSpanHandler spanHandler; + + public WavefrontTracingCustomizer(WavefrontSleuthSpanHandler spanHandler) { + this.spanHandler = spanHandler; + } + + @Override + public void customize(Tracing.Builder builder) { + builder.traceId128Bit(true).supportsJoin(false) + .addSpanHandler(new WavefrontSleuthBraveSpanHandler(spanHandler)); + } + +} diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontAutoConfigurationTests.java index d814913ca..d9598f342 100644 --- a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontAutoConfigurationTests.java +++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontAutoConfigurationTests.java @@ -21,14 +21,10 @@ import java.util.function.Function; import java.util.function.Supplier; import brave.Tracer; -import brave.TracingCustomizer; import brave.handler.SpanHandler; -import com.wavefront.sdk.appagent.jvm.reporter.WavefrontJvmReporter; import com.wavefront.sdk.common.Pair; import com.wavefront.sdk.common.WavefrontSender; import com.wavefront.sdk.common.application.ApplicationTags; -import com.wavefront.spring.autoconfigure.ApplicationTagsBuilderCustomizer; -import com.wavefront.spring.autoconfigure.WavefrontAutoConfiguration; import io.micrometer.core.instrument.MeterRegistry; import org.junit.jupiter.api.Test; @@ -37,27 +33,31 @@ import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfigu import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront.WavefrontMetricsExportAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.AbstractApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; /** - * Tests for {@link WavefrontAutoConfiguration}. + * Tests for {@link WavefrontSleuthAutoConfiguration}. * * @author Stephane Nicoll * @author Tommy Ludwig */ class WavefrontAutoConfigurationTests { - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration( - AutoConfigurations.of(WavefrontAutoConfiguration.class, WavefrontSleuthAutoConfiguration.class)); + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(WavefrontSleuthAutoConfiguration.class)) + .withUserConfiguration(Config.class); @Test void applicationTagsIsConfiguredFromPropertiesWhenNoneExists() { @@ -74,66 +74,6 @@ class WavefrontAutoConfigurationTests { }); } - @Test - void applicationTagsCanBeCustomized() { - this.contextRunner - .withPropertyValues("wavefront.application.name=test-app", "wavefront.application.service=test-service") - .withBean(ApplicationTagsBuilderCustomizer.class, - () -> (builder) -> builder.cluster("test-cluster").shard("test-shard")) - .run((context) -> { - assertThat(context).hasSingleBean(ApplicationTags.class); - ApplicationTags tags = context.getBean(ApplicationTags.class); - assertThat(tags.getApplication()).isEqualTo("test-app"); - assertThat(tags.getService()).isEqualTo("test-service"); - assertThat(tags.getCluster()).isEqualTo("test-cluster"); - assertThat(tags.getShard()).isEqualTo("test-shard"); - assertThat(tags.getCustomTags()).isEmpty(); - }); - } - - @Test - void applicationTagsIsReusedWhenCustomInstanceExists() { - this.contextRunner - .withPropertyValues("wavefront.application.name=test-app", "wavefront.application.service=test-service") - .withBean(ApplicationTags.class, - () -> new ApplicationTags.Builder("another-app", "another-service").build()) - .run((context) -> { - assertThat(context).hasSingleBean(ApplicationTags.class); - ApplicationTags tags = context.getBean(ApplicationTags.class); - assertThat(tags.getApplication()).isEqualTo("another-app"); - assertThat(tags.getService()).isEqualTo("another-service"); - assertThat(tags.getCluster()).isNull(); - assertThat(tags.getShard()).isNull(); - assertThat(tags.getCustomTags()).isEmpty(); - }); - } - - @Test - void applicationTagsAreExportedToWavefrontRegistry() { - this.contextRunner - .withPropertyValues("wavefront.application.name=test-app", "wavefront.application.service=test-service") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))).run((context) -> { - MeterRegistry registry = context.getBean(MeterRegistry.class); - registry.counter("my.counter", "env", "qa"); - assertThat(registry.find("my.counter").tags("env", "qa").tags("application", "test-app") - .tags("service", "test-service").counter()).isNotNull(); - }); - } - - @Test - void applicationTagsWithFullInformationAreExportedToWavefrontRegistry() { - this.contextRunner - .withPropertyValues("wavefront.application.name=test-app", "wavefront.application.service=test-service", - "wavefront.application.cluster=test-cluster", "wavefront.application.shard=test-shard") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))).run((context) -> { - MeterRegistry registry = context.getBean(MeterRegistry.class); - registry.counter("my.counter", "env", "qa"); - assertThat(registry.find("my.counter").tags("env", "qa").tags("application", "test-app") - .tags("service", "test-service").tags("cluster", "test-cluster").tags("shard", "test-shard") - .counter()).isNotNull(); - }); - } - @Test void applicationTagsAreNotExportedToNonWavefrontRegistry() { this.contextRunner @@ -149,49 +89,6 @@ class WavefrontAutoConfigurationTests { }); } - @Test - void jvmReporterIsConfiguredWhenNoneExists() { - this.contextRunner.with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .run((context) -> assertThat(context).hasSingleBean(WavefrontJvmReporter.class)); - } - - @Test - void jvmReporterCanBeDisabled() { - this.contextRunner.withPropertyValues("wavefront.metrics.extract-jvm-metrics=false") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .run(context -> assertThat(context).doesNotHaveBean(WavefrontJvmReporter.class)); - } - - @Test - void jvmReporterCanBeCustomized() { - WavefrontJvmReporter reporter = mock(WavefrontJvmReporter.class); - this.contextRunner.with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .withBean(WavefrontJvmReporter.class, () -> reporter) - .run((context) -> assertThat(context).getBean(WavefrontJvmReporter.class).isEqualTo(reporter)); - } - - @Test - void jvmReporterNotConfiguredWithoutWavefrontSender() { - this.contextRunner.with(metrics()) - .run(context -> assertThat(context).doesNotHaveBean(WavefrontJvmReporter.class)); - } - - @Test - void tracingWithSleuthIsConfiguredWithWavefrontSender() { - WavefrontSender sender = mock(WavefrontSender.class); - this.contextRunner.withPropertyValues().with(wavefrontMetrics(() -> sender)).with(sleuth()).run((context) -> { - assertThat(context).hasSingleBean(TracingCustomizer.class); - WavefrontSleuthBraveSpanHandler braveSpanHandler = extractSpanHandler(context.getBean(Tracer.class)); - assertThat(braveSpanHandler.spanHandler).hasFieldOrPropertyWithValue("wavefrontSender", sender); - }); - } - - @Test - void tracingWithSleuthWithEmptyEnvironmentUseDefaultTags() { - this.contextRunner.with(wavefrontMetrics(() -> mock(WavefrontSender.class))).with(sleuth()) - .run(assertSleuthSpanDefaultTags("unnamed_application", "unnamed_service")); - } - @Test void tracingWithSleuthWithWavefrontTagsAndSpringApplicationNameUseWavefrontTags() { this.contextRunner @@ -201,38 +98,6 @@ class WavefrontAutoConfigurationTests { .run(assertSleuthSpanDefaultTags("wavefront-application", "wavefront-service")); } - @Test - void tracingWithSleuthWithSpringApplicationNameUseItRatherThanDefault() { - this.contextRunner.withPropertyValues("spring.application.name=spring-service") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))).with(sleuth()) - .run(assertSleuthSpanDefaultTags("unnamed_application", "spring-service")); - } - - @Test - void tracingWithSleuthWithCustomApplicationTagsUseThat() { - this.contextRunner - .withPropertyValues("wavefront.application.name=wavefront-application", - "wavefront.application.service=wavefront-service") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .withBean(ApplicationTags.class, - () -> new ApplicationTags.Builder("custom-application", "custom-service") - .cluster("custom-cluster").shard("custom-shard").build()) - .with(sleuth()).run(assertSleuthSpanDefaultTags("custom-application", "custom-service", - "custom-cluster", "custom-shard")); - } - - @Test - void tracingWithSleuthWithCustomApplicationTagsAndEmptyValuesFallbackToDefaults() { - this.contextRunner - .withPropertyValues("wavefront.application.name=wavefront-application", - "wavefront.application.service=wavefront-service") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .withBean(ApplicationTags.class, - () -> new ApplicationTags.Builder("custom-application", "custom-service").build()) - .with(sleuth()) - .run(assertSleuthSpanDefaultTags("custom-application", "custom-service", "none", "none")); - } - private ContextConsumer assertSleuthSpanDefaultTags(String applicationName, String serviceName) { return assertSleuthSpanDefaultTags(applicationName, serviceName, "none", "none"); @@ -241,7 +106,7 @@ class WavefrontAutoConfigurationTests { private ContextConsumer assertSleuthSpanDefaultTags(String applicationName, String serviceName, String cluster, String shard) { return (context) -> { - assertThat(context).hasSingleBean(TracingCustomizer.class); + assertThat(context).hasSingleBean(WavefrontTracingCustomizer.class); WavefrontSleuthBraveSpanHandler braveSpanHandler = extractSpanHandler(context.getBean(Tracer.class)); assertThat(braveSpanHandler.spanHandler.getDefaultTags()).contains( new Pair<>("application", applicationName), new Pair<>("service", serviceName), @@ -254,9 +119,9 @@ class WavefrontAutoConfigurationTests { void tracingWithSleuthCanBeConfigured() { WavefrontSender sender = mock(WavefrontSender.class); this.contextRunner.withPropertyValues() - .withPropertyValues("wavefront.tracing.red-metrics-custom-tag-keys=region,test") + .withPropertyValues("spring.sleuth.wavefront.red-metrics-custom-tag-keys=region,test") .with(wavefrontMetrics(() -> sender)).with(sleuth()).run((context) -> { - assertThat(context).hasSingleBean(TracingCustomizer.class); + assertThat(context).hasSingleBean(WavefrontTracingCustomizer.class); WavefrontSleuthBraveSpanHandler braveSpanHandler = extractSpanHandler( context.getBean(Tracer.class)); WavefrontSleuthSpanHandler spanHandler = braveSpanHandler.spanHandler; @@ -269,23 +134,16 @@ class WavefrontAutoConfigurationTests { @Test void tracingWithOpenTracingBacksOffWhenSpringCloudSleuthIsAvailable() { this.contextRunner.with(wavefrontMetrics(() -> mock(WavefrontSender.class))) - .run((context) -> assertThat(context).hasSingleBean(TracingCustomizer.class) + .run((context) -> assertThat(context).hasSingleBean(WavefrontTracingCustomizer.class) .doesNotHaveBean(io.opentracing.Tracer.class)); } - @Test - void tracingIsDisabledWhenOpenTracingAndSleuthAreNotAvailable() { - new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(WavefrontAutoConfiguration.class)) - .withClassLoader(new FilteredClassLoader("org.springframework.cloud.sleuth", "io.opentracing")) - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))).run((context) -> assertThat(context) - .doesNotHaveBean(TracingCustomizer.class).doesNotHaveBean(io.opentracing.Tracer.class)); - } - @Test void tracingCanBeDisabled() { - this.contextRunner.withPropertyValues("wavefront.tracing.enabled=false") - .with(wavefrontMetrics(() -> mock(WavefrontSender.class))).run((context) -> assertThat(context) - .doesNotHaveBean(TracingCustomizer.class).doesNotHaveBean(io.opentracing.Tracer.class)); + this.contextRunner.withPropertyValues("spring.sleuth.wavefront.enabled=false") + .with(wavefrontMetrics(() -> mock(WavefrontSender.class))) + .run((context) -> assertThat(context).doesNotHaveBean(WavefrontTracingCustomizer.class) + .doesNotHaveBean(io.opentracing.Tracer.class)); } @Test @@ -321,4 +179,29 @@ class WavefrontAutoConfigurationTests { return (runner) -> (T) runner.withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class)); } + @Configuration + static class Config { + + @Bean + ApplicationTags applicationTags(Environment environment) { + return createFromProperties(environment); + } + + public ApplicationTags createFromProperties(Environment environment) { + String application = environment.getProperty("wavefront.application.name"); + String service = environment.getProperty("wavefront.application.service"); + service = (StringUtils.hasText(application)) ? service : defaultServiceName(environment); + ApplicationTags.Builder builder = new ApplicationTags.Builder(application, service); + builder.cluster(environment.getProperty("wavefront.application.cluster")); + builder.shard(environment.getProperty("wavefront.application.shard")); + return builder.build(); + } + + private String defaultServiceName(Environment environment) { + String applicationName = environment.getProperty("spring.application.name"); + return (StringUtils.hasText(applicationName)) ? applicationName : "unnamed_service"; + } + + } + } diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingIntegrationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingIntegrationTests.java index 9f575bf99..532db3908 100644 --- a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingIntegrationTests.java +++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/wavefront/WavefrontTracingIntegrationTests.java @@ -30,6 +30,7 @@ import brave.opentracing.BraveTracer; import brave.sampler.Sampler; import com.wavefront.sdk.common.Pair; import com.wavefront.sdk.common.WavefrontSender; +import com.wavefront.sdk.common.application.ApplicationTags; import com.wavefront.sdk.entities.histograms.HistogramGranularity; import com.wavefront.sdk.entities.tracing.SpanLog; import io.opentracing.Tracer; @@ -45,11 +46,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -277,6 +280,26 @@ public class WavefrontTracingIntegrationTests { }; } + @Bean + ApplicationTags applicationTags(Environment environment) { + return createFromProperties(environment); + } + + public ApplicationTags createFromProperties(Environment environment) { + String application = environment.getProperty("wavefront.application.name"); + String service = environment.getProperty("wavefront.application.service"); + service = (StringUtils.hasText(service)) ? service : defaultServiceName(environment); + ApplicationTags.Builder builder = new ApplicationTags.Builder(application, service); + builder.cluster(environment.getProperty("wavefront.application.cluster")); + builder.shard(environment.getProperty("wavefront.application.shard")); + return builder.build(); + } + + private String defaultServiceName(Environment environment) { + String applicationName = environment.getProperty("spring.application.name"); + return (StringUtils.hasText(applicationName)) ? applicationName : "unnamed_service"; + } + } @Controller