From ce358c601b023d2d991be6c5eb34ca64ccaf345a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 5 Apr 2024 10:36:53 +0200 Subject: [PATCH] Polish "Auto-config support for latest Prometheus client and simpleclient" See gh-40023 --- ...metheusMetricsExportAutoConfiguration.java | 10 ++++----- .../prometheus/PrometheusProperties.java | 21 ++++++++++++------- .../PrometheusPropertiesConfigAdapter.java | 2 +- ...eclientMetricsExportAutoConfiguration.java | 20 +++++++++--------- ...usSimpleclientPropertiesConfigAdapter.java | 4 +--- ...impleclientExemplarsAutoConfiguration.java | 1 + ...pleclientPropertiesConfigAdapterTests.java | 2 +- ...etheusExemplarsAutoConfigurationTests.java | 2 +- .../prometheus/PrometheusScrapeEndpoint.java | 11 +++++----- .../PrometheusSimpleclientScrapeEndpoint.java | 5 ++--- .../export/prometheus/TextOutputFormat.java | 2 +- .../reference/pages/actuator/metrics.adoc | 4 +++- 12 files changed, 45 insertions(+), 39 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 c876428d222..9aba0ae77e6 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 @@ -58,31 +58,31 @@ public class PrometheusMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean - public PrometheusConfig prometheusConfig(PrometheusProperties prometheusProperties) { + PrometheusConfig prometheusConfig(PrometheusProperties prometheusProperties) { return new PrometheusPropertiesConfigAdapter(prometheusProperties); } @Bean @ConditionalOnMissingBean - public PrometheusMeterRegistry prometheusMeterRegistry(PrometheusConfig prometheusConfig, + PrometheusMeterRegistry prometheusMeterRegistry(PrometheusConfig prometheusConfig, PrometheusRegistry prometheusRegistry, Clock clock, ObjectProvider spanContext) { return new PrometheusMeterRegistry(prometheusConfig, prometheusRegistry, clock, spanContext.getIfAvailable()); } @Bean @ConditionalOnMissingBean - public PrometheusRegistry prometheusRegistry() { + PrometheusRegistry prometheusRegistry() { return new PrometheusRegistry(); } @Configuration(proxyBeanMethods = false) @ConditionalOnAvailableEndpoint(endpoint = PrometheusScrapeEndpoint.class) - public static class PrometheusScrapeEndpointConfiguration { + static class PrometheusScrapeEndpointConfiguration { @SuppressWarnings("removal") @Bean @ConditionalOnMissingBean({ PrometheusScrapeEndpoint.class, PrometheusSimpleclientScrapeEndpoint.class }) - public PrometheusScrapeEndpoint prometheusEndpoint(PrometheusRegistry prometheusRegistry) { + PrometheusScrapeEndpoint prometheusEndpoint(PrometheusRegistry prometheusRegistry) { return new PrometheusScrapeEndpoint(prometheusRegistry); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusProperties.java index 1e73c6ab763..ea5991ad4d2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusProperties.java @@ -22,6 +22,7 @@ import java.util.Map; import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; /** * {@link ConfigurationProperties @ConfigurationProperties} for configuring metrics export @@ -54,13 +55,13 @@ public class PrometheusProperties { /** * Histogram type for backing DistributionSummary and Timer. */ - @Deprecated(since = "3.3.0") + @Deprecated(since = "3.3.0", forRemoval = true) private HistogramFlavor histogramFlavor = HistogramFlavor.Prometheus; /** * Additional properties to pass to the Prometheus client. */ - private final Map prometheusProperties = new HashMap<>(); + private final Map properties = new HashMap<>(); /** * Step size (i.e. reporting frequency) to use. @@ -75,6 +76,9 @@ public class PrometheusProperties { this.descriptions = descriptions; } + @Deprecated(since = "3.3.0", forRemoval = true) + @DeprecatedConfigurationProperty(since = "3.3.0", + reason = "No longer supported. Works only when using the Prometheus simpleclient.") public HistogramFlavor getHistogramFlavor() { return this.histogramFlavor; } @@ -103,8 +107,8 @@ public class PrometheusProperties { return this.pushgateway; } - public Map getPrometheusProperties() { - return this.prometheusProperties; + public Map getProperties() { + return this.properties; } /** @@ -218,13 +222,16 @@ public class PrometheusProperties { } + /** + * Prometheus Histogram flavor. + * + * @deprecated since 3.3.0 for removal in 3.5.0 + */ + @Deprecated(since = "3.3.0", forRemoval = true) public enum HistogramFlavor { Prometheus, VictoriaMetrics; - HistogramFlavor() { - } - } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java index e9101485a38..265e5755cce 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java @@ -63,7 +63,7 @@ class PrometheusPropertiesConfigAdapter extends PropertiesConfigAdapter map = prometheusProperties.getPrometheusProperties(); + Map map = prometheusProperties.getProperties(); if (map.isEmpty()) { return null; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientMetricsExportAutoConfiguration.java index 1793369d4bb..371de66e430 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientMetricsExportAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientMetricsExportAutoConfiguration.java @@ -61,9 +61,9 @@ import org.springframework.util.StringUtils; * @author David J. M. Karlsen * @author Jonatan Ivanov * @since 2.0.0 - * @deprecated in favor of {@link PrometheusMetricsExportAutoConfiguration} + * @deprecated since 3.3.0 for removal in 3.5.0 in favor of + * {@link PrometheusMetricsExportAutoConfiguration} */ -@SuppressWarnings("removal") @Deprecated(since = "3.3.0", forRemoval = true) @AutoConfiguration( before = { CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class }, @@ -76,13 +76,13 @@ public class PrometheusSimpleclientMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean - public PrometheusConfig simpleclientPrometheusConfig(PrometheusProperties prometheusProperties) { + PrometheusConfig simpleclientPrometheusConfig(PrometheusProperties prometheusProperties) { return new PrometheusSimpleclientPropertiesConfigAdapter(prometheusProperties); } @Bean @ConditionalOnMissingBean - public io.micrometer.prometheus.PrometheusMeterRegistry simpleclientPrometheusMeterRegistry( + io.micrometer.prometheus.PrometheusMeterRegistry simpleclientPrometheusMeterRegistry( io.micrometer.prometheus.PrometheusConfig prometheusConfig, CollectorRegistry collectorRegistry, Clock clock, ObjectProvider exemplarSamplerProvider) { return new io.micrometer.prometheus.PrometheusMeterRegistry(prometheusConfig, collectorRegistry, clock, @@ -91,25 +91,25 @@ public class PrometheusSimpleclientMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean - public CollectorRegistry collectorRegistry() { + CollectorRegistry collectorRegistry() { return new CollectorRegistry(true); } @Bean @ConditionalOnMissingBean(ExemplarSampler.class) @ConditionalOnBean(SpanContextSupplier.class) - public DefaultExemplarSampler exemplarSampler(SpanContextSupplier spanContextSupplier) { + DefaultExemplarSampler exemplarSampler(SpanContextSupplier spanContextSupplier) { return new DefaultExemplarSampler(spanContextSupplier); } @SuppressWarnings("removal") @Configuration(proxyBeanMethods = false) @ConditionalOnAvailableEndpoint(endpoint = PrometheusSimpleclientScrapeEndpoint.class) - public static class PrometheusScrapeEndpointConfiguration { + static class PrometheusScrapeEndpointConfiguration { @Bean @ConditionalOnMissingBean({ PrometheusSimpleclientScrapeEndpoint.class, PrometheusScrapeEndpoint.class }) - public PrometheusSimpleclientScrapeEndpoint prometheusEndpoint(CollectorRegistry collectorRegistry) { + PrometheusSimpleclientScrapeEndpoint prometheusEndpoint(CollectorRegistry collectorRegistry) { return new PrometheusSimpleclientScrapeEndpoint(collectorRegistry); } @@ -122,7 +122,7 @@ public class PrometheusSimpleclientMetricsExportAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(PushGateway.class) @ConditionalOnProperty(prefix = "management.prometheus.metrics.export.pushgateway", name = "enabled") - public static class PrometheusPushGatewayConfiguration { + static class PrometheusPushGatewayConfiguration { /** * The fallback job name. We use 'spring' since there's a history of Prometheus @@ -133,7 +133,7 @@ public class PrometheusSimpleclientMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean - public PrometheusPushGatewayManager prometheusPushGatewayManager(CollectorRegistry collectorRegistry, + PrometheusPushGatewayManager prometheusPushGatewayManager(CollectorRegistry collectorRegistry, PrometheusProperties prometheusProperties, Environment environment) throws MalformedURLException { PrometheusProperties.Pushgateway properties = prometheusProperties.getPushgateway(); Duration pushRate = properties.getPushRate(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapter.java index 3b34752560e..d685f1bdcf3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapter.java @@ -18,7 +18,6 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus import java.time.Duration; -import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusProperties.HistogramFlavor; import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.PropertiesConfigAdapter; /** @@ -58,8 +57,7 @@ class PrometheusSimpleclientPropertiesConfigAdapter extends PropertiesConfigAdap } static io.micrometer.prometheus.HistogramFlavor mapToMicrometerHistogramFlavor(PrometheusProperties properties) { - HistogramFlavor histogramFlavor = properties.getHistogramFlavor(); - return switch (histogramFlavor) { + return switch (properties.getHistogramFlavor()) { case Prometheus -> io.micrometer.prometheus.HistogramFlavor.Prometheus; case VictoriaMetrics -> io.micrometer.prometheus.HistogramFlavor.VictoriaMetrics; }; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusSimpleclientExemplarsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusSimpleclientExemplarsAutoConfiguration.java index 5ce8bbe8f95..12f77e31f2b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusSimpleclientExemplarsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusSimpleclientExemplarsAutoConfiguration.java @@ -37,6 +37,7 @@ import org.springframework.util.function.SingletonSupplier; * * @author Jonatan Ivanov * @since 3.0.0 + * @deprecated since 3.3.0 for removal in 3.5.0 */ @SuppressWarnings("removal") @Deprecated(forRemoval = true, since = "3.3.0") diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapterTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapterTests.java index 56edc2f62bc..cfd4701d6d7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapterTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusSimpleclientPropertiesConfigAdapterTests.java @@ -30,7 +30,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Mirko Sobeck */ -@SuppressWarnings({ "deprecation" }) +@SuppressWarnings({ "deprecation", "removal" }) class PrometheusSimpleclientPropertiesConfigAdapterTests extends AbstractPropertiesConfigAdapterTests { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusExemplarsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusExemplarsAutoConfigurationTests.java index 55a499dde8e..4777a0c9d52 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusExemplarsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/prometheus/PrometheusExemplarsAutoConfigurationTests.java @@ -86,7 +86,7 @@ class PrometheusExemplarsAutoConfigurationTests { @Test void prometheusOpenMetricsOutputWithoutExemplarsOnHistogramCount() { this.contextRunner.withPropertyValues( - "management.prometheus.metrics.export.prometheus-properties.io.prometheus.exporter.exemplarsOnAllMetricTypes=false") + "management.prometheus.metrics.export.properties.io.prometheus.exporter.exemplarsOnAllMetricTypes=false") .run((context) -> { assertThat(context).hasSingleBean(SpanContext.class); ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class); diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpoint.java index 6991f4e1b78..19bad830c53 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpoint.java @@ -35,6 +35,7 @@ import org.springframework.lang.Nullable; * * @author Jon Schneider * @author Johnny Lim + * @author Moritz Halbritter * @since 2.0.0 */ @WebEndpoint(id = "prometheus") @@ -51,17 +52,15 @@ public class PrometheusScrapeEndpoint { } @ReadOperation(producesFrom = PrometheusOutputFormat.class) - public WebEndpointResponse scrape(PrometheusOutputFormat format, @Nullable Set includedNames) { + public WebEndpointResponse scrape(PrometheusOutputFormat format, @Nullable Set includedNames) { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(this.nextMetricsScrapeSize); MetricSnapshots metricSnapshots = (includedNames != null) ? this.prometheusRegistry.scrape(includedNames::contains) : this.prometheusRegistry.scrape(); format.write(outputStream, metricSnapshots); - - String scrapePage = outputStream.toString(); - this.nextMetricsScrapeSize = scrapePage.length() + METRICS_SCRAPE_CHARS_EXTRA; - - return new WebEndpointResponse<>(scrapePage, format); + byte[] content = outputStream.toByteArray(); + this.nextMetricsScrapeSize = content.length + METRICS_SCRAPE_CHARS_EXTRA; + return new WebEndpointResponse<>(content, format); } catch (IOException ex) { throw new IllegalStateException("Writing metrics failed", ex); diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusSimpleclientScrapeEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusSimpleclientScrapeEndpoint.java index 2da3fe0d1e6..7e81405cdd2 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusSimpleclientScrapeEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusSimpleclientScrapeEndpoint.java @@ -38,7 +38,8 @@ import org.springframework.lang.Nullable; * @author Jon Schneider * @author Johnny Lim * @since 2.0.0 - * @deprecated in favor of {@link PrometheusScrapeEndpoint} + * @deprecated since 3.3.0 for removal in 3.5.0 in favor of + * {@link PrometheusScrapeEndpoint} */ @Deprecated(since = "3.3.0", forRemoval = true) @WebEndpoint(id = "prometheus") @@ -63,10 +64,8 @@ public class PrometheusSimpleclientScrapeEndpoint { ? this.collectorRegistry.filteredMetricFamilySamples(includedNames) : this.collectorRegistry.metricFamilySamples(); format.write(writer, samples); - String scrapePage = writer.toString(); this.nextMetricsScrapeSize = scrapePage.length() + METRICS_SCRAPE_CHARS_EXTRA; - return new WebEndpointResponse<>(scrapePage, format); } catch (IOException ex) { diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/TextOutputFormat.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/TextOutputFormat.java index a49777ed29d..659893d8f29 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/TextOutputFormat.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/TextOutputFormat.java @@ -32,7 +32,7 @@ import org.springframework.util.MimeTypeUtils; * * @author Andy Wilkinson * @since 2.5.0 - * @deprecated in favor of {@link PrometheusOutputFormat} + * @deprecated since 3.3.0 for removal in 3.5.0 in favor of {@link PrometheusOutputFormat} */ @Deprecated(since = "3.3.0", forRemoval = true) public enum TextOutputFormat implements Producible { diff --git a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc index 06a39a25bfb..b03123f91d0 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc @@ -543,11 +543,13 @@ scrape_configs: ---- https://prometheus.io/docs/prometheus/latest/feature_flags/#exemplars-storage[Prometheus Exemplars] are also supported. -To enable this feature, a `SpanContextSupplier` bean should be present. +To enable this feature, a `SpanContext` bean should be present. +If you're using the deprecated Prometheus simpleclient support and want to enable that feature, a `SpanContextSupplier` bean should be present. If you use https://micrometer.io/docs/tracing[Micrometer Tracing], this will be auto-configured for you, but you can always create your own if you want. Please check the https://prometheus.io/docs/prometheus/latest/feature_flags/#exemplars-storage[Prometheus Docs], since this feature needs to be explicitly enabled on Prometheus' side, and it is only supported using the https://github.com/OpenObservability/OpenMetrics/blob/v1.0.0/specification/OpenMetrics.md#exemplars[OpenMetrics] format. For ephemeral or batch jobs that may not exist long enough to be scraped, you can use https://github.com/prometheus/pushgateway[Prometheus Pushgateway] support to expose the metrics to Prometheus. +The Prometheus Pushgateway only works with the deprecated Prometheus simpleclient for now, until the Prometheus client 1.x adds support for it. To enable Prometheus Pushgateway support, add the following dependency to your project: [source,xml]