Skip to content

Commit 135fa4e

Browse files
committed
#1: Autoconfigure metric registry support
- format fix Signed-off-by: Sunny <hmtang@gmail.com> [resolves #1]
1 parent 504e2e3 commit 135fa4e

File tree

3 files changed

+82
-83
lines changed

3 files changed

+82
-83
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
@ConditionalOnBean(ObservationRegistry.class)
1616
public class GrpcServerMetricAutoConfiguration {
1717

18-
@Bean
19-
public ServerInterceptor observationGrpcServerInterceptor(ObservationRegistry observationRegistry) {
20-
return new ObservationGrpcServerInterceptor(observationRegistry);
21-
}
18+
@Bean
19+
public ServerInterceptor observationGrpcServerInterceptor(ObservationRegistry observationRegistry) {
20+
return new ObservationGrpcServerInterceptor(observationRegistry);
21+
}
22+
23+
@Bean
24+
<T extends ServerBuilder<T>> ServerBuilderCustomizer<T> metricsInterceptor(
25+
ServerInterceptor observationGrpcServerInterceptor) {
26+
return (serverBuilder) -> serverBuilder.intercept(observationGrpcServerInterceptor);
27+
}
2228

23-
@Bean
24-
<T extends ServerBuilder<T>> ServerBuilderCustomizer<T> metricsInterceptor(ServerInterceptor observationGrpcServerInterceptor) {
25-
return (serverBuilder) -> serverBuilder.intercept(observationGrpcServerInterceptor);
26-
}
2729
}

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

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ private ApplicationContextRunner contextRunner() {
6666
when(service.bindService()).thenReturn(serviceDefinition);
6767
// NOTE: we use noop server lifecycle to avoid startup
6868
return new ApplicationContextRunner()
69-
.withConfiguration(AutoConfigurations.of(GrpcServerAutoConfiguration.class,
70-
GrpcServerFactoryAutoConfiguration.class, SslAutoConfiguration.class))
71-
.withBean("noopServerLifecycle", GrpcServerLifecycle.class, Mockito::mock)
72-
.withBean(BindableService.class, () -> service);
69+
.withConfiguration(AutoConfigurations.of(GrpcServerAutoConfiguration.class,
70+
GrpcServerFactoryAutoConfiguration.class, SslAutoConfiguration.class))
71+
.withBean("noopServerLifecycle", GrpcServerLifecycle.class, Mockito::mock)
72+
.withBean(BindableService.class, () -> service);
7373
}
7474

7575
private ApplicationContextRunner contextRunnerWithLifecyle() {
@@ -78,78 +78,78 @@ private ApplicationContextRunner contextRunnerWithLifecyle() {
7878
when(service.bindService()).thenReturn(serviceDefinition);
7979
// NOTE: we use noop server lifecycle to avoid startup
8080
return new ApplicationContextRunner()
81-
.withConfiguration(AutoConfigurations.of(GrpcServerAutoConfiguration.class,
82-
GrpcServerFactoryAutoConfiguration.class, SslAutoConfiguration.class))
83-
.withBean(BindableService.class, () -> service);
81+
.withConfiguration(AutoConfigurations.of(GrpcServerAutoConfiguration.class,
82+
GrpcServerFactoryAutoConfiguration.class, SslAutoConfiguration.class))
83+
.withBean(BindableService.class, () -> service);
8484
}
8585

8686
@Test
8787
void whenGrpcNotOnClasspathAutoConfigurationIsSkipped() {
8888
this.contextRunner()
89-
.withClassLoader(new FilteredClassLoader(BindableService.class))
90-
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerAutoConfiguration.class));
89+
.withClassLoader(new FilteredClassLoader(BindableService.class))
90+
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerAutoConfiguration.class));
9191
}
9292

9393
@Test
9494
void whenNoBindableServicesRegisteredAutoConfigurationIsSkipped() {
9595
new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(GrpcServerAutoConfiguration.class))
96-
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerAutoConfiguration.class));
96+
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerAutoConfiguration.class));
9797
}
9898

9999
@Test
100100
void whenHasUserDefinedServerLifecycleDoesNotAutoConfigureBean() {
101101
GrpcServerLifecycle customServerLifecycle = mock(GrpcServerLifecycle.class);
102102
this.contextRunnerWithLifecyle()
103-
.withBean("customServerLifecycle", GrpcServerLifecycle.class, () -> customServerLifecycle)
104-
.run((context) -> assertThat(context).getBean(GrpcServerLifecycle.class).isSameAs(customServerLifecycle));
103+
.withBean("customServerLifecycle", GrpcServerLifecycle.class, () -> customServerLifecycle)
104+
.run((context) -> assertThat(context).getBean(GrpcServerLifecycle.class).isSameAs(customServerLifecycle));
105105
}
106106

107107
@Test
108108
void serverLifecycleAutoConfiguredAsExpected() {
109109
this.contextRunnerWithLifecyle()
110-
.run((context) -> assertThat(context).getBean(GrpcServerLifecycle.class)
111-
.hasFieldOrPropertyWithValue("factory", context.getBean(GrpcServerFactory.class)));
110+
.run((context) -> assertThat(context).getBean(GrpcServerLifecycle.class)
111+
.hasFieldOrPropertyWithValue("factory", context.getBean(GrpcServerFactory.class)));
112112
}
113113

114114
@Test
115115
void whenHasUserDefinedServerBuilderCustomizersDoesNotAutoConfigureBean() {
116116
ServerBuilderCustomizers customCustomizers = mock(ServerBuilderCustomizers.class);
117117
this.contextRunner()
118-
.withBean("customCustomizers", ServerBuilderCustomizers.class, () -> customCustomizers)
119-
.run((context) -> assertThat(context).getBean(ServerBuilderCustomizers.class).isSameAs(customCustomizers));
118+
.withBean("customCustomizers", ServerBuilderCustomizers.class, () -> customCustomizers)
119+
.run((context) -> assertThat(context).getBean(ServerBuilderCustomizers.class).isSameAs(customCustomizers));
120120
}
121121

122122
@Test
123123
void serverBuilderCustomizersAutoConfiguredAsExpected() {
124124
this.contextRunner()
125-
.withUserConfiguration(ServerBuilderCustomizersConfig.class)
126-
.run((context) -> assertThat(context).getBean(ServerBuilderCustomizers.class)
127-
.extracting("customizers", InstanceOfAssertFactories.list(ServerBuilderCustomizer.class))
128-
.contains(ServerBuilderCustomizersConfig.CUSTOMIZER_BAR,
129-
ServerBuilderCustomizersConfig.CUSTOMIZER_FOO));
125+
.withUserConfiguration(ServerBuilderCustomizersConfig.class)
126+
.run((context) -> assertThat(context).getBean(ServerBuilderCustomizers.class)
127+
.extracting("customizers", InstanceOfAssertFactories.list(ServerBuilderCustomizer.class))
128+
.contains(ServerBuilderCustomizersConfig.CUSTOMIZER_BAR,
129+
ServerBuilderCustomizersConfig.CUSTOMIZER_FOO));
130130
}
131131

132132
@Test
133133
void whenHasUserDefinedServerFactoryDoesNotAutoConfigureBean() {
134134
GrpcServerFactory customServerFactory = mock(GrpcServerFactory.class);
135135
this.contextRunner()
136-
.withBean("customServerFactory", GrpcServerFactory.class, () -> customServerFactory)
137-
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class).isSameAs(customServerFactory));
136+
.withBean("customServerFactory", GrpcServerFactory.class, () -> customServerFactory)
137+
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class).isSameAs(customServerFactory));
138138
}
139139

140140
@Test
141141
void whenShadedAndNonShadedNettyOnClasspathShadedNettyFactoryIsAutoConfigured() {
142142
this.contextRunner()
143-
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
144-
.isInstanceOf(ShadedNettyGrpcServerFactory.class));
143+
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
144+
.isInstanceOf(ShadedNettyGrpcServerFactory.class));
145145
}
146146

147147
@Test
148148
void whenOnlyNonShadedNettyOnClasspathNonShadedNettyFactoryIsAutoConfigured() {
149149
this.contextRunner()
150-
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class))
151-
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
152-
.isInstanceOf(NettyGrpcServerFactory.class));
150+
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class))
151+
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
152+
.isInstanceOf(NettyGrpcServerFactory.class));
153153
}
154154

155155
@Test
@@ -160,29 +160,29 @@ void shadedNettyServerFactoryAutoConfiguredAsExpected() {
160160
@Test
161161
void nettyServerFactoryAutoConfiguredAsExpected() {
162162
serverFactoryAutoConfiguredAsExpected(this.contextRunner()
163-
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
163+
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
164164
NettyGrpcServerFactory.class);
165165
}
166166

167167
@Test
168168
void noServerFactoryAutoConfiguredAsExpected() {
169169
this.contextRunner()
170-
.withClassLoader(new FilteredClassLoader(NettyServerBuilder.class,
171-
io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class))
172-
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerFactory.class));
170+
.withClassLoader(new FilteredClassLoader(NettyServerBuilder.class,
171+
io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class))
172+
.run((context) -> assertThat(context).doesNotHaveBean(GrpcServerFactory.class));
173173
}
174174

175175
private void serverFactoryAutoConfiguredAsExpected(ApplicationContextRunner contextRunner,
176-
Class<?> expectedServerFactoryType) {
176+
Class<?> expectedServerFactoryType) {
177177
contextRunner.withPropertyValues("spring.grpc.server.host=myhost", "spring.grpc.server.port=6160")
178-
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
179-
.isInstanceOf(expectedServerFactoryType)
180-
.hasFieldOrPropertyWithValue("address", "myhost:6160")
181-
.extracting("serviceList", InstanceOfAssertFactories.list(ServerServiceDefinition.class))
182-
.singleElement()
183-
.extracting(ServerServiceDefinition::getServiceDescriptor)
184-
.extracting(ServiceDescriptor::getName)
185-
.isEqualTo("my-service"));
178+
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
179+
.isInstanceOf(expectedServerFactoryType)
180+
.hasFieldOrPropertyWithValue("address", "myhost:6160")
181+
.extracting("serviceList", InstanceOfAssertFactories.list(ServerServiceDefinition.class))
182+
.singleElement()
183+
.extracting(ServerServiceDefinition::getServiceDescriptor)
184+
.extracting(ServiceDescriptor::getName)
185+
.isEqualTo("my-service"));
186186
}
187187

188188
@Test
@@ -202,11 +202,11 @@ void nettyServerFactoryAutoConfiguredWithCustomizers() {
202202
// real world.
203203
try (MockedStatic<Grpc> serverBuilderForPort = Mockito.mockStatic(Grpc.class)) {
204204
serverBuilderForPort.when(() -> Grpc.newServerBuilderForPort(anyInt(), any()))
205-
.thenAnswer((Answer<NettyServerBuilder>) invocation -> NettyServerBuilder
206-
.forPort(invocation.getArgument(0)));
205+
.thenAnswer((Answer<NettyServerBuilder>) invocation -> NettyServerBuilder
206+
.forPort(invocation.getArgument(0)));
207207
NettyServerBuilder builder = mock();
208208
serverFactoryAutoConfiguredWithCustomizers(this.contextRunnerWithLifecyle()
209-
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
209+
.withClassLoader(new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
210210
builder, NettyGrpcServerFactory.class);
211211
}
212212
}
@@ -219,30 +219,30 @@ private <T extends ServerBuilder<T>> void serverFactoryAutoConfiguredWithCustomi
219219
ServerBuilderCustomizer<T> customizer2 = (serverBuilder) -> serverBuilder.keepAliveTime(50L, TimeUnit.SECONDS);
220220
ServerBuilderCustomizers customizers = new ServerBuilderCustomizers(List.of(customizer1, customizer2));
221221
contextRunner.withPropertyValues("spring.grpc.server.port=0", "spring.grpc.server.keep-alive.time=30s")
222-
.withBean("serverBuilderCustomizers", ServerBuilderCustomizers.class, () -> customizers)
223-
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
224-
.isInstanceOf(expectedServerFactoryType)
225-
.extracting("serverBuilderCustomizers", InstanceOfAssertFactories.list(ServerBuilderCustomizer.class))
226-
.satisfies((allCustomizers) -> {
227-
allCustomizers.forEach((c) -> c.customize(mockServerBuilder));
228-
InOrder ordered = inOrder(mockServerBuilder);
229-
ordered.verify(mockServerBuilder)
230-
.keepAliveTime(Duration.ofSeconds(30L).toNanos(), TimeUnit.NANOSECONDS);
231-
ordered.verify(mockServerBuilder).keepAliveTime(40L, TimeUnit.SECONDS);
232-
ordered.verify(mockServerBuilder).keepAliveTime(50L, TimeUnit.SECONDS);
233-
}));
222+
.withBean("serverBuilderCustomizers", ServerBuilderCustomizers.class, () -> customizers)
223+
.run((context) -> assertThat(context).getBean(GrpcServerFactory.class)
224+
.isInstanceOf(expectedServerFactoryType)
225+
.extracting("serverBuilderCustomizers", InstanceOfAssertFactories.list(ServerBuilderCustomizer.class))
226+
.satisfies((allCustomizers) -> {
227+
allCustomizers.forEach((c) -> c.customize(mockServerBuilder));
228+
InOrder ordered = inOrder(mockServerBuilder);
229+
ordered.verify(mockServerBuilder)
230+
.keepAliveTime(Duration.ofSeconds(30L).toNanos(), TimeUnit.NANOSECONDS);
231+
ordered.verify(mockServerBuilder).keepAliveTime(40L, TimeUnit.SECONDS);
232+
ordered.verify(mockServerBuilder).keepAliveTime(50L, TimeUnit.SECONDS);
233+
}));
234234
}
235235

236236
@Test
237237
void nettyServerFactoryAutoConfiguredWithSsl() {
238238
serverFactoryAutoConfiguredAsExpected(
239239
this.contextRunner()
240-
.withPropertyValues("spring.grpc.server.ssl.bundle=ssltest",
241-
"spring.ssl.bundle.jks.ssltest.keystore.location=classpath:test.jks",
242-
"spring.ssl.bundle.jks.ssltest.keystore.password=secret",
243-
"spring.ssl.bundle.jks.ssltest.key.password=password")
244-
.withClassLoader(
245-
new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
240+
.withPropertyValues("spring.grpc.server.ssl.bundle=ssltest",
241+
"spring.ssl.bundle.jks.ssltest.keystore.location=classpath:test.jks",
242+
"spring.ssl.bundle.jks.ssltest.keystore.password=secret",
243+
"spring.ssl.bundle.jks.ssltest.key.password=password")
244+
.withClassLoader(
245+
new FilteredClassLoader(io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder.class)),
246246
NettyGrpcServerFactory.class);
247247
}
248248

Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.springframework.grpc.autoconfigure.server;
22

3-
43
import io.grpc.ServerBuilder;
54
import io.grpc.ServerInterceptor;
65
import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor;
@@ -15,7 +14,7 @@
1514
class GrpcServerMetricAutoConfigurationTests {
1615

1716
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
18-
.withConfiguration(AutoConfigurations.of(GrpcServerMetricAutoConfiguration.class));
17+
.withConfiguration(AutoConfigurations.of(GrpcServerMetricAutoConfiguration.class));
1918

2019
@Test
2120
void whenObservationRegistryNotProvided_thenMetricsInterceptorNotConfigured() {
@@ -26,17 +25,15 @@ void whenObservationRegistryNotProvided_thenMetricsInterceptorNotConfigured() {
2625

2726
@Test
2827
void whenMetricsInterceptorConfigured_thenServerBuilderCustomizerConfigured() {
29-
this.contextRunner
30-
.withBean(ObservationRegistry.class, ObservationRegistry::create)
31-
.run(context -> {
32-
assertThat(context).hasSingleBean(ServerBuilderCustomizer.class);
33-
assertThat(context).hasSingleBean(ServerInterceptor.class);
34-
ServerInterceptor interceptor = context.getBean(ServerInterceptor.class);
35-
ServerBuilderCustomizer customizer = context.getBean(ServerBuilderCustomizer.class);
36-
ServerBuilder<?> builder = org.mockito.Mockito.mock(ServerBuilder.class);
37-
customizer.customize(builder);
38-
org.mockito.Mockito.verify(builder , org.mockito.Mockito.times(1)).intercept(interceptor);
39-
});
28+
this.contextRunner.withBean(ObservationRegistry.class, ObservationRegistry::create).run(context -> {
29+
assertThat(context).hasSingleBean(ServerBuilderCustomizer.class);
30+
assertThat(context).hasSingleBean(ServerInterceptor.class);
31+
ServerInterceptor interceptor = context.getBean(ServerInterceptor.class);
32+
ServerBuilderCustomizer customizer = context.getBean(ServerBuilderCustomizer.class);
33+
ServerBuilder<?> builder = org.mockito.Mockito.mock(ServerBuilder.class);
34+
customizer.customize(builder);
35+
org.mockito.Mockito.verify(builder, org.mockito.Mockito.times(1)).intercept(interceptor);
36+
});
4037
}
4138

4239
}

0 commit comments

Comments
 (0)