From 54daf671845cea329f1f2b33e37bf041d3cb8c64 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Mon, 19 May 2025 16:30:53 +0300 Subject: [PATCH] Add 'management.observations.annotations.enabled' support for ObservedAspectConfiguration Introduced conditions to control `ObservedAspect` bean creation based on `management.observations.annotations.enabled` and `micrometer.observations.annotations.enabled` properties Signed-off-by: Dmytro Nosan --- .../ObservationAutoConfiguration.java | 24 ++++++++++++++++++- .../ObservationAutoConfigurationTests.java | 19 ++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.java index b4d9760e86f7..cc0313d2d37f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,12 +39,15 @@ import org.springframework.boot.actuate.autoconfigure.tracing.MicrometerTracingAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -159,6 +162,7 @@ TracingAwareMeterObservationHandler tracingAwareMeterObserv @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Advice.class) + @Conditional(ObservationAnnotationsEnabledCondition.class) static class ObservedAspectConfiguration { @Bean @@ -169,4 +173,22 @@ ObservedAspect observedAspect(ObservationRegistry observationRegistry) { } + static final class ObservationAnnotationsEnabledCondition extends AnyNestedCondition { + + ObservationAnnotationsEnabledCondition() { + super(ConfigurationPhase.PARSE_CONFIGURATION); + } + + @ConditionalOnProperty(prefix = "micrometer.observations.annotations", name = "enabled", havingValue = "true") + static class MicrometerObservationsEnabledCondition { + + } + + @ConditionalOnProperty(prefix = "management.observations.annotations", name = "enabled", havingValue = "true") + static class ManagementObservationsEnabledCondition { + + } + + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfigurationTests.java index f2742c73f1ce..3df043e2da81 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,11 +66,13 @@ class ObservationAutoConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().with(MetricsRun.simple()) + .withPropertyValues("management.observations.annotations.enabled=true") .withClassLoader(new FilteredClassLoader("io.micrometer.tracing")) .withConfiguration(AutoConfigurations.of(ObservationAutoConfiguration.class)); private final ApplicationContextRunner tracingContextRunner = new ApplicationContextRunner() .with(MetricsRun.simple()) + .withPropertyValues("management.observations.annotations.enabled=true") .withUserConfiguration(TracerConfiguration.class) .withConfiguration(AutoConfigurations.of(ObservationAutoConfiguration.class)); @@ -141,6 +143,7 @@ void supplyMeterHandlerAndGroupingWhenMicrometerCoreAndTracingAreOnClassPath() { @Test void supplyMeterHandlerAndGroupingWhenMicrometerCoreAndTracingAreOnClassPathButThereIsNoTracer() { new ApplicationContextRunner().with(MetricsRun.simple()) + .withPropertyValues("management.observations.annotations.enabled=true") .withConfiguration(AutoConfigurations.of(ObservationAutoConfiguration.class)) .run((context) -> { ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class); @@ -181,6 +184,20 @@ void allowsObservedAspectToBeDisabled() { .run((context) -> assertThat(context).doesNotHaveBean(ObservedAspect.class)); } + @Test + void allowsObservedAspectToBeEnabledWithDeprecatedProperty() { + this.contextRunner + .withPropertyValues("management.observations.annotations.enabled=false", + "micrometer.observations.annotations.enabled=true") + .run((context) -> assertThat(context).hasSingleBean(ObservedAspect.class)); + } + + @Test + void allowsObservedAspectToBeDisabledWithProperty() { + this.contextRunner.withPropertyValues("management.observations.annotations.enabled=false") + .run((context) -> assertThat(context).doesNotHaveBean(ObservedAspect.class)); + } + @Test void allowsObservedAspectToBeCustomized() { this.contextRunner.withUserConfiguration(CustomObservedAspectConfiguration.class)