Skip to content

Commit f90cecc

Browse files
committed
Add Kotlin observation interceptor with order
Fixes gh-221
1 parent 08ffc32 commit f90cecc

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerObservationAutoConfiguration.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2121
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2222
import org.springframework.context.annotation.Bean;
23+
import org.springframework.context.annotation.Configuration;
24+
import org.springframework.core.annotation.Order;
2325
import org.springframework.grpc.server.GlobalServerInterceptor;
2426

2527
import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor;
28+
import io.micrometer.core.instrument.kotlin.ObservationCoroutineContextServerInterceptor;
2629
import io.micrometer.observation.ObservationRegistry;
2730

2831
@AutoConfiguration(
@@ -34,9 +37,24 @@
3437
public class GrpcServerObservationAutoConfiguration {
3538

3639
@Bean
40+
@Order(0)
3741
@GlobalServerInterceptor
3842
ObservationGrpcServerInterceptor observationGrpcServerInterceptor(ObservationRegistry observationRegistry) {
3943
return new ObservationGrpcServerInterceptor(observationRegistry);
4044
}
4145

46+
@Configuration(proxyBeanMethods = false)
47+
@ConditionalOnClass(name = "io.grpc.kotlin.AbstractCoroutineStub")
48+
static class GrpcServerCoroutineStubConfiguration {
49+
50+
@Bean
51+
@Order(10)
52+
@GlobalServerInterceptor
53+
ObservationCoroutineContextServerInterceptor observationCoroutineGrpcServerInterceptor(
54+
ObservationRegistry observationRegistry) {
55+
return new ObservationCoroutineContextServerInterceptor(observationRegistry);
56+
}
57+
58+
}
59+
4260
}

spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerObservationAutoConfigurationTests.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,19 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.stream.Collectors;
24+
2125
import org.assertj.core.api.Condition;
2226
import org.junit.jupiter.api.Test;
2327
import org.mockito.Mockito;
24-
2528
import org.springframework.boot.autoconfigure.AutoConfigurations;
2629
import org.springframework.boot.test.context.FilteredClassLoader;
2730
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2831
import org.springframework.grpc.server.GlobalServerInterceptor;
2932

33+
import io.grpc.ServerInterceptor;
3034
import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor;
3135
import io.micrometer.observation.ObservationRegistry;
3236

@@ -102,8 +106,13 @@ void whenServerEnabledPropertySetTrueThenAutoConfigurationIsNotSkipped() {
102106
void whenAllConditionsAreMetThenInterceptorConfiguredAsExpected() {
103107
this.validContextRunner()
104108
.run((context) -> assertThat(context).hasSingleBean(ObservationGrpcServerInterceptor.class)
105-
.has(new Condition<>(beans -> beans.getBeansWithAnnotation(GlobalServerInterceptor.class).size() == 1,
106-
"One global interceptor expected")));
109+
.has(new Condition<>(beans -> {
110+
Map<String, Object> annotated = beans.getBeansWithAnnotation(GlobalServerInterceptor.class);
111+
List<ServerInterceptor> interceptors = beans.getBeanProvider(ServerInterceptor.class)
112+
.orderedStream()
113+
.collect(Collectors.toList());
114+
return annotated.size() == 2 && interceptors.get(0) instanceof ObservationGrpcServerInterceptor;
115+
}, "Two global interceptors expected")));
107116
}
108117

109118
}

0 commit comments

Comments
 (0)