Merge enablement and exposure conditions for Actuator endpoints
This commit merges the conditions for determining if an endpoint is available in a single condition, deprecating `ConditionalOnEnabledEndpoint` in the process. Closes gh-16169
This commit is contained in:
@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.audit;
|
||||
|
||||
import org.springframework.boot.actuate.audit.AuditEventRepository;
|
||||
import org.springframework.boot.actuate.audit.AuditEventsEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@AutoConfigureAfter(AuditAutoConfiguration.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = AuditEventsEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = AuditEventsEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = AuditEventsEndpoint.class)
|
||||
public class AuditEventsEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.beans;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.beans.BeansEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -32,8 +31,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = BeansEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = BeansEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = BeansEndpoint.class)
|
||||
public class BeansEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cache;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.cache.CachesEndpoint;
|
||||
import org.springframework.boot.actuate.cache.CachesEndpointWebExtension;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
@@ -41,8 +40,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(CacheManager.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = CachesEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = CachesEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = CachesEndpoint.class)
|
||||
@AutoConfigureAfter(CacheAutoConfiguration.class)
|
||||
public class CachesEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -28,8 +28,7 @@ import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
|
||||
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryInfoEndpointWebExtension;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
|
||||
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
|
||||
@@ -86,8 +85,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnEnabledEndpoint
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
@ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class })
|
||||
public CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension(
|
||||
ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) {
|
||||
@@ -97,8 +95,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnEnabledEndpoint
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
|
||||
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
|
||||
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
|
||||
|
||||
@@ -25,8 +25,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
|
||||
@@ -88,8 +87,7 @@ public class CloudFoundryActuatorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnEnabledEndpoint
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
@ConditionalOnBean({ HealthEndpoint.class, HealthEndpointWebExtension.class })
|
||||
public CloudFoundryHealthEndpointWebExtension cloudFoundryHealthEndpointWebExtension(
|
||||
HealthEndpointWebExtension healthEndpointWebExtension) {
|
||||
@@ -98,8 +96,7 @@ public class CloudFoundryActuatorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnEnabledEndpoint
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
|
||||
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
|
||||
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.condition;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
|
||||
@@ -33,8 +32,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = ConditionsReportEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = ConditionsReportEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = ConditionsReportEndpoint.class)
|
||||
public class ConditionsReportEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.context;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.context.ShutdownEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = ShutdownEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = ShutdownEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = ShutdownEndpoint.class)
|
||||
public class ShutdownEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.context.properties;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
|
||||
@EnableConfigurationProperties(ConfigurationPropertiesReportEndpointProperties.class)
|
||||
public class ConfigurationPropertiesReportEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,10 +16,15 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.boot.actuate.endpoint.EndpointId;
|
||||
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
|
||||
import org.springframework.boot.actuate.endpoint.annotation.EndpointExtension;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
@@ -27,10 +32,12 @@ import org.springframework.core.annotation.AnnotationAttributes;
|
||||
import org.springframework.core.annotation.MergedAnnotation;
|
||||
import org.springframework.core.annotation.MergedAnnotations;
|
||||
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.core.type.MethodMetadata;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
|
||||
/**
|
||||
* Base class for {@link Endpoint @Endpoint} related {@link SpringBootCondition}
|
||||
@@ -42,12 +49,44 @@ import org.springframework.util.ClassUtils;
|
||||
*/
|
||||
abstract class AbstractEndpointCondition extends SpringBootCondition {
|
||||
|
||||
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
|
||||
|
||||
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
|
||||
|
||||
AnnotationAttributes getEndpointAttributes(Class<?> annotationClass,
|
||||
ConditionContext context, AnnotatedTypeMetadata metadata) {
|
||||
return getEndpointAttributes(getEndpointType(annotationClass, context, metadata));
|
||||
}
|
||||
|
||||
Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context,
|
||||
protected ConditionOutcome getEnablementOutcome(ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata, Class<? extends Annotation> annotationClass) {
|
||||
Environment environment = context.getEnvironment();
|
||||
AnnotationAttributes attributes = getEndpointAttributes(annotationClass, context,
|
||||
metadata);
|
||||
EndpointId id = EndpointId.of(attributes.getString("id"));
|
||||
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
|
||||
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
|
||||
if (userDefinedEnabled != null) {
|
||||
return new ConditionOutcome(userDefinedEnabled,
|
||||
ConditionMessage.forCondition(annotationClass)
|
||||
.because("found property " + key + " with value "
|
||||
+ userDefinedEnabled));
|
||||
}
|
||||
Boolean userDefinedDefault = isEnabledByDefault(environment);
|
||||
if (userDefinedDefault != null) {
|
||||
return new ConditionOutcome(userDefinedDefault,
|
||||
ConditionMessage.forCondition(annotationClass)
|
||||
.because("no property " + key
|
||||
+ " found so using user defined default from "
|
||||
+ ENABLED_BY_DEFAULT_KEY));
|
||||
}
|
||||
boolean endpointDefault = attributes.getBoolean("enableByDefault");
|
||||
return new ConditionOutcome(endpointDefault,
|
||||
ConditionMessage.forCondition(annotationClass).because(
|
||||
"no property " + key + " found so using endpoint default"));
|
||||
}
|
||||
|
||||
protected Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata) {
|
||||
Map<String, Object> attributes = metadata
|
||||
.getAnnotationAttributes(annotationClass.getName());
|
||||
@@ -73,7 +112,7 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
|
||||
}
|
||||
}
|
||||
|
||||
AnnotationAttributes getEndpointAttributes(Class<?> type) {
|
||||
protected AnnotationAttributes getEndpointAttributes(Class<?> type) {
|
||||
MergedAnnotations annotations = MergedAnnotations.from(type,
|
||||
SearchStrategy.EXHAUSTIVE);
|
||||
MergedAnnotation<Endpoint> endpoint = annotations.get(Endpoint.class);
|
||||
@@ -88,4 +127,14 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
|
||||
return getEndpointAttributes(extension.getClass("endpoint"));
|
||||
}
|
||||
|
||||
private Boolean isEnabledByDefault(Environment environment) {
|
||||
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
|
||||
if (enabledByDefault == null) {
|
||||
enabledByDefault = Optional.ofNullable(
|
||||
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
|
||||
enabledByDefaultCache.put(environment, enabledByDefault);
|
||||
}
|
||||
return enabledByDefault.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -28,20 +28,17 @@ import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
/**
|
||||
* {@link Conditional @Conditional} that checks whether an endpoint is exposed or not.
|
||||
* Matches according to the endpoint exposure configuration {@link Environment}
|
||||
* properties. This is designed as a companion annotation to
|
||||
* {@link ConditionalOnEnabledEndpoint @ConditionalOnEnabledEndpoint}.
|
||||
* {@link Conditional @Conditional} that checks whether an endpoint is available. An
|
||||
* endpoint is considered available if it is both enabled and exposed. Matches enablement
|
||||
* according to the endpoints specific {@link Environment} property, falling back to
|
||||
* {@code management.endpoints.enabled-by-default} or failing that
|
||||
* {@link Endpoint#enableByDefault()}. Matches exposure according to any of the
|
||||
* {@code management.endpoints.web.exposure.<id>} or
|
||||
* {@code management.endpoints.jmx.exposure.<id>} specific properties or failing that to
|
||||
* whether the application runs on
|
||||
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}. Both those
|
||||
* conditions should match for the endpoint to be considered available.
|
||||
* <p>
|
||||
* For a given {@link Endpoint @Endpoint}, the condition will match if:
|
||||
* <ul>
|
||||
* <li>{@code "management.endpoints.web.exposure.*"} expose this endpoint</li>
|
||||
* <li>or if JMX is enabled and {@code "management.endpoints.jmx.exposure.*"} expose this
|
||||
* endpoint</li>
|
||||
* <li>or if the application is running on
|
||||
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}</li>
|
||||
* </ul>
|
||||
*
|
||||
* When placed on a {@code @Bean} method, the endpoint defaults to the return type of the
|
||||
* factory method:
|
||||
*
|
||||
@@ -49,7 +46,7 @@ import org.springframework.core.env.Environment;
|
||||
* @Configuration
|
||||
* public class MyConfiguration {
|
||||
*
|
||||
* @ConditionalOnExposedEndpoint
|
||||
* @ConditionalOnAvailableEndpoint
|
||||
* @Bean
|
||||
* public MyEndpoint myEndpoint() {
|
||||
* ...
|
||||
@@ -63,7 +60,7 @@ import org.springframework.core.env.Environment;
|
||||
* @Configuration
|
||||
* public class MyConfiguration {
|
||||
*
|
||||
* @ConditionalOnExposedEndpoint
|
||||
* @ConditionalOnAvailableEndpoint
|
||||
* @Bean
|
||||
* public MyEndpointWebExtension myEndpointWebExtension() {
|
||||
* ...
|
||||
@@ -72,8 +69,8 @@ import org.springframework.core.env.Environment;
|
||||
* }</pre>
|
||||
* <p>
|
||||
* In the sample above, {@code MyEndpointWebExtension} will be created if the endpoint is
|
||||
* enabled as defined by the rules above. {@code MyEndpointWebExtension} must be a regular
|
||||
* extension that refers to an endpoint, something like:
|
||||
* available as defined by the rules above. {@code MyEndpointWebExtension} must be a
|
||||
* regular extension that refers to an endpoint, something like:
|
||||
*
|
||||
* <pre class="code">
|
||||
* @EndpointWebExtension(endpoint = MyEndpoint.class)
|
||||
@@ -82,13 +79,13 @@ import org.springframework.core.env.Environment;
|
||||
* }</pre>
|
||||
* <p>
|
||||
* Alternatively, the target endpoint can be manually specified for components that should
|
||||
* only be created when a given endpoint is enabled:
|
||||
* only be created when a given endpoint is available:
|
||||
*
|
||||
* <pre class="code">
|
||||
* @Configuration
|
||||
* public class MyConfiguration {
|
||||
*
|
||||
* @ConditionalOnExposedEndpoint(endpoint = MyEndpoint.class)
|
||||
* @ConditionalOnAvailableEndpoint(endpoint = MyEndpoint.class)
|
||||
* @Bean
|
||||
* public MyComponent myComponent() {
|
||||
* ...
|
||||
@@ -97,15 +94,15 @@ import org.springframework.core.env.Environment;
|
||||
* }</pre>
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @author Stephane Nicoll
|
||||
* @since 2.2.0
|
||||
* @see Endpoint
|
||||
* @see ConditionalOnEnabledEndpoint
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ ElementType.METHOD, ElementType.TYPE })
|
||||
@Documented
|
||||
@Conditional(OnExposedEndpointCondition.class)
|
||||
public @interface ConditionalOnExposedEndpoint {
|
||||
@Conditional(OnAvailableEndpointCondition.class)
|
||||
public @interface ConditionalOnAvailableEndpoint {
|
||||
|
||||
/**
|
||||
* The endpoint type that should be checked. Inferred when the return type of the
|
||||
@@ -90,11 +90,13 @@ import org.springframework.core.env.Environment;
|
||||
* @author Stephane Nicoll
|
||||
* @since 2.0.0
|
||||
* @see Endpoint
|
||||
* @deprecated as of 2.2.0 in favor of {@link ConditionalOnAvailableEndpoint}
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ ElementType.METHOD, ElementType.TYPE })
|
||||
@Documented
|
||||
@Conditional(OnEnabledEndpointCondition.class)
|
||||
@Deprecated
|
||||
public @interface ConditionalOnEnabledEndpoint {
|
||||
|
||||
/**
|
||||
|
||||
@@ -35,12 +35,13 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
|
||||
/**
|
||||
* A condition that checks if an endpoint is exposed.
|
||||
* A condition that checks if an endpoint is available (i.e. enabled and exposed).
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @see ConditionalOnExposedEndpoint
|
||||
* @author Stephane Nicoll
|
||||
* @see ConditionalOnAvailableEndpoint
|
||||
*/
|
||||
class OnExposedEndpointCondition extends AbstractEndpointCondition {
|
||||
class OnAvailableEndpointCondition extends AbstractEndpointCondition {
|
||||
|
||||
private static final String JMX_ENABLED_KEY = "spring.jmx.enabled";
|
||||
|
||||
@@ -49,28 +50,34 @@ class OnExposedEndpointCondition extends AbstractEndpointCondition {
|
||||
@Override
|
||||
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata) {
|
||||
ConditionOutcome enablementOutcome = getEnablementOutcome(context, metadata,
|
||||
ConditionalOnAvailableEndpoint.class);
|
||||
if (!enablementOutcome.isMatch()) {
|
||||
return enablementOutcome;
|
||||
}
|
||||
ConditionMessage message = enablementOutcome.getConditionMessage();
|
||||
Environment environment = context.getEnvironment();
|
||||
if (CloudPlatform.CLOUD_FOUNDRY.isActive(environment)) {
|
||||
return new ConditionOutcome(true,
|
||||
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class)
|
||||
message.andCondition(ConditionalOnAvailableEndpoint.class)
|
||||
.because("application is running on Cloud Foundry"));
|
||||
}
|
||||
AnnotationAttributes attributes = getEndpointAttributes(
|
||||
ConditionalOnExposedEndpoint.class, context, metadata);
|
||||
ConditionalOnAvailableEndpoint.class, context, metadata);
|
||||
EndpointId id = EndpointId.of(attributes.getString("id"));
|
||||
Set<ExposureInformation> exposureInformations = getExposureInformation(
|
||||
environment);
|
||||
for (ExposureInformation exposureInformation : exposureInformations) {
|
||||
if (exposureInformation.isExposed(id)) {
|
||||
return new ConditionOutcome(true,
|
||||
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class)
|
||||
message.andCondition(ConditionalOnAvailableEndpoint.class)
|
||||
.because("marked as exposed by a 'management.endpoints."
|
||||
+ exposureInformation.getPrefix()
|
||||
+ ".exposure' property"));
|
||||
}
|
||||
}
|
||||
return new ConditionOutcome(false,
|
||||
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class).because(
|
||||
message.andCondition(ConditionalOnAvailableEndpoint.class).because(
|
||||
"no 'management.endpoints' property marked it as exposed"));
|
||||
}
|
||||
|
||||
@@ -16,16 +16,9 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.boot.actuate.endpoint.EndpointId;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
import org.springframework.core.annotation.AnnotationAttributes;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
|
||||
/**
|
||||
* A condition that checks if an endpoint is enabled.
|
||||
@@ -34,50 +27,16 @@ import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
* @author Andy Wilkinson
|
||||
* @author Phillip Webb
|
||||
* @see ConditionalOnEnabledEndpoint
|
||||
* @deprecated as of 2.2.0 in favor of {@link OnAvailableEndpointCondition}
|
||||
*/
|
||||
@Deprecated
|
||||
class OnEnabledEndpointCondition extends AbstractEndpointCondition {
|
||||
|
||||
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
|
||||
|
||||
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
|
||||
|
||||
@Override
|
||||
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata) {
|
||||
Environment environment = context.getEnvironment();
|
||||
AnnotationAttributes attributes = getEndpointAttributes(
|
||||
ConditionalOnEnabledEndpoint.class, context, metadata);
|
||||
EndpointId id = EndpointId.of(attributes.getString("id"));
|
||||
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
|
||||
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
|
||||
if (userDefinedEnabled != null) {
|
||||
return new ConditionOutcome(userDefinedEnabled,
|
||||
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
|
||||
.because("found property " + key + " with value "
|
||||
+ userDefinedEnabled));
|
||||
}
|
||||
Boolean userDefinedDefault = isEnabledByDefault(environment);
|
||||
if (userDefinedDefault != null) {
|
||||
return new ConditionOutcome(userDefinedDefault,
|
||||
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
|
||||
.because("no property " + key
|
||||
+ " found so using user defined default from "
|
||||
+ ENABLED_BY_DEFAULT_KEY));
|
||||
}
|
||||
boolean endpointDefault = attributes.getBoolean("enableByDefault");
|
||||
return new ConditionOutcome(endpointDefault,
|
||||
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class).because(
|
||||
"no property " + key + " found so using endpoint default"));
|
||||
}
|
||||
|
||||
private Boolean isEnabledByDefault(Environment environment) {
|
||||
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
|
||||
if (enabledByDefault == null) {
|
||||
enabledByDefault = Optional.ofNullable(
|
||||
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
|
||||
enabledByDefaultCache.put(environment, enabledByDefault);
|
||||
}
|
||||
return enabledByDefault.orElse(null);
|
||||
return getEnablementOutcome(context, metadata,
|
||||
ConditionalOnEnabledEndpoint.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.env;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.env.EnvironmentEndpoint;
|
||||
import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -36,8 +35,7 @@ import org.springframework.core.env.Environment;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = EnvironmentEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = EnvironmentEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = EnvironmentEndpoint.class)
|
||||
@EnableConfigurationProperties(EnvironmentEndpointProperties.class)
|
||||
public class EnvironmentEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.flyway;
|
||||
|
||||
import org.flywaydb.core.Flyway;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.flyway.FlywayEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -39,8 +38,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(Flyway.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = FlywayEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = FlywayEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = FlywayEndpoint.class)
|
||||
@AutoConfigureAfter(FlywayAutoConfiguration.class)
|
||||
public class FlywayEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.health;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.health.CompositeHealthIndicator;
|
||||
import org.springframework.boot.actuate.health.HealthAggregator;
|
||||
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||
@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnSingleCandidate(HealthIndicatorRegistry.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
|
||||
class HealthEndpointConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
package org.springframework.boot.actuate.autoconfigure.health;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.health.CompositeReactiveHealthIndicator;
|
||||
import org.springframework.boot.actuate.health.HealthAggregator;
|
||||
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||
@@ -44,8 +43,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties(HealthIndicatorProperties.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
|
||||
class HealthEndpointWebExtensionConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.info;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.info.InfoContributor;
|
||||
import org.springframework.boot.actuate.info.InfoEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
@@ -36,8 +35,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = InfoEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = InfoEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = InfoEndpoint.class)
|
||||
@AutoConfigureAfter(InfoContributorAutoConfiguration.class)
|
||||
public class InfoEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.integration;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -41,8 +40,7 @@ import org.springframework.integration.graph.IntegrationGraphServer;
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(IntegrationGraphServer.class)
|
||||
@ConditionalOnBean(IntegrationConfigurationBeanFactoryPostProcessor.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = IntegrationGraphEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = IntegrationGraphEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = IntegrationGraphEndpoint.class)
|
||||
@AutoConfigureAfter(IntegrationAutoConfiguration.class)
|
||||
public class IntegrationGraphEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.jolokia;
|
||||
|
||||
import org.jolokia.http.AgentServlet;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||
@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||
@ConditionalOnClass(AgentServlet.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = JolokiaEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = JolokiaEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = JolokiaEndpoint.class)
|
||||
@EnableConfigurationProperties(JolokiaProperties.class)
|
||||
public class JolokiaEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -20,8 +20,7 @@ import liquibase.integration.spring.SpringLiquibase;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.liquibase.LiquibaseEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -42,8 +41,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(SpringLiquibase.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = LiquibaseEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = LiquibaseEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = LiquibaseEndpoint.class)
|
||||
@AutoConfigureAfter(LiquibaseAutoConfiguration.class)
|
||||
public class LiquibaseEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.logging;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.logging.LogFileWebEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
|
||||
@@ -42,8 +41,7 @@ import org.springframework.util.StringUtils;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = LogFileWebEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = LogFileWebEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = LogFileWebEndpoint.class)
|
||||
@EnableConfigurationProperties(LogFileWebEndpointProperties.class)
|
||||
public class LogFileWebEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.logging;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.logging.LoggersEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
|
||||
@@ -39,8 +38,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = LoggersEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = LoggersEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = LoggersEndpoint.class)
|
||||
public class LoggersEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.management;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.management.HeapDumpWebEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = HeapDumpWebEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = HeapDumpWebEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = HeapDumpWebEndpoint.class)
|
||||
public class HeapDumpWebEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.management;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.management.ThreadDumpEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = ThreadDumpEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = ThreadDumpEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = ThreadDumpEndpoint.class)
|
||||
public class ThreadDumpEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics;
|
||||
import io.micrometer.core.annotation.Timed;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.metrics.MetricsEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -38,8 +37,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(Timed.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = MetricsEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = MetricsEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = MetricsEndpoint.class)
|
||||
@AutoConfigureAfter({ MetricsAutoConfiguration.class,
|
||||
CompositeMeterRegistryAutoConfiguration.class })
|
||||
public class MetricsEndpointAutoConfiguration {
|
||||
|
||||
@@ -29,8 +29,7 @@ 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;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
|
||||
@@ -89,8 +88,7 @@ public class PrometheusMetricsExportAutoConfiguration {
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = PrometheusScrapeEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = PrometheusScrapeEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = PrometheusScrapeEndpoint.class)
|
||||
public static class PrometheusScrapeEndpointConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.scheduling;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -35,8 +34,7 @@ import org.springframework.scheduling.config.ScheduledTaskHolder;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = ScheduledTasksEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = ScheduledTasksEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = ScheduledTasksEndpoint.class)
|
||||
public class ScheduledTasksEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.session;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.session.SessionsEndpoint;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -38,8 +37,7 @@ import org.springframework.session.Session;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(FindByIndexNameSessionRepository.class)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = SessionsEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = SessionsEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = SessionsEndpoint.class)
|
||||
@AutoConfigureAfter(SessionAutoConfiguration.class)
|
||||
public class SessionsEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.trace.http;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.trace.http.HttpTraceEndpoint;
|
||||
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnEnabledEndpoint(endpoint = HttpTraceEndpoint.class)
|
||||
@ConditionalOnExposedEndpoint(endpoint = HttpTraceEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = HttpTraceEndpoint.class)
|
||||
@AutoConfigureAfter(HttpTraceAutoConfiguration.class)
|
||||
public class HttpTraceEndpointAutoConfiguration {
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.web.mappings;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
|
||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||
import org.springframework.boot.actuate.web.mappings.MappingDescriptionProvider;
|
||||
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
|
||||
import org.springframework.boot.actuate.web.mappings.reactive.DispatcherHandlersMappingDescriptionProvider;
|
||||
@@ -48,8 +47,7 @@ import org.springframework.web.servlet.DispatcherServlet;
|
||||
public class MappingsEndpointAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnEnabledEndpoint
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext,
|
||||
ObjectProvider<MappingDescriptionProvider> descriptionProviders) {
|
||||
return new MappingsEndpoint(
|
||||
|
||||
@@ -29,11 +29,11 @@ import org.springframework.context.annotation.Configuration;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link ConditionalOnExposedEndpoint @ConditionalOnExposedEndpoint}.
|
||||
* Tests for {@link ConditionalOnAvailableEndpoint @ConditionalOnAvailableEndpoint}.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
*/
|
||||
public class ConditionalOnExposedEndpointTests {
|
||||
public class ConditionalOnAvailableEndpointTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withUserConfiguration(AllEndpointsConfiguration.class);
|
||||
@@ -41,15 +41,45 @@ public class ConditionalOnExposedEndpointTests {
|
||||
@Test
|
||||
public void outcomeShouldMatchDefaults() {
|
||||
this.contextRunner.run((context) -> assertThat(context).hasBean("info")
|
||||
.hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test"));
|
||||
.hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test")
|
||||
.doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllWebShouldMatch() {
|
||||
public void outcomeWithEnabledByDefaultSetToFalseShouldNotMatchAnything() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.enabled-by-default=false")
|
||||
.run((context) -> assertThat(context).doesNotHaveBean("info")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllWebShouldMatchEnabledEndpoints() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=*")
|
||||
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
|
||||
.hasBean("test").hasBean("spring"));
|
||||
.hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllWebAndDisablingEndpointShouldMatchEnabledEndpoints() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=*",
|
||||
"management.endpoint.test.enabled=false",
|
||||
"management.endpoint.health.enabled=false")
|
||||
.run((context) -> assertThat(context).hasBean("info")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("test")
|
||||
.hasBean("spring").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllWebAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=*",
|
||||
"management.endpoint.shutdown.enabled=true")
|
||||
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
|
||||
.hasBean("test").hasBean("spring").hasBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -57,16 +87,27 @@ public class ConditionalOnExposedEndpointTests {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.jmx.exposure.include=*")
|
||||
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
|
||||
.doesNotHaveBean("spring").doesNotHaveBean("test"));
|
||||
.doesNotHaveBean("spring").doesNotHaveBean("test")
|
||||
.doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatch() {
|
||||
public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatchEnabledEndpoints() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.jmx.exposure.include=*",
|
||||
"spring.jmx.enabled=true")
|
||||
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
|
||||
.hasBean("test").hasBean("spring"));
|
||||
.hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeAllJmxAndJmxEnabledAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.jmx.exposure.include=*",
|
||||
"spring.jmx.enabled=true",
|
||||
"management.endpoint.shutdown.enabled=true")
|
||||
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
|
||||
.hasBean("test").hasBean("spring").hasBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,7 +116,8 @@ public class ConditionalOnExposedEndpointTests {
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=*",
|
||||
"management.endpoints.web.exposure.exclude=spring,info")
|
||||
.run((context) -> assertThat(context).hasBean("health").hasBean("test")
|
||||
.doesNotHaveBean("info").doesNotHaveBean("spring"));
|
||||
.doesNotHaveBean("info").doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -84,16 +126,36 @@ public class ConditionalOnExposedEndpointTests {
|
||||
"management.endpoints.web.exposure.include=info,health,spring,test",
|
||||
"management.endpoints.web.exposure.exclude=spring,info")
|
||||
.run((context) -> assertThat(context).hasBean("health").hasBean("test")
|
||||
.doesNotHaveBean("info").doesNotHaveBean("spring"));
|
||||
.doesNotHaveBean("info").doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeMatchesShouldMatch() {
|
||||
public void outcomeWhenIncludeMatchesShouldMatchEnabledEndpoints() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=spring")
|
||||
.run((context) -> assertThat(context).hasBean("spring")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("info")
|
||||
.doesNotHaveBean("test"));
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeMatchOnDisabledEndpointShouldNotMatch() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=shutdown")
|
||||
.run((context) -> assertThat(context).doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("info")
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeMatchOnEnabledEndpointShouldNotMatch() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=shutdown",
|
||||
"management.endpoint.shutdown.enabled=true")
|
||||
.run((context) -> assertThat(context).doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("info")
|
||||
.doesNotHaveBean("test").hasBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -102,7 +164,7 @@ public class ConditionalOnExposedEndpointTests {
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=sPRing")
|
||||
.run((context) -> assertThat(context).hasBean("spring")
|
||||
.doesNotHaveBean("health").doesNotHaveBean("info")
|
||||
.doesNotHaveBean("test"));
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -112,11 +174,11 @@ public class ConditionalOnExposedEndpointTests {
|
||||
"management.endpoints.web.exposure.exclude=*")
|
||||
.run((context) -> assertThat(context).doesNotHaveBean("health")
|
||||
.doesNotHaveBean("info").doesNotHaveBean("spring")
|
||||
.doesNotHaveBean("test"));
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outcomeWhenIncludeMatchesShoulMatchWithExtensionsAndComponents() {
|
||||
public void outcomeWhenIncludeMatchesShouldMatchWithExtensionsAndComponents() {
|
||||
this.contextRunner
|
||||
.withUserConfiguration(
|
||||
ComponentEnabledIfEndpointIsExposedConfiguration.class)
|
||||
@@ -124,7 +186,7 @@ public class ConditionalOnExposedEndpointTests {
|
||||
.run((context) -> assertThat(context).hasBean("spring")
|
||||
.hasBean("springComponent").hasBean("springExtension")
|
||||
.doesNotHaveBean("info").doesNotHaveBean("health")
|
||||
.doesNotHaveBean("test"));
|
||||
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -169,6 +231,11 @@ public class ConditionalOnExposedEndpointTests {
|
||||
|
||||
}
|
||||
|
||||
@Endpoint(id = "shutdown", enableByDefault = false)
|
||||
static class ShutdownEndpoint {
|
||||
|
||||
}
|
||||
|
||||
@EndpointExtension(endpoint = SpringEndpoint.class, filter = TestFilter.class)
|
||||
static class SpringEndpointExtension {
|
||||
|
||||
@@ -187,42 +254,48 @@ public class ConditionalOnExposedEndpointTests {
|
||||
static class AllEndpointsConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public HealthEndpoint health() {
|
||||
return new HealthEndpoint();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public InfoEndpoint info() {
|
||||
return new InfoEndpoint();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public SpringEndpoint spring() {
|
||||
return new SpringEndpoint();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public TestEndpoint test() {
|
||||
return new TestEndpoint();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public ShutdownEndpoint shutdown() {
|
||||
return new ShutdownEndpoint();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class ComponentEnabledIfEndpointIsExposedConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint(endpoint = SpringEndpoint.class)
|
||||
@ConditionalOnAvailableEndpoint(endpoint = SpringEndpoint.class)
|
||||
public String springComponent() {
|
||||
return "springComponent";
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public SpringEndpointExtension springExtension() {
|
||||
return new SpringEndpointExtension();
|
||||
}
|
||||
@@ -233,7 +306,7 @@ public class ConditionalOnExposedEndpointTests {
|
||||
static class ComponentWithNoEndpointReferenceConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnExposedEndpoint
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public String springcomp() {
|
||||
return "springcomp";
|
||||
}
|
||||
@@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
* @author Stephane Nicoll
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@Deprecated
|
||||
public class ConditionalOnEnabledEndpointTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
|
||||
|
||||
Reference in New Issue
Block a user