From b658013a97346567596897e3298e66551256f176 Mon Sep 17 00:00:00 2001 From: davidh44 <70000000+davidh44@users.noreply.github.com> Date: Thu, 28 Oct 2021 07:50:25 -0700 Subject: [PATCH] Create EndpointWebExtension only if necessary This commit updates Actuator's EndpointWebExtensions to be created only if the related endpoint is exposed over HTTP. See gh-28475 --- .../cache/CachesEndpointAutoConfiguration.java | 2 ++ ...urationPropertiesReportEndpointAutoConfiguration.java | 2 ++ .../env/EnvironmentEndpointAutoConfiguration.java | 2 ++ .../quartz/QuartzEndpointAutoConfiguration.java | 2 ++ .../cache/CachesEndpointAutoConfigurationTests.java | 9 +++++++++ ...onPropertiesReportEndpointAutoConfigurationTests.java | 9 +++++++++ .../env/EnvironmentEndpointAutoConfigurationTests.java | 9 +++++++++ .../quartz/QuartzEndpointAutoConfigurationTests.java | 9 +++++++++ 8 files changed, 44 insertions(+) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfiguration.java index f17d0bbb1d0..16bd9503ff9 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.cache; import java.util.Map; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure; import org.springframework.boot.actuate.cache.CachesEndpoint; import org.springframework.boot.actuate.cache.CachesEndpointWebExtension; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -53,6 +54,7 @@ public class CachesEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(CachesEndpoint.class) + @ConditionalOnAvailableEndpoint(exposure = EndpointExposure.WEB) public CachesEndpointWebExtension cachesEndpointWebExtension(CachesEndpoint cachesEndpoint) { return new CachesEndpointWebExtension(cachesEndpoint); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfiguration.java index 0c3df64d196..44536ab5abc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.context.properties; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpointWebExtension; import org.springframework.boot.actuate.endpoint.SanitizingFunction; @@ -62,6 +63,7 @@ public class ConfigurationPropertiesReportEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(ConfigurationPropertiesReportEndpoint.class) + @ConditionalOnAvailableEndpoint(exposure = EndpointExposure.WEB) public ConfigurationPropertiesReportEndpointWebExtension configurationPropertiesReportEndpointWebExtension( ConfigurationPropertiesReportEndpoint configurationPropertiesReportEndpoint) { return new ConfigurationPropertiesReportEndpointWebExtension(configurationPropertiesReportEndpoint); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfiguration.java index d910dd10de5..1dd998dd32f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.env; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure; import org.springframework.boot.actuate.endpoint.SanitizingFunction; import org.springframework.boot.actuate.env.EnvironmentEndpoint; import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension; @@ -60,6 +61,7 @@ public class EnvironmentEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnBean(EnvironmentEndpoint.class) + @ConditionalOnAvailableEndpoint(exposure = EndpointExposure.WEB) public EnvironmentEndpointWebExtension environmentEndpointWebExtension(EnvironmentEndpoint environmentEndpoint) { return new EnvironmentEndpointWebExtension(environmentEndpoint); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfiguration.java index 3fedb6413b7..d4a1e9e501d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.quartz; import org.quartz.Scheduler; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure; import org.springframework.boot.actuate.quartz.QuartzEndpoint; import org.springframework.boot.actuate.quartz.QuartzEndpointWebExtension; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -53,6 +54,7 @@ public class QuartzEndpointAutoConfiguration { @Bean @ConditionalOnBean(QuartzEndpoint.class) @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint(exposure = EndpointExposure.WEB) public QuartzEndpointWebExtension quartzEndpointWebExtension(QuartzEndpoint endpoint) { return new QuartzEndpointWebExtension(endpoint); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfigurationTests.java index 8c1bb8e4267..eea25d9a7e0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.cache; import org.junit.jupiter.api.Test; import org.springframework.boot.actuate.cache.CachesEndpoint; +import org.springframework.boot.actuate.cache.CachesEndpointWebExtension; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cache.CacheManager; @@ -64,4 +65,12 @@ class CachesEndpointAutoConfigurationTests { .run((context) -> assertThat(context).doesNotHaveBean(CachesEndpoint.class)); } + @Test + void runWhenOnlyExposedOverJmxShouldHaveEndpointBeanWithoutWebExtension() { + this.contextRunner.withBean(CacheManager.class, () -> mock(CacheManager.class)) + .withPropertyValues("spring.jmx.enabled=true", "management.endpoints.jmx.exposure.include=caches") + .run((context) -> assertThat(context).hasSingleBean(CachesEndpoint.class) + .doesNotHaveBean(CachesEndpointWebExtension.class)); + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfigurationTests.java index 6a1173ee785..aa17bb56f1b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointAutoConfigurationTests.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint.ApplicationConfigurationProperties; +import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpointWebExtension; import org.springframework.boot.actuate.endpoint.SanitizingFunction; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -102,6 +103,14 @@ class ConfigurationPropertiesReportEndpointAutoConfigurationTests { }; } + @Test + void runWhenOnlyExposedOverJmxShouldHaveEndpointBeanWithoutWebExtension() { + this.contextRunner + .withPropertyValues("spring.jmx.enabled=true", "management.endpoints.jmx.exposure.include=configprops") + .run((context) -> assertThat(context).hasSingleBean(ConfigurationPropertiesReportEndpoint.class) + .doesNotHaveBean(ConfigurationPropertiesReportEndpointWebExtension.class)); + } + @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties static class Config { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfigurationTests.java index 3facaf60983..f0f8135f201 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointAutoConfigurationTests.java @@ -25,6 +25,7 @@ import org.springframework.boot.actuate.env.EnvironmentEndpoint; import org.springframework.boot.actuate.env.EnvironmentEndpoint.EnvironmentDescriptor; import org.springframework.boot.actuate.env.EnvironmentEndpoint.PropertySourceDescriptor; import org.springframework.boot.actuate.env.EnvironmentEndpoint.PropertyValueDescriptor; +import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -109,6 +110,14 @@ class EnvironmentEndpointAutoConfigurationTests { .get(); } + @Test + void runWhenOnlyExposedOverJmxShouldHaveEndpointBeanWithoutWebExtension() { + this.contextRunner + .withPropertyValues("spring.jmx.enabled=true", "management.endpoints.jmx.exposure.include=env") + .run((context) -> assertThat(context).hasSingleBean(EnvironmentEndpoint.class) + .doesNotHaveBean(EnvironmentEndpointWebExtension.class)); + } + @Configuration(proxyBeanMethods = false) static class SanitizingFunctionConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfigurationTests.java index 5343b9b0de5..a0f3229d250 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfigurationTests.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; import org.quartz.Scheduler; import org.springframework.boot.actuate.quartz.QuartzEndpoint; +import org.springframework.boot.actuate.quartz.QuartzEndpointWebExtension; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -71,6 +72,14 @@ class QuartzEndpointAutoConfigurationTests { .run((context) -> assertThat(context).hasSingleBean(QuartzEndpoint.class).hasBean("customEndpoint")); } + @Test + void runWhenOnlyExposedOverJmxShouldHaveEndpointBeanWithoutWebExtension() { + this.contextRunner.withBean(Scheduler.class, () -> mock(Scheduler.class)) + .withPropertyValues("spring.jmx.enabled=true", "management.endpoints.jmx.exposure.include=quartz") + .run((context) -> assertThat(context).hasSingleBean(QuartzEndpoint.class) + .doesNotHaveBean(QuartzEndpointWebExtension.class)); + } + @Configuration(proxyBeanMethods = false) static class CustomEndpointConfiguration {