Skip to content

Commit be8f538

Browse files
committed
Merge pull request #47637 from jonatan-ivanov
* pr/47637: Add support for @ObservationKeyValue Closes gh-47637
2 parents 69ca0e1 + c3962e1 commit be8f538

File tree

2 files changed

+42
-10
lines changed

2 files changed

+42
-10
lines changed

module/spring-boot-micrometer-observation/src/main/java/org/springframework/boot/micrometer/observation/autoconfigure/ObservationAutoConfiguration.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import io.micrometer.observation.ObservationHandler;
2323
import io.micrometer.observation.ObservationPredicate;
2424
import io.micrometer.observation.ObservationRegistry;
25+
import io.micrometer.observation.aop.ObservationKeyValueAnnotationHandler;
2526
import io.micrometer.observation.aop.ObservedAspect;
2627
import org.aspectj.weaver.Advice;
2728

29+
import org.springframework.beans.factory.BeanFactory;
2830
import org.springframework.beans.factory.ObjectProvider;
2931
import org.springframework.boot.autoconfigure.AutoConfiguration;
3032
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -87,8 +89,18 @@ static class ObservedAspectConfiguration {
8789

8890
@Bean
8991
@ConditionalOnMissingBean
90-
ObservedAspect observedAspect(ObservationRegistry observationRegistry) {
91-
return new ObservedAspect(observationRegistry);
92+
ObservedAspect observedAspect(ObservationRegistry observationRegistry,
93+
ObjectProvider<ObservationKeyValueAnnotationHandler> observationKeyValueAnnotationHandler) {
94+
ObservedAspect observedAspect = new ObservedAspect(observationRegistry);
95+
observationKeyValueAnnotationHandler.ifAvailable(observedAspect::setObservationKeyValueAnnotationHandler);
96+
return observedAspect;
97+
}
98+
99+
@Bean
100+
@ConditionalOnMissingBean
101+
ObservationKeyValueAnnotationHandler observationKeyValueAnnotationHandler(BeanFactory beanFactory,
102+
ValueExpressionResolver valueExpressionResolver) {
103+
return new ObservationKeyValueAnnotationHandler(beanFactory::getBean, (ignored) -> valueExpressionResolver);
92104
}
93105

94106
}

module/spring-boot-micrometer-observation/src/test/java/org/springframework/boot/micrometer/observation/autoconfigure/ObservationAutoConfigurationTests.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
import io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
2929
import io.micrometer.observation.ObservationPredicate;
3030
import io.micrometer.observation.ObservationRegistry;
31+
import io.micrometer.observation.aop.ObservationKeyValueAnnotationHandler;
3132
import io.micrometer.observation.aop.ObservedAspect;
3233
import org.aspectj.weaver.Advice;
3334
import org.junit.jupiter.api.Test;
3435

36+
import org.springframework.beans.factory.BeanFactory;
3537
import org.springframework.boot.autoconfigure.AutoConfigurations;
3638
import org.springframework.boot.test.context.FilteredClassLoader;
3739
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -61,36 +63,48 @@ void beansShouldNotBeSuppliedWhenMicrometerObservationIsNotOnClassPath() {
6163
this.contextRunner.withClassLoader(new FilteredClassLoader("io.micrometer.observation")).run((context) -> {
6264
assertThat(context).doesNotHaveBean(ObservationRegistry.class);
6365
assertThat(context).doesNotHaveBean(ObservedAspect.class);
66+
assertThat(context).doesNotHaveBean(ObservationKeyValueAnnotationHandler.class);
6467
});
6568
}
6669

6770
@Test
68-
void supplyObservationRegistry() {
71+
void supplyObservationRegistryAndAspect() {
6972
this.contextRunner.run((context) -> {
7073
ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class);
7174
Observation.start("test-observation", observationRegistry).stop();
7275
assertThat(context).hasSingleBean(ObservedAspect.class);
76+
assertThat(context).hasSingleBean(ObservationKeyValueAnnotationHandler.class);
77+
assertThat(context.getBean(ObservedAspect.class)).extracting("observationKeyValueAnnotationHandler")
78+
.isSameAs(context.getBean(ObservationKeyValueAnnotationHandler.class));
7379
});
7480
}
7581

7682
@Test
7783
void allowsObservedAspectToBeDisabled() {
78-
this.contextRunner.withClassLoader(new FilteredClassLoader(Advice.class))
79-
.run((context) -> assertThat(context).doesNotHaveBean(ObservedAspect.class));
84+
this.contextRunner.withClassLoader(new FilteredClassLoader(Advice.class)).run((context) -> {
85+
assertThat(context).doesNotHaveBean(ObservedAspect.class);
86+
assertThat(context).doesNotHaveBean(ObservationKeyValueAnnotationHandler.class);
87+
});
8088
}
8189

8290
@Test
8391
void allowsObservedAspectToBeDisabledWithProperty() {
84-
this.contextRunner.withPropertyValues("management.observations.annotations.enabled=false")
85-
.run((context) -> assertThat(context).doesNotHaveBean(ObservedAspect.class));
92+
this.contextRunner.withPropertyValues("management.observations.annotations.enabled=false").run((context) -> {
93+
assertThat(context).doesNotHaveBean(ObservedAspect.class);
94+
assertThat(context).doesNotHaveBean(ObservationKeyValueAnnotationHandler.class);
95+
});
8696
}
8797

8898
@Test
8999
void allowsObservedAspectToBeCustomized() {
90-
this.contextRunner.withUserConfiguration(CustomObservedAspectConfiguration.class)
91-
.run((context) -> assertThat(context).hasSingleBean(ObservedAspect.class)
100+
this.contextRunner.withUserConfiguration(CustomObservedAspectConfiguration.class).run((context) -> {
101+
assertThat(context).hasSingleBean(ObservedAspect.class)
92102
.getBean(ObservedAspect.class)
93-
.isSameAs(context.getBean("customObservedAspect")));
103+
.isSameAs(context.getBean("customObservedAspect"));
104+
assertThat(context).hasSingleBean(ObservationKeyValueAnnotationHandler.class)
105+
.getBean(ObservationKeyValueAnnotationHandler.class)
106+
.isSameAs(context.getBean("customObservationKeyValueAnnotationHandler"));
107+
});
94108
}
95109

96110
@Test
@@ -216,6 +230,12 @@ ObservedAspect customObservedAspect(ObservationRegistry observationRegistry) {
216230
return new ObservedAspect(observationRegistry);
217231
}
218232

233+
@Bean
234+
ObservationKeyValueAnnotationHandler customObservationKeyValueAnnotationHandler(BeanFactory beanFactory,
235+
ValueExpressionResolver valueExpressionResolver) {
236+
return new ObservationKeyValueAnnotationHandler(beanFactory::getBean, (ignored) -> valueExpressionResolver);
237+
}
238+
219239
}
220240

221241
@Configuration(proxyBeanMethods = false)

0 commit comments

Comments
 (0)