diff --git a/spring-cloud-sleuth-core/pom.xml b/spring-cloud-sleuth-core/pom.xml
index 5227c9203..a89083377 100644
--- a/spring-cloud-sleuth-core/pom.xml
+++ b/spring-cloud-sleuth-core/pom.xml
@@ -24,6 +24,9 @@
jar
Spring Cloud Sleuth Core
Spring Cloud Sleuth Core
+
+ 2.2.0.RELEASE
+
org.springframework.cloud
@@ -131,7 +134,7 @@
org.springframework.security.oauth
spring-security-oauth2
- 2.2.0.RELEASE
+ ${spring-security-oauth2.version}
true
@@ -286,20 +289,28 @@
brave-instrumentation-grpc
true
+
+ io.zipkin.reporter2
+ zipkin-reporter-metrics-micrometer
+
+
+ io.micrometer
+ micrometer-core
+
+
+
io.lettuce
lettuce-core
true
-
org.springframework.boot
spring-boot-starter-quartz
true
-
org.springframework.boot
spring-boot-autoconfigure-processor
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
index 094a29164..9bd7a0b10 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
@@ -34,15 +34,20 @@ import brave.propagation.ExtraFieldPropagation;
import brave.propagation.Propagation;
import brave.propagation.ThreadLocalCurrentTraceContext;
import brave.sampler.Sampler;
+import io.micrometer.core.instrument.MeterRegistry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import zipkin2.Span;
import zipkin2.reporter.InMemoryReporterMetrics;
import zipkin2.reporter.Reporter;
import zipkin2.reporter.ReporterMetrics;
+import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.sleuth.DefaultSpanNamer;
@@ -198,12 +203,6 @@ public class TraceAutoConfiguration {
return ThreadLocalCurrentTraceContext.newBuilder();
}
- @Bean
- @ConditionalOnMissingBean
- ReporterMetrics sleuthReporterMetrics() {
- return new InMemoryReporterMetrics();
- }
-
@Bean
@ConditionalOnMissingBean
Reporter noOpSpanReporter() {
@@ -283,4 +282,40 @@ public class TraceAutoConfiguration {
}
+ @Configuration
+ @ConditionalOnMissingClass("io.micrometer.core.instrument.MeterRegistry")
+ static class TraceMetricsNoOpConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ ReporterMetrics sleuthReporterMetrics() {
+ return new InMemoryReporterMetrics();
+ }
+
+ }
+
+ @Configuration
+ @ConditionalOnClass(MeterRegistry.class)
+ static class TraceMetricsMicrometerConfiguration {
+
+ @Configuration
+ @ConditionalOnMissingBean(ReporterMetrics.class)
+ static class NoReporterMetricsConfiguration {
+
+ @Bean
+ @ConditionalOnBean(MeterRegistry.class)
+ ReporterMetrics sleuthMicrometerReporterMetrics(MeterRegistry meterRegistry) {
+ return MicrometerReporterMetrics.create(meterRegistry);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean(MeterRegistry.class)
+ ReporterMetrics sleuthReporterMetrics() {
+ return new InMemoryReporterMetrics();
+ }
+
+ }
+
+ }
+
}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java
new file mode 100644
index 000000000..d96e722e0
--- /dev/null
+++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2013-2019 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;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import org.assertj.core.api.BDDAssertions;
+import org.junit.Test;
+import zipkin2.reporter.InMemoryReporterMetrics;
+import zipkin2.reporter.ReporterMetrics;
+import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics;
+
+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;
+
+public class TraceAutoConfigurationTests {
+
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class));
+
+ @Test
+ public void should_apply_micrometer_reporter_metrics_when_meter_registry_bean_present() {
+ this.contextRunner.withUserConfiguration(WithMeterRegistry.class)
+ .run((context) -> {
+ ReporterMetrics bean = context.getBean(ReporterMetrics.class);
+
+ BDDAssertions.then(bean)
+ .isInstanceOf(MicrometerReporterMetrics.class);
+ });
+ }
+
+ @Test
+ public void should_apply_in_memory_metrics_when_meter_registry_bean_missing() {
+ this.contextRunner.run((context) -> {
+ ReporterMetrics bean = context.getBean(ReporterMetrics.class);
+
+ BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class);
+ });
+ }
+
+ @Test
+ public void should_apply_in_memory_metrics_when_meter_registry_class_missing() {
+ this.contextRunner.withClassLoader(new FilteredClassLoader(MeterRegistry.class))
+ .run((context) -> {
+ ReporterMetrics bean = context.getBean(ReporterMetrics.class);
+
+ BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class);
+ });
+ }
+
+ @Configuration
+ static class WithMeterRegistry {
+
+ @Bean
+ MeterRegistry meterRegistry() {
+ return new SimpleMeterRegistry();
+ }
+
+ }
+
+}