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 03d557501a04..622ad8464a98 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 @@ -107,7 +107,7 @@ static class PrometheusPushGatewayConfiguration { /** * 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 @@ private Format format(PrometheusProperties.Pushgateway properties) { 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); } } 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 76448adc8a07..bf1533f8be52 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 @@ -109,7 +109,7 @@ public static class Pushgateway { 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 static class Pushgateway { 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; 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 98fbaa29bf11..9c8013281d99 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 @@ -23,13 +23,11 @@ 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.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 @@ 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 @@ void pushGatewayIsNotConfiguredWhenEnabledFlagIsNotSet() { @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 @@ void withCustomPushGatewayAddress() { @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 @@ void withCustomScheme() { @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 @@ void withCustomFormat() { @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 @@ void withPushGatewayBasicAuth() { @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 @@ void withPushGatewayBearerToken() { @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 @@ private void hasGatewayUrl(AssertableApplicationContext context, String url) { } } - private ContextConsumer hasHttpConnectionFactory( - ThrowingConsumer 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); diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusPushGatewayManager.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusPushGatewayManager.java index a4c15250a059..81d4dba3dba6 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusPushGatewayManager.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusPushGatewayManager.java @@ -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, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java index 27f62d81e632..9225332433e8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java @@ -571,28 +571,23 @@ void asyncTaskExecutorWithCustomNonApplicationTaskExecutor() { @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