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 e0e69fa7f9..99e6985b1f 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 @@ -16,19 +16,14 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus; -import java.net.MalformedURLException; -import java.net.URL; -import java.time.Duration; -import java.util.Map; - 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.exporter.BasicAuthHttpConnectionFactory; import io.prometheus.client.exporter.PushGateway; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; @@ -50,15 +45,20 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.core.log.LogMessage; +import java.net.MalformedURLException; +import java.net.URL; +import java.time.Duration; +import java.util.Map; + /** * {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Prometheus. * - * @since 2.0.0 * @author Jon Schneider * @author David J. M. Karlsen + * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) -@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class }) +@AutoConfigureBefore({CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class}) @AutoConfigureAfter(MetricsAutoConfiguration.class) @ConditionalOnBean(Clock.class) @ConditionalOnClass(PrometheusMeterRegistry.class) @@ -75,7 +75,7 @@ public class PrometheusMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean public PrometheusMeterRegistry prometheusMeterRegistry(PrometheusConfig prometheusConfig, - CollectorRegistry collectorRegistry, Clock clock) { + CollectorRegistry collectorRegistry, Clock clock) { return new PrometheusMeterRegistry(prometheusConfig, collectorRegistry, clock); } @@ -118,7 +118,7 @@ public class PrometheusMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean public PrometheusPushGatewayManager prometheusPushGatewayManager(CollectorRegistry collectorRegistry, - PrometheusProperties prometheusProperties, Environment environment) { + PrometheusProperties prometheusProperties, Environment environment) { PrometheusProperties.Pushgateway properties = prometheusProperties.getPushgateway(); Duration pushRate = properties.getPushRate(); String job = getJob(properties, environment); @@ -129,14 +129,19 @@ public class PrometheusMetricsExportAutoConfiguration { } private PushGateway getPushGateway(String url) { + PushGateway pushGateway = null; try { - return new PushGateway(new URL(url)); - } - catch (MalformedURLException ex) { + pushGateway = new PushGateway(new URL(url)); + } catch (MalformedURLException ex) { logger.warn(LogMessage .format("Invalid PushGateway base url '%s': update your configuration to a valid URL", url)); - return new PushGateway(url); + pushGateway = new PushGateway(url); + } + PrometheusProperties.Pushgateway properties = prometheusProperties.getPushgateway(); + if (properties.getAuthEnabled()) { + pushgateway.setConnectionFactory(new BasicAuthHttpConnectionFactory(properties.getAuthusername(), properties.getAuthpassword())); } + return pushGateway; } private String getJob(PrometheusProperties.Pushgateway properties, Environment environment) { 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 74023c8f0d..2da509b323 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 @@ -16,15 +16,14 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus; -import java.time.Duration; -import java.util.HashMap; -import java.util.Map; - import io.micrometer.prometheus.HistogramFlavor; - import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + /** * {@link ConfigurationProperties @ConfigurationProperties} for configuring metrics export * to Prometheus. @@ -86,6 +85,7 @@ public class PrometheusProperties { return this.pushgateway; } + /** * Configuration options for push-based interaction with Prometheus. */ @@ -116,6 +116,21 @@ public class PrometheusProperties { */ private Map groupingKey = new HashMap<>(); + /** + * Enable publishing via a Prometheus Pushgateway with Basic Auth. + */ + private Boolean authEnabled = false; + + /** + * Prometheus Pushgateway basic-auth username. + */ + private String authusername; + + /** + * Prometheus Pushgateway basic-auth password. + */ + private String authpassword; + /** * Operation that should be performed on shutdown. */ @@ -169,6 +184,29 @@ public class PrometheusProperties { this.shutdownOperation = shutdownOperation; } + public Boolean getAuthEnabled() { + return this.authEnabled; + } + + public void setAuthEnabled(Boolean authEnabled) { + this.authEnabled = authEnabled; + } + + public String getAuthusername() { + return authusername; + } + + public void setAuthusername(String authusername) { + this.authusername = authusername; + } + + public String getAuthpassword() { + return authpassword; + } + + public void setAuthpassword(String authpassword) { + this.authpassword = authpassword; + } } }