Merge pull request #16084 from nosan

* pr/16084:
  Polish "Permit use of https for configuring Prometheus push gateway"
  Permit use of https for configuring Prometheus push gateway
pull/16278/head
Stephane Nicoll 6 years ago
commit c2b35e1cd5

@ -16,6 +16,8 @@
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;
@ -24,6 +26,8 @@ import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.CollectorRegistry;
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.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
@ -105,6 +109,9 @@ public class PrometheusMetricsExportAutoConfiguration {
@ConditionalOnProperty(prefix = "management.metrics.export.prometheus.pushgateway", name = "enabled")
public static class PrometheusPushGatewayConfiguration {
private static final Log logger = LogFactory
.getLog(PrometheusPushGatewayConfiguration.class);
/**
* The fallback job name. We use 'spring' since there's a history of Prometheus
* spring integration defaulting to that name from when Prometheus integration
@ -119,13 +126,25 @@ public class PrometheusMetricsExportAutoConfiguration {
PrometheusProperties prometheusProperties, Environment environment) {
PrometheusProperties.Pushgateway properties = prometheusProperties
.getPushgateway();
PushGateway pushGateway = new PushGateway(properties.getBaseUrl());
Duration pushRate = properties.getPushRate();
String job = getJob(properties, environment);
Map<String, String> groupingKey = properties.getGroupingKey();
ShutdownOperation shutdownOperation = properties.getShutdownOperation();
return new PrometheusPushGatewayManager(pushGateway, collectorRegistry,
pushRate, job, groupingKey, shutdownOperation);
return new PrometheusPushGatewayManager(
getPushGateway(properties.getBaseUrl()), collectorRegistry, pushRate,
job, groupingKey, shutdownOperation);
}
private PushGateway getPushGateway(String url) {
try {
return new PushGateway(new URL(url));
}
catch (MalformedURLException ex) {
logger.warn(String.format(
"Invalid PushGateway base url '%s': update your configuration to a valid URL",
url));
return new PushGateway(url);
}
}
private String getJob(PrometheusProperties.Pushgateway properties,

@ -1,5 +1,5 @@
/*
* Copyright 2012-2018 the original author or authors.
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -83,7 +83,7 @@ public class PrometheusProperties {
/**
* Base URL for the Pushgateway.
*/
private String baseUrl = "localhost:9091";
private String baseUrl = "http://localhost:9091";
/**
* Frequency with which to push metrics.

@ -20,16 +20,20 @@ import io.micrometer.core.instrument.Clock;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.CollectorRegistry;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration;
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager;
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusScrapeEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat;
@ -40,6 +44,9 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
public class PrometheusMetricsExportAutoConfigurationTests {
@Rule
public final OutputCapture output = new OutputCapture();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations
.of(PrometheusMetricsExportAutoConfiguration.class));
@ -150,9 +157,49 @@ public class PrometheusMetricsExportAutoConfigurationTests {
AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues(
"management.metrics.export.prometheus.pushgateway.enabled=true")
.withUserConfiguration(BaseConfiguration.class).run((context) -> {
assertThat(this.output.toString())
.doesNotContain("Invalid PushGateway base url");
hasGatewayURL(context, "http://localhost:9091/metrics/job/");
});
}
@Test
@Deprecated
public void withCustomLegacyPushGatewayURL() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues(
"management.metrics.export.prometheus.pushgateway.enabled=true",
"management.metrics.export.prometheus.pushgateway.base-url=localhost:9090")
.withUserConfiguration(BaseConfiguration.class).run((context) -> {
assertThat(this.output.toString())
.contains("Invalid PushGateway base url")
.contains("localhost:9090");
hasGatewayURL(context, "http://localhost:9090/metrics/job/");
});
}
@Test
public void withCustomPushGatewayURL() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues(
"management.metrics.export.prometheus.pushgateway.enabled=true",
"management.metrics.export.prometheus.pushgateway.base-url=https://example.com:8080")
.withUserConfiguration(BaseConfiguration.class)
.run((context) -> assertThat(context)
.hasSingleBean(PrometheusPushGatewayManager.class));
.run((context) -> hasGatewayURL(context,
"https://example.com:8080/metrics/job/"));
}
private void hasGatewayURL(AssertableApplicationContext context, String url) {
assertThat(context).hasSingleBean(PrometheusPushGatewayManager.class);
PrometheusPushGatewayManager gatewayManager = context
.getBean(PrometheusPushGatewayManager.class);
Object pushGateway = ReflectionTestUtils.getField(gatewayManager, "pushGateway");
assertThat(pushGateway).hasFieldOrPropertyWithValue("gatewayBaseURL", url);
}
@Configuration(proxyBeanMethods = false)

Loading…
Cancel
Save