From dd02c9db603bb23880da6b466dea363b35f8066b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 13 Jul 2022 08:38:48 +0200 Subject: [PATCH] Makes Zipkin ReporterMetrics lazy; fixes gh-2185 --- .../zipkin2/ZipkinAutoConfiguration.java | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java index 95f056925..fa8e70f73 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java @@ -36,6 +36,7 @@ import zipkin2.reporter.ReporterMetrics; import zipkin2.reporter.Sender; import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -255,8 +256,8 @@ public class ZipkinAutoConfiguration { @Bean @ConditionalOnBean(MeterRegistry.class) @ConditionalOnClass(name = "zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics") - ReporterMetrics sleuthMicrometerReporterMetrics(MeterRegistry meterRegistry) { - return MicrometerReporterMetrics.create(meterRegistry); + ReporterMetrics sleuthMicrometerReporterMetrics(ObjectProvider meterRegistry) { + return new LazyMicrometerReporterMetrics(meterRegistry); } @Bean @@ -265,6 +266,65 @@ public class ZipkinAutoConfiguration { return new InMemoryReporterMetrics(); } + static class LazyMicrometerReporterMetrics implements ReporterMetrics { + + private final ObjectProvider objectProvider; + + private ReporterMetrics micrometerReporterMetrics; + + LazyMicrometerReporterMetrics(ObjectProvider objectProvider) { + this.objectProvider = objectProvider; + } + + private ReporterMetrics reporterMetrics() { + if (this.micrometerReporterMetrics == null) { + this.micrometerReporterMetrics = MicrometerReporterMetrics.create(objectProvider.getObject()); + } + return this.micrometerReporterMetrics; + } + + @Override + public void incrementMessages() { + reporterMetrics().incrementMessages(); + } + + @Override + public void incrementMessagesDropped(Throwable throwable) { + reporterMetrics().incrementMessagesDropped(throwable); + } + + @Override + public void incrementSpans(int i) { + reporterMetrics().incrementSpans(i); + } + + @Override + public void incrementSpanBytes(int i) { + reporterMetrics().incrementSpanBytes(i); + } + + @Override + public void incrementMessageBytes(int i) { + reporterMetrics().incrementMessageBytes(i); + } + + @Override + public void incrementSpansDropped(int i) { + reporterMetrics().incrementSpansDropped(i); + } + + @Override + public void updateQueuedSpans(int i) { + reporterMetrics().updateQueuedSpans(i); + } + + @Override + public void updateQueuedBytes(int i) { + reporterMetrics().updateQueuedBytes(i); + } + + } + } }