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 c876428d22..9aba0ae77e 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 1e73c6ab76..ea5991ad4d 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 e9101485a3..265e5755cc 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 1793369d4b..371de66e43 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 3b34752560..d685f1bdcf 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 5ce8bbe8f9..12f77e31f2 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 56edc2f62b..cfd4701d6d 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 55a499dde8..4777a0c9d5 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 6991f4e1b7..19bad830c5 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 2da3fe0d1e..7e81405cdd 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 a49777ed29..659893d8f2 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 06a39a25bf..b03123f91d 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]