See gh-44184

Signed-off-by: Johnny Lim <izeye@naver.com>
This commit is contained in:
Johnny Lim 2025-02-09 16:32:20 +09:00 committed by Stéphane Nicoll
parent d9fc813fb5
commit 8c35bce668
5 changed files with 27 additions and 56 deletions

View File

@ -107,7 +107,7 @@ public class PrometheusMetricsExportAutoConfiguration {
/**
* The fallback job name. We use 'spring' since there's a history of Prometheus
* spring integration defaulting to that name from when Prometheus integration
* Spring integration defaulting to that name from when Prometheus integration
* didn't exist in Spring itself.
*/
private static final String FALLBACK_JOB = "spring";
@ -160,8 +160,7 @@ public class PrometheusMetricsExportAutoConfiguration {
private String getJob(PrometheusProperties.Pushgateway properties, Environment environment) {
String job = properties.getJob();
job = (job != null) ? job : environment.getProperty("spring.application.name");
return (job != null) ? job : FALLBACK_JOB;
return (job != null) ? job : environment.getProperty("spring.application.name", FALLBACK_JOB);
}
}

View File

@ -109,7 +109,7 @@ public class PrometheusProperties {
private String address = "localhost:9091";
/**
* The scheme to use when pushing metrics.
* Scheme to use when pushing metrics.
*/
private Scheme scheme = Scheme.HTTP;
@ -124,12 +124,12 @@ public class PrometheusProperties {
private String password;
/**
* The token to use for authentication with the Prometheus Pushgateway.
* Token to use for authentication with the Prometheus Pushgateway.
*/
private String token;
/**
* The format to use when pushing metrics.
* Format to use when pushing metrics.
*/
private Format format = Format.PROTOBUF;

View File

@ -23,13 +23,11 @@ import io.micrometer.core.instrument.Clock;
import io.micrometer.prometheusmetrics.PrometheusConfig;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import io.prometheus.metrics.exporter.pushgateway.DefaultHttpConnectionFactory;
import io.prometheus.metrics.exporter.pushgateway.HttpConnectionFactory;
import io.prometheus.metrics.exporter.pushgateway.PushGateway;
import io.prometheus.metrics.expositionformats.PrometheusTextFormatWriter;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import io.prometheus.metrics.tracer.common.SpanContext;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.assertj.core.api.ThrowingConsumer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ -38,10 +36,8 @@ import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPush
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusScrapeEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.context.properties.source.MutuallyExclusiveConfigurationPropertiesException;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.context.annotation.Bean;
@ -61,7 +57,6 @@ import static org.assertj.core.api.Assertions.assertThat;
class PrometheusMetricsExportAutoConfigurationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withClassLoader(new FilteredClassLoader("io.micrometer.prometheus.", "io.prometheus.client"))
.withConfiguration(AutoConfigurations.of(PrometheusMetricsExportAutoConfiguration.class));
@Test
@ -177,35 +172,26 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
@ExtendWith(OutputCaptureExtension.class)
void withPushGatewayEnabled(CapturedOutput output) {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true")
this.contextRunner.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true")
.withUserConfiguration(BaseConfiguration.class)
.run((context) -> {
assertThat(output).doesNotContain("Invalid PushGateway base url");
hasGatewayUrl(context, "http://localhost:9091/metrics/job/spring");
assertThat(getPushGateway(context)).extracting("connectionFactory")
.isInstanceOf(DefaultHttpConnectionFactory.class);
});
}
@Test
void withPushGatewayDisabled() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=false")
this.contextRunner.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=false")
.withUserConfiguration(BaseConfiguration.class)
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusPushGatewayManager.class));
}
@Test
void withPushGatewayNoBasicAuth() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true")
.withUserConfiguration(BaseConfiguration.class)
.run(hasHttpConnectionFactory((httpConnectionFactory) -> assertThat(httpConnectionFactory)
.isInstanceOf(DefaultHttpConnectionFactory.class)));
}
@Test
void withCustomPushGatewayAddress() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.address=localhost:8080")
.withUserConfiguration(BaseConfiguration.class)
@ -214,7 +200,7 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
void withCustomScheme() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.scheme=https")
.withUserConfiguration(BaseConfiguration.class)
@ -223,7 +209,7 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
void withCustomFormat() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.format=text")
.withUserConfiguration(BaseConfiguration.class)
@ -233,7 +219,7 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
void withPushGatewayBasicAuth() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.username=admin",
"management.prometheus.metrics.export.pushgateway.password=secret")
@ -246,7 +232,7 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
void withPushGatewayBearerToken() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.token=a1b2c3d4")
.withUserConfiguration(BaseConfiguration.class)
@ -257,7 +243,7 @@ class PrometheusMetricsExportAutoConfigurationTests {
@Test
void failsFastWithBothBearerAndBasicAuthentication() {
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
this.contextRunner
.withPropertyValues("management.prometheus.metrics.export.pushgateway.enabled=true",
"management.prometheus.metrics.export.pushgateway.username=alice",
"management.prometheus.metrics.export.pushgateway.token=a1b2c3d4")
@ -277,15 +263,6 @@ class PrometheusMetricsExportAutoConfigurationTests {
}
}
private ContextConsumer<AssertableApplicationContext> hasHttpConnectionFactory(
ThrowingConsumer<HttpConnectionFactory> httpConnectionFactory) {
return (context) -> {
PushGateway pushGateway = getPushGateway(context);
httpConnectionFactory
.accept((HttpConnectionFactory) ReflectionTestUtils.getField(pushGateway, "connectionFactory"));
};
}
private PushGateway getPushGateway(AssertableApplicationContext context) {
assertThat(context).hasSingleBean(PrometheusPushGatewayManager.class);
PrometheusPushGatewayManager gatewayManager = context.getBean(PrometheusPushGatewayManager.class);

View File

@ -55,7 +55,7 @@ public class PrometheusPushGatewayManager {
* @param pushGateway the source push gateway
* @param pushRate the rate at which push operations occur
* @param shutdownOperation the shutdown operation that should be performed when
* context is closed.
* context is closed
* @since 3.5.0
*/
public PrometheusPushGatewayManager(PushGateway pushGateway, Duration pushRate,

View File

@ -571,28 +571,23 @@ class WebMvcAutoConfigurationTests {
@Test
void customMediaTypes() {
this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.media-types.yaml:text/yaml")
.run((context) -> {
RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class);
ContentNegotiationManager contentNegotiationManager = (ContentNegotiationManager) ReflectionTestUtils
.getField(adapter, "contentNegotiationManager");
assertThat(contentNegotiationManager.getAllFileExtensions()).contains("yaml");
});
.run((context) -> assertThat(context.getBean(RequestMappingHandlerAdapter.class))
.extracting("contentNegotiationManager",
InstanceOfAssertFactories.type(ContentNegotiationManager.class))
.satisfies((contentNegotiationManager) -> assertThat(contentNegotiationManager.getAllFileExtensions())
.contains("yaml")));
}
@Test
void customDefaultContentTypes() {
this.contextRunner
.withPropertyValues("spring.mvc.contentnegotiation.default-content-types:application/json,application/xml")
.run((context) -> {
RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class);
ContentNegotiationManager contentNegotiationManager = (ContentNegotiationManager) ReflectionTestUtils
.getField(adapter, "contentNegotiationManager");
assertThat(contentNegotiationManager).isNotNull();
assertThat(contentNegotiationManager.getStrategy(FixedContentNegotiationStrategy.class))
.extracting(FixedContentNegotiationStrategy::getContentTypes)
.asInstanceOf(InstanceOfAssertFactories.list(MediaType.class))
.containsExactly(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML);
});
.run((context) -> assertThat(context.getBean(RequestMappingHandlerAdapter.class))
.extracting("contentNegotiationManager",
InstanceOfAssertFactories.type(ContentNegotiationManager.class))
.satisfies((contentNegotiationManager) -> assertThat(
contentNegotiationManager.getStrategy(FixedContentNegotiationStrategy.class).getContentTypes())
.containsExactly(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)));
}
@Test