Skip to content

Commit b41547b

Browse files
committed
Add auto-configuration for ObservedAspect
This adds support for auto-configuring `ObservedAspect` when AspectJ is on the classpath, which enables the usage of `@Observed`.
1 parent cec1591 commit b41547b

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
import io.micrometer.observation.ObservationHandler;
2828
import io.micrometer.observation.ObservationPredicate;
2929
import io.micrometer.observation.ObservationRegistry;
30+
import io.micrometer.observation.aop.ObservedAspect;
3031
import io.micrometer.tracing.Tracer;
3132
import io.micrometer.tracing.handler.TracingAwareMeterObservationHandler;
3233
import io.micrometer.tracing.handler.TracingObservationHandler;
34+
import org.aspectj.weaver.Advice;
3335

3436
import org.springframework.beans.factory.ObjectProvider;
3537
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
@@ -50,6 +52,7 @@
5052
* @author Moritz Halbritter
5153
* @author Brian Clozel
5254
* @author Jonatan Ivanov
55+
* @author Vedran Pavic
5356
* @since 3.0.0
5457
*/
5558
@AutoConfiguration(after = { CompositeMeterRegistryAutoConfiguration.class, MicrometerTracingAutoConfiguration.class })
@@ -142,4 +145,16 @@ TracingAwareMeterObservationHandler<Observation.Context> tracingAwareMeterObserv
142145

143146
}
144147

148+
@Configuration(proxyBeanMethods = false)
149+
@ConditionalOnClass(Advice.class)
150+
static class ObservedAspectConfiguration {
151+
152+
@Bean
153+
@ConditionalOnMissingBean
154+
ObservedAspect observedAspect(ObservationRegistry observationRegistry) {
155+
return new ObservedAspect(observationRegistry);
156+
}
157+
158+
}
159+
145160
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfigurationTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@
3434
import io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
3535
import io.micrometer.observation.ObservationPredicate;
3636
import io.micrometer.observation.ObservationRegistry;
37+
import io.micrometer.observation.aop.ObservedAspect;
3738
import io.micrometer.tracing.Tracer;
3839
import io.micrometer.tracing.handler.TracingAwareMeterObservationHandler;
3940
import io.micrometer.tracing.handler.TracingObservationHandler;
41+
import org.aspectj.weaver.Advice;
4042
import org.junit.jupiter.api.Test;
4143
import org.mockito.Answers;
4244

@@ -58,6 +60,7 @@
5860
*
5961
* @author Moritz Halbritter
6062
* @author Jonatan Ivanov
63+
* @author Vedran Pavic
6164
*/
6265
class ObservationAutoConfigurationTests {
6366

@@ -77,6 +80,7 @@ void beansShouldNotBeSuppliedWhenMicrometerObservationIsNotOnClassPath() {
7780
assertThat(context).hasSingleBean(MeterRegistry.class);
7881
assertThat(context).doesNotHaveBean(ObservationRegistry.class);
7982
assertThat(context).doesNotHaveBean(ObservationHandler.class);
83+
assertThat(context).doesNotHaveBean(ObservedAspect.class);
8084
assertThat(context).doesNotHaveBean(ObservationHandlerGrouping.class);
8185
});
8286
}
@@ -88,6 +92,7 @@ void supplyObservationRegistryWhenMicrometerCoreAndTracingAreNotOnClassPath() {
8892
ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class);
8993
Observation.start("test-observation", observationRegistry).stop();
9094
assertThat(context).doesNotHaveBean(ObservationHandler.class);
95+
assertThat(context).hasSingleBean(ObservedAspect.class);
9196
assertThat(context).doesNotHaveBean(ObservationHandlerGrouping.class);
9297
});
9398
}
@@ -99,6 +104,7 @@ void supplyMeterHandlerAndGroupingWhenMicrometerCoreIsOnClassPathButTracingIsNot
99104
Observation.start("test-observation", observationRegistry).stop();
100105
assertThat(context).hasSingleBean(ObservationHandler.class);
101106
assertThat(context).hasSingleBean(DefaultMeterObservationHandler.class);
107+
assertThat(context).hasSingleBean(ObservedAspect.class);
102108
assertThat(context).hasSingleBean(ObservationHandlerGrouping.class);
103109
assertThat(context).hasBean("metricsObservationHandlerGrouping");
104110
});
@@ -110,6 +116,7 @@ void supplyOnlyTracingObservationHandlerGroupingWhenMicrometerCoreIsNotOnClassPa
110116
ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class);
111117
Observation.start("test-observation", observationRegistry).stop();
112118
assertThat(context).doesNotHaveBean(ObservationHandler.class);
119+
assertThat(context).hasSingleBean(ObservedAspect.class);
113120
assertThat(context).hasSingleBean(ObservationHandlerGrouping.class);
114121
assertThat(context).hasBean("tracingObservationHandlerGrouping");
115122
});
@@ -123,6 +130,7 @@ void supplyMeterHandlerAndGroupingWhenMicrometerCoreAndTracingAreOnClassPath() {
123130
// TracingAwareMeterObservationHandler that we don't test here
124131
Observation.start("test-observation", observationRegistry);
125132
assertThat(context).hasSingleBean(ObservationHandler.class);
133+
assertThat(context).hasSingleBean(ObservedAspect.class);
126134
assertThat(context).hasSingleBean(TracingAwareMeterObservationHandler.class);
127135
assertThat(context).hasSingleBean(ObservationHandlerGrouping.class);
128136
assertThat(context).hasBean("metricsAndTracingObservationHandlerGrouping");
@@ -138,6 +146,7 @@ void supplyMeterHandlerAndGroupingWhenMicrometerCoreAndTracingAreOnClassPathButT
138146
Observation.start("test-observation", observationRegistry).stop();
139147
assertThat(context).hasSingleBean(ObservationHandler.class);
140148
assertThat(context).hasSingleBean(DefaultMeterObservationHandler.class);
149+
assertThat(context).hasSingleBean(ObservedAspect.class);
141150
assertThat(context).hasSingleBean(ObservationHandlerGrouping.class);
142151
assertThat(context).hasBean("metricsAndTracingObservationHandlerGrouping");
143152
});
@@ -155,6 +164,7 @@ void autoConfiguresDefaultMeterObservationHandler() {
155164
assertThat(meterRegistry.get("test-observation").timer().count()).isOne();
156165
assertThat(context).hasSingleBean(DefaultMeterObservationHandler.class);
157166
assertThat(context).hasSingleBean(ObservationHandler.class);
167+
assertThat(context).hasSingleBean(ObservedAspect.class);
158168
});
159169
}
160170

@@ -164,6 +174,12 @@ void allowsDefaultMeterObservationHandlerToBeDisabled() {
164174
.run((context) -> assertThat(context).doesNotHaveBean(ObservationHandler.class));
165175
}
166176

177+
@Test
178+
void allowsObservedAspectToBeDisabled() {
179+
this.contextRunner.withClassLoader(new FilteredClassLoader(Advice.class))
180+
.run((context) -> assertThat(context).doesNotHaveBean(ObservedAspect.class));
181+
}
182+
167183
@Test
168184
void autoConfiguresObservationPredicates() {
169185
this.contextRunner.withUserConfiguration(ObservationPredicates.class).run((context) -> {

0 commit comments

Comments
 (0)