From 41e9867bc4a57b022038883b846e261b6ab71d04 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 10 Jun 2022 10:10:58 +0200 Subject: [PATCH] Register all ObservationHandler, regardless which context they use Closes #31272 --- .../ObservationAutoConfiguration.java | 3 +- .../ObservationHandlerGrouping.java | 3 +- .../ObservationRegistryConfigurer.java | 5 +- .../ObservationRegistryPostProcessor.java | 5 +- ...OnlyMetricsObservationHandlerGrouping.java | 12 +++-- .../TracingObservationHandlerGrouping.java | 16 ++++--- .../ObservationAutoConfigurationTests.java | 48 +++++++++++++++++++ 7 files changed, 70 insertions(+), 22 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 f7d6971f35..cffddc20b7 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 @@ -17,7 +17,6 @@ package org.springframework.boot.actuate.autoconfigure.observation; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.Observation.GlobalKeyValuesProvider; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationPredicate; @@ -50,7 +49,7 @@ public class ObservationAutoConfiguration { ObjectProvider> observationRegistryCustomizers, ObjectProvider observationPredicates, ObjectProvider> keyValuesProviders, - ObjectProvider> observationHandlers, + ObjectProvider> observationHandlers, ObjectProvider observationHandlerGrouping) { return new ObservationRegistryPostProcessor(observationRegistryCustomizers, observationPredicates, keyValuesProviders, observationHandlers, observationHandlerGrouping); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationHandlerGrouping.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationHandlerGrouping.java index 5e6af1e2a1..e5713ec304 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationHandlerGrouping.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationHandlerGrouping.java @@ -18,7 +18,6 @@ package org.springframework.boot.actuate.autoconfigure.observation; import java.util.Collection; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationRegistry.ObservationConfig; @@ -35,6 +34,6 @@ interface ObservationHandlerGrouping { * @param handlers the list of observation handlers * @param config the config to apply the handlers to */ - void apply(Collection> handlers, ObservationConfig config); + void apply(Collection> handlers, ObservationConfig config); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryConfigurer.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryConfigurer.java index 227b31666d..965420a05d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryConfigurer.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryConfigurer.java @@ -18,7 +18,6 @@ package org.springframework.boot.actuate.autoconfigure.observation; import java.util.List; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.Observation.GlobalKeyValuesProvider; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationPredicate; @@ -45,14 +44,14 @@ class ObservationRegistryConfigurer { private final ObjectProvider> keyValuesProviders; - private final ObjectProvider> observationHandlers; + private final ObjectProvider> observationHandlers; private final ObjectProvider observationHandlerGrouping; ObservationRegistryConfigurer(ObjectProvider> customizers, ObjectProvider observationPredicates, ObjectProvider> keyValuesProviders, - ObjectProvider> observationHandlers, + ObjectProvider> observationHandlers, ObjectProvider observationHandlerGrouping) { this.customizers = customizers; this.observationPredicates = observationPredicates; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryPostProcessor.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryPostProcessor.java index 6918ae4614..3ea73d2deb 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryPostProcessor.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/ObservationRegistryPostProcessor.java @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.observation; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.Observation.GlobalKeyValuesProvider; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationPredicate; @@ -41,7 +40,7 @@ class ObservationRegistryPostProcessor implements BeanPostProcessor { private final ObjectProvider> keyValuesProviders; - private final ObjectProvider> observationHandlers; + private final ObjectProvider> observationHandlers; private final ObjectProvider observationHandlerGrouping; @@ -50,7 +49,7 @@ class ObservationRegistryPostProcessor implements BeanPostProcessor { ObservationRegistryPostProcessor(ObjectProvider> observationRegistryCustomizers, ObjectProvider observationPredicates, ObjectProvider> keyValuesProviders, - ObjectProvider> observationHandlers, + ObjectProvider> observationHandlers, ObjectProvider observationHandlerGrouping) { this.observationRegistryCustomizers = observationRegistryCustomizers; this.observationPredicates = observationPredicates; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/OnlyMetricsObservationHandlerGrouping.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/OnlyMetricsObservationHandlerGrouping.java index f16c39889d..9afd302403 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/OnlyMetricsObservationHandlerGrouping.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/OnlyMetricsObservationHandlerGrouping.java @@ -21,7 +21,6 @@ import java.util.Collection; import java.util.List; import io.micrometer.core.instrument.observation.MeterObservationHandler; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler; import io.micrometer.observation.ObservationRegistry.ObservationConfig; @@ -39,9 +38,10 @@ import io.micrometer.observation.ObservationRegistry.ObservationConfig; class OnlyMetricsObservationHandlerGrouping implements ObservationHandlerGrouping { @Override - public void apply(Collection> handlers, ObservationConfig config) { - List> meterObservationHandlers = new ArrayList<>(); - for (ObservationHandler handler : handlers) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void apply(Collection> handlers, ObservationConfig config) { + List> meterObservationHandlers = new ArrayList<>(); + for (ObservationHandler handler : handlers) { if (handler instanceof MeterObservationHandler) { meterObservationHandlers.add(handler); } @@ -50,8 +50,10 @@ class OnlyMetricsObservationHandlerGrouping implements ObservationHandlerGroupin } } + // The ugly raw casts can be removed once + // https://github.com/micrometer-metrics/tracing/issues/27 is resolved if (!meterObservationHandlers.isEmpty()) { - config.observationHandler(new FirstMatchingCompositeObservationHandler(meterObservationHandlers)); + config.observationHandler(new FirstMatchingCompositeObservationHandler((List) meterObservationHandlers)); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/TracingObservationHandlerGrouping.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/TracingObservationHandlerGrouping.java index f904b3ca8f..d03cb5165e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/TracingObservationHandlerGrouping.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/TracingObservationHandlerGrouping.java @@ -21,7 +21,6 @@ import java.util.Collection; import java.util.List; import io.micrometer.core.instrument.observation.MeterObservationHandler; -import io.micrometer.observation.Observation.Context; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler; import io.micrometer.observation.ObservationRegistry.ObservationConfig; @@ -42,10 +41,11 @@ import io.micrometer.tracing.handler.TracingObservationHandler; class TracingObservationHandlerGrouping implements ObservationHandlerGrouping { @Override - public void apply(Collection> handlers, ObservationConfig config) { - List> meterObservationHandlers = new ArrayList<>(); - List> tracingObservationHandlers = new ArrayList<>(); - for (ObservationHandler handler : handlers) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void apply(Collection> handlers, ObservationConfig config) { + List> meterObservationHandlers = new ArrayList<>(); + List> tracingObservationHandlers = new ArrayList<>(); + for (ObservationHandler handler : handlers) { if (handler instanceof MeterObservationHandler) { meterObservationHandlers.add(handler); } @@ -57,11 +57,13 @@ class TracingObservationHandlerGrouping implements ObservationHandlerGrouping { } } + // The ugly raw casts can be removed once + // https://github.com/micrometer-metrics/tracing/issues/27 is resolved if (!meterObservationHandlers.isEmpty()) { - config.observationHandler(new FirstMatchingCompositeObservationHandler(meterObservationHandlers)); + config.observationHandler(new FirstMatchingCompositeObservationHandler((List) meterObservationHandlers)); } if (!tracingObservationHandlers.isEmpty()) { - config.observationHandler(new FirstMatchingCompositeObservationHandler(tracingObservationHandlers)); + config.observationHandler(new FirstMatchingCompositeObservationHandler((List) tracingObservationHandlers)); } } 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 e5ca581f69..248c243de1 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 @@ -126,6 +126,19 @@ class ObservationAutoConfigurationTests { }); } + @Test + void autoConfiguresObservationHandlerWithCustomContext() { + this.contextRunner.withUserConfiguration(ObservationHandlerWithCustomContextConfiguration.class) + .run((context) -> { + ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class); + List> handlers = context.getBean(CalledHandlers.class).getCalledHandlers(); + CustomContext customContext = new CustomContext(); + Observation.start("test-observation", customContext, observationRegistry); + assertThat(handlers).hasSize(1); + assertThat(handlers.get(0)).isInstanceOf(ObservationHandlerWithCustomContext.class); + }); + } + @Test void autoConfiguresObservationHandlerWhenTracingIsActive() { this.tracingContextRunner.withUserConfiguration(ObservationHandlersTracing.class).run((context) -> { @@ -216,6 +229,17 @@ class ObservationAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + @Import(CalledHandlersConfiguration.class) + static class ObservationHandlerWithCustomContextConfiguration { + + @Bean + ObservationHandlerWithCustomContext observationHandlerWithCustomContext(CalledHandlers calledHandlers) { + return new ObservationHandlerWithCustomContext(calledHandlers); + } + + } + @Configuration(proxyBeanMethods = false) @Import(CalledHandlersConfiguration.class) static class ObservationHandlersTracing { @@ -298,6 +322,30 @@ class ObservationAutoConfigurationTests { } + private static class ObservationHandlerWithCustomContext implements ObservationHandler { + + private final CalledHandlers calledHandlers; + + ObservationHandlerWithCustomContext(CalledHandlers calledHandlers) { + this.calledHandlers = calledHandlers; + } + + @Override + public void onStart(CustomContext context) { + this.calledHandlers.onCalled(this); + } + + @Override + public boolean supportsContext(Context context) { + return context instanceof CustomContext; + } + + } + + private static class CustomContext extends Context { + + } + private static class CalledHandlers { private final List> calledHandlers = new ArrayList<>();