Commit 9ddc97f8 authored by AndrewDi's avatar AndrewDi Committed by Stephane Nicoll

Add basic auth support for Prometheus pushgateway

See gh-22548
parent 2c120eb1
...@@ -16,19 +16,14 @@ ...@@ -16,19 +16,14 @@
package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus; 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.core.instrument.Clock;
import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry; import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.CollectorRegistry; import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.exporter.BasicAuthHttpConnectionFactory;
import io.prometheus.client.exporter.PushGateway; import io.prometheus.client.exporter.PushGateway;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
...@@ -50,15 +45,20 @@ import org.springframework.context.annotation.Configuration; ...@@ -50,15 +45,20 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.core.log.LogMessage; 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. * {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Prometheus.
* *
* @since 2.0.0
* @author Jon Schneider * @author Jon Schneider
* @author David J. M. Karlsen * @author David J. M. Karlsen
* @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class }) @AutoConfigureBefore({CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class})
@AutoConfigureAfter(MetricsAutoConfiguration.class) @AutoConfigureAfter(MetricsAutoConfiguration.class)
@ConditionalOnBean(Clock.class) @ConditionalOnBean(Clock.class)
@ConditionalOnClass(PrometheusMeterRegistry.class) @ConditionalOnClass(PrometheusMeterRegistry.class)
...@@ -129,14 +129,19 @@ public class PrometheusMetricsExportAutoConfiguration { ...@@ -129,14 +129,19 @@ public class PrometheusMetricsExportAutoConfiguration {
} }
private PushGateway getPushGateway(String url) { private PushGateway getPushGateway(String url) {
PushGateway pushGateway = null;
try { try {
return new PushGateway(new URL(url)); pushGateway = new PushGateway(new URL(url));
} } catch (MalformedURLException ex) {
catch (MalformedURLException ex) {
logger.warn(LogMessage logger.warn(LogMessage
.format("Invalid PushGateway base url '%s': update your configuration to a valid URL", url)); .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) { private String getJob(PrometheusProperties.Pushgateway properties, Environment environment) {
......
...@@ -16,15 +16,14 @@ ...@@ -16,15 +16,14 @@
package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus; 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 io.micrometer.prometheus.HistogramFlavor;
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation; import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation;
import org.springframework.boot.context.properties.ConfigurationProperties; 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 * {@link ConfigurationProperties @ConfigurationProperties} for configuring metrics export
* to Prometheus. * to Prometheus.
...@@ -86,6 +85,7 @@ public class PrometheusProperties { ...@@ -86,6 +85,7 @@ public class PrometheusProperties {
return this.pushgateway; return this.pushgateway;
} }
/** /**
* Configuration options for push-based interaction with Prometheus. * Configuration options for push-based interaction with Prometheus.
*/ */
...@@ -116,6 +116,21 @@ public class PrometheusProperties { ...@@ -116,6 +116,21 @@ public class PrometheusProperties {
*/ */
private Map<String, String> groupingKey = new HashMap<>(); private Map<String, String> 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. * Operation that should be performed on shutdown.
*/ */
...@@ -169,6 +184,29 @@ public class PrometheusProperties { ...@@ -169,6 +184,29 @@ public class PrometheusProperties {
this.shutdownOperation = shutdownOperation; 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;
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment