From ae0babec06c0528b8ae751b93bfdc52aeae93e36 Mon Sep 17 00:00:00 2001 From: Alexey Genus Date: Mon, 10 Nov 2025 16:43:35 +0100 Subject: [PATCH] Don't create observationCoroutineGrpcServerInterceptor bean when micrometer context-propagation isn't present on classpath Signed-off-by: Alexey Genus --- spring-grpc-server-spring-boot-autoconfigure/pom.xml | 5 +++++ .../GrpcServerObservationAutoConfiguration.java | 2 +- .../GrpcServerObservationAutoConfigurationTests.java | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-grpc-server-spring-boot-autoconfigure/pom.xml b/spring-grpc-server-spring-boot-autoconfigure/pom.xml index 780be95f..7e0fda78 100644 --- a/spring-grpc-server-spring-boot-autoconfigure/pom.xml +++ b/spring-grpc-server-spring-boot-autoconfigure/pom.xml @@ -142,6 +142,11 @@ micrometer-core true + + io.micrometer + context-propagation + true + io.netty netty-transport-native-epoll diff --git a/spring-grpc-server-spring-boot-autoconfigure/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfiguration.java b/spring-grpc-server-spring-boot-autoconfigure/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfiguration.java index c40c2728..8a026dc0 100644 --- a/spring-grpc-server-spring-boot-autoconfigure/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfiguration.java +++ b/spring-grpc-server-spring-boot-autoconfigure/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfiguration.java @@ -53,7 +53,7 @@ ObservationGrpcServerInterceptor observationGrpcServerInterceptor(ObservationReg } @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(name = "io.grpc.kotlin.AbstractCoroutineStub") + @ConditionalOnClass(name = { "io.grpc.kotlin.AbstractCoroutineStub", "io.micrometer.context.ContextRegistry" }) static class GrpcServerCoroutineStubConfiguration { @Bean diff --git a/spring-grpc-server-spring-boot-autoconfigure/src/test/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfigurationTests.java b/spring-grpc-server-spring-boot-autoconfigure/src/test/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfigurationTests.java index 38ee2825..5c5d112b 100644 --- a/spring-grpc-server-spring-boot-autoconfigure/src/test/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfigurationTests.java +++ b/spring-grpc-server-spring-boot-autoconfigure/src/test/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfigurationTests.java @@ -33,7 +33,9 @@ import io.grpc.BindableService; import io.grpc.ServerInterceptor; +import io.micrometer.context.ContextRegistry; import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor; +import io.micrometer.core.instrument.kotlin.ObservationCoroutineContextServerInterceptor; import io.micrometer.observation.ObservationRegistry; /** @@ -131,4 +133,12 @@ void whenAllConditionsAreMetThenInterceptorConfiguredAsExpected() { }, "Two global interceptors expected"))); } + @Test + void whenMicrometerContextPropagationIsNotOnClasspathCoroutineInterceptorIsNotCreated() { + this.validContextRunner() + .withClassLoader(new FilteredClassLoader(ContextRegistry.class)) + .run((context) -> assertThat(context).hasSingleBean(ObservationGrpcServerInterceptor.class) + .doesNotHaveBean(ObservationCoroutineContextServerInterceptor.class)); + } + }