From 94b17ecd269bf58e978948197e9a6b266051f649 Mon Sep 17 00:00:00 2001 From: Johnny Goncalves Date: Wed, 24 May 2023 14:32:12 +0200 Subject: [PATCH 1/2] Allow custom ExemplarSampler to be used See gh-35619 --- ...metheusMetricsExportAutoConfiguration.java | 2 +- ...usMetricsExportAutoConfigurationTests.java | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.java index 0d5e074c385..2b0751b980f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.java @@ -90,7 +90,7 @@ public class PrometheusMetricsExportAutoConfiguration { } @Bean - @ConditionalOnMissingBean + @ConditionalOnMissingBean(ExemplarSampler.class) @ConditionalOnBean(SpanContextSupplier.class) public DefaultExemplarSampler exemplarSampler(SpanContextSupplier spanContextSupplier) { return new DefaultExemplarSampler(spanContextSupplier); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java index 74bc1ef458d..95cedf909ac 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java @@ -20,6 +20,8 @@ import io.micrometer.core.instrument.Clock; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.CollectorRegistry; +import io.prometheus.client.exemplars.DefaultExemplarSampler; +import io.prometheus.client.exemplars.Exemplar; import io.prometheus.client.exemplars.ExemplarSampler; import io.prometheus.client.exemplars.tracer.common.SpanContextSupplier; import io.prometheus.client.exporter.BasicAuthHttpConnectionFactory; @@ -64,6 +66,12 @@ class PrometheusMetricsExportAutoConfigurationTests { this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(PrometheusMeterRegistry.class)); } + @Test + void backsOfWhenExemplarSamplerIsPresent() { + this.contextRunner.withUserConfiguration(CustomExemplarSamplerConfiguration.class) + .run((context) -> assertThat(context).doesNotHaveBean(DefaultExemplarSampler.class)); + } + @Test void autoConfiguresItsConfigCollectorRegistryAndMeterRegistry() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) @@ -119,7 +127,7 @@ class PrometheusMetricsExportAutoConfigurationTests { @Test void autoConfiguresExemplarSamplerIfSpanContextSupplierIsPresent() { - this.contextRunner.withUserConfiguration(ExemplarsConfiguration.class) + this.contextRunner.withUserConfiguration(DefaultExemplarSamplerConfiguration.class) .run((context) -> assertThat(context).hasSingleBean(SpanContextSupplier.class) .hasSingleBean(ExemplarSampler.class) .hasSingleBean(PrometheusMeterRegistry.class)); @@ -287,7 +295,7 @@ class PrometheusMetricsExportAutoConfigurationTests { @Configuration(proxyBeanMethods = false) @Import(BaseConfiguration.class) - static class ExemplarsConfiguration { + static class DefaultExemplarSamplerConfiguration { @Bean SpanContextSupplier spanContextSupplier() { @@ -313,4 +321,26 @@ class PrometheusMetricsExportAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + @Import(BaseConfiguration.class) + static class CustomExemplarSamplerConfiguration { + + @Bean + ExemplarSampler exemplarSampler() { + return new ExemplarSampler() { + + @Override + public Exemplar sample(double value, double bucketFrom, double bucketTo, Exemplar previous) { + return null; + } + + @Override + public Exemplar sample(double increment, Exemplar previous) { + return null; + } + }; + } + + } + } From 750096b9c209b885c4077eb58bc09a04218e6306 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 17 Jul 2023 15:44:23 +0200 Subject: [PATCH 2/2] Polish "Allow custom ExemplarSampler to be used" See gh-35619 --- ...usMetricsExportAutoConfigurationTests.java | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java index 95cedf909ac..585455b2257 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java @@ -20,8 +20,6 @@ import io.micrometer.core.instrument.Clock; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.CollectorRegistry; -import io.prometheus.client.exemplars.DefaultExemplarSampler; -import io.prometheus.client.exemplars.Exemplar; import io.prometheus.client.exemplars.ExemplarSampler; import io.prometheus.client.exemplars.tracer.common.SpanContextSupplier; import io.prometheus.client.exporter.BasicAuthHttpConnectionFactory; @@ -47,6 +45,7 @@ import org.springframework.context.annotation.Import; import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; /** * Tests for {@link PrometheusMetricsExportAutoConfiguration}. @@ -66,12 +65,6 @@ class PrometheusMetricsExportAutoConfigurationTests { this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(PrometheusMeterRegistry.class)); } - @Test - void backsOfWhenExemplarSamplerIsPresent() { - this.contextRunner.withUserConfiguration(CustomExemplarSamplerConfiguration.class) - .run((context) -> assertThat(context).doesNotHaveBean(DefaultExemplarSampler.class)); - } - @Test void autoConfiguresItsConfigCollectorRegistryAndMeterRegistry() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) @@ -127,12 +120,21 @@ class PrometheusMetricsExportAutoConfigurationTests { @Test void autoConfiguresExemplarSamplerIfSpanContextSupplierIsPresent() { - this.contextRunner.withUserConfiguration(DefaultExemplarSamplerConfiguration.class) + this.contextRunner.withUserConfiguration(ExemplarsConfiguration.class) .run((context) -> assertThat(context).hasSingleBean(SpanContextSupplier.class) .hasSingleBean(ExemplarSampler.class) .hasSingleBean(PrometheusMeterRegistry.class)); } + @Test + void allowsCustomExemplarSamplerToBeUsed() { + this.contextRunner.withUserConfiguration(ExemplarsConfiguration.class) + .withBean("customExemplarSampler", ExemplarSampler.class, () -> mock(ExemplarSampler.class)) + .run((context) -> assertThat(context).hasSingleBean(ExemplarSampler.class) + .getBean(ExemplarSampler.class) + .isSameAs(context.getBean("customExemplarSampler"))); + } + @Test void exemplarSamplerIsNotAutoConfiguredIfSpanContextSupplierIsMissing() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) @@ -295,7 +297,7 @@ class PrometheusMetricsExportAutoConfigurationTests { @Configuration(proxyBeanMethods = false) @Import(BaseConfiguration.class) - static class DefaultExemplarSamplerConfiguration { + static class ExemplarsConfiguration { @Bean SpanContextSupplier spanContextSupplier() { @@ -321,26 +323,4 @@ class PrometheusMetricsExportAutoConfigurationTests { } - @Configuration(proxyBeanMethods = false) - @Import(BaseConfiguration.class) - static class CustomExemplarSamplerConfiguration { - - @Bean - ExemplarSampler exemplarSampler() { - return new ExemplarSampler() { - - @Override - public Exemplar sample(double value, double bucketFrom, double bucketTo, Exemplar previous) { - return null; - } - - @Override - public Exemplar sample(double increment, Exemplar previous) { - return null; - } - }; - } - - } - }