Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions spring-grpc-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,19 @@
<artifactId>grpc-stub</artifactId>
</dependency>

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>


</dependencies>


Expand Down
8 changes: 8 additions & 0 deletions spring-grpc-dependencies/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
<grpc.version>1.63.2</grpc.version>
<protobuf-java.version>3.25.5</protobuf-java.version>
<google-common-protos.version>2.46.0</google-common-protos.version>
<micrometer.version>1.13.6</micrometer.version>
</properties>

<dependencyManagement>
Expand Down Expand Up @@ -112,6 +113,13 @@
<artifactId>proto-google-common-protos</artifactId>
<version>${google-common-protos.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-bom</artifactId>
<version>${micrometer.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.springframework.grpc.autoconfigure.server;

import io.grpc.ServerBuilder;
import io.grpc.ServerInterceptor;
import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.grpc.server.ServerBuilderCustomizer;

@AutoConfiguration
@ConditionalOnClass(ObservationGrpcServerInterceptor.class)
@ConditionalOnBean(ObservationRegistry.class)
public class GrpcServerMetricAutoConfiguration {

@Bean
public ServerInterceptor observationGrpcServerInterceptor(ObservationRegistry observationRegistry) {
return new ObservationGrpcServerInterceptor(observationRegistry);
}

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

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.springframework.grpc.autoconfigure.server;

import io.grpc.ServerBuilder;
import io.grpc.ServerInterceptor;
import io.micrometer.core.instrument.binder.grpc.ObservationGrpcServerInterceptor;
import io.micrometer.observation.ObservationRegistry;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.grpc.server.ServerBuilderCustomizer;

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

class GrpcServerMetricAutoConfigurationTests {

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(GrpcServerMetricAutoConfiguration.class));

@Test
void whenObservationRegistryNotProvided_thenMetricsInterceptorNotConfigured() {
this.contextRunner.run(context -> {
assertThat(context).doesNotHaveBean(ServerBuilderCustomizer.class);
});
}

@Test
void whenMetricsInterceptorConfigured_thenServerBuilderCustomizerConfigured() {
this.contextRunner.withBean(ObservationRegistry.class, ObservationRegistry::create).run(context -> {
assertThat(context).hasSingleBean(ServerBuilderCustomizer.class);
assertThat(context).hasSingleBean(ServerInterceptor.class);
ServerInterceptor interceptor = context.getBean(ServerInterceptor.class);
ServerBuilderCustomizer customizer = context.getBean(ServerBuilderCustomizer.class);
ServerBuilder<?> builder = org.mockito.Mockito.mock(ServerBuilder.class);
customizer.customize(builder);
org.mockito.Mockito.verify(builder, org.mockito.Mockito.times(1)).intercept(interceptor);
});
}

}