From 326ee33ae60524f7de2732dc598dc5a7187ca5b7 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Mon, 4 Mar 2019 11:42:56 +0200 Subject: [PATCH] Auto-configured PrometheusPushGatewayManager cannot be configured to use HTTPS to connect to the gateway. gh-16073 --- ...metheusMetricsExportAutoConfiguration.java | 13 ++++++++- ...usMetricsExportAutoConfigurationTests.java | 27 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 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 8c6898dc622f..a87b4667cd66 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,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; @@ -119,7 +121,7 @@ public PrometheusPushGatewayManager prometheusPushGatewayManager( PrometheusProperties prometheusProperties, Environment environment) { PrometheusProperties.Pushgateway properties = prometheusProperties .getPushgateway(); - PushGateway pushGateway = new PushGateway(properties.getBaseUrl()); + PushGateway pushGateway = getPushGateway(properties.getBaseUrl()); Duration pushRate = properties.getPushRate(); String job = getJob(properties, environment); Map groupingKey = properties.getGroupingKey(); @@ -128,6 +130,15 @@ public PrometheusPushGatewayManager prometheusPushGatewayManager( pushRate, job, groupingKey, shutdownOperation); } + private PushGateway getPushGateway(String url) { + try { + return new PushGateway(new URL(url)); + } + catch (MalformedURLException ex) { + return new PushGateway(url); + } + } + private String getJob(PrometheusProperties.Pushgateway properties, Environment environment) { String job = properties.getJob(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java index e8d6d0684189..3b3564608e0e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java @@ -26,10 +26,12 @@ 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.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; @@ -151,8 +153,29 @@ public void withPushGatewayEnabled() { .withPropertyValues( "management.metrics.export.prometheus.pushgateway.enabled=true") .withUserConfiguration(BaseConfiguration.class) - .run((context) -> assertThat(context) - .hasSingleBean(PrometheusPushGatewayManager.class)); + .run((context) -> hasGatewayURL(context, + "http://localhost:9091/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://localhost:8080/push") + .withUserConfiguration(BaseConfiguration.class) + .run((context) -> hasGatewayURL(context, + "https://localhost:8080/push/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)