Skip to content

Commit 886db36

Browse files
committed
Server interceptor creating context with a key, and with Otel tracing enabled. To try repro b/416307660.
1 parent 80cc988 commit 886db36

File tree

2 files changed

+94
-35
lines changed

2 files changed

+94
-35
lines changed

examples/example-oauth/build.gradle

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
plugins {
22
// Provide convenience executables for trying out the examples.
33
id 'application'
4-
id 'com.google.protobuf' version '0.9.5'
4+
id 'com.google.protobuf' version '0.9.4'
55
// Generate IntelliJ IDEA's .idea & .iml project files
66
id 'idea'
77
}
@@ -21,16 +21,22 @@ java {
2121

2222
// Feel free to delete the comment at the next line. It is just for safely
2323
// updating the version in our release process.
24-
def grpcVersion = '1.73.0-SNAPSHOT' // CURRENT_GRPC_VERSION
24+
def grpcVersion = '1.72.0-SNAPSHOT' // CURRENT_GRPC_VERSION
2525
def protobufVersion = '3.25.5'
2626
def protocVersion = protobufVersion
27+
def openTelemetryVersion = '1.40.0'
28+
def openTelemetryPrometheusVersion = '1.40.0-alpha'
2729

2830
dependencies {
2931
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
3032
implementation "io.grpc:grpc-stub:${grpcVersion}"
3133
implementation "io.grpc:grpc-auth:${grpcVersion}"
3234
implementation "com.google.auth:google-auth-library-oauth2-http:1.23.0"
33-
35+
implementation "io.grpc:grpc-opentelemetry:${grpcVersion}"
36+
implementation "io.opentelemetry:opentelemetry-sdk:${openTelemetryVersion}"
37+
implementation "io.opentelemetry:opentelemetry-sdk-metrics:${openTelemetryVersion}"
38+
implementation "io.opentelemetry:opentelemetry-exporter-logging:${openTelemetryVersion}"
39+
implementation "io.opentelemetry:opentelemetry-exporter-prometheus:${openTelemetryPrometheusVersion}"
3440
compileOnly "org.apache.tomcat:annotations-api:6.0.53"
3541

3642
runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"
@@ -44,13 +50,23 @@ dependencies {
4450
protobuf {
4551
protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
4652
plugins {
47-
grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" }
53+
grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.72.0" }
4854
}
4955
generateProtoTasks {
5056
all()*.plugins { grpc {} }
5157
}
5258
}
5359

60+
// Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
61+
sourceSets {
62+
main {
63+
java {
64+
srcDirs 'build/generated/source/proto/main/grpc'
65+
srcDirs 'build/generated/source/proto/main/java'
66+
}
67+
}
68+
}
69+
5470
startScripts.enabled = false
5571

5672
task hellowWorldOauthServer(type: CreateStartScripts) {

examples/example-oauth/src/main/java/io/grpc/examples/oauth/AuthServer.java

Lines changed: 74 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 The gRPC Authors
2+
* Copyright 2024 The gRPC Authors
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,49 +19,39 @@
1919
import io.grpc.Grpc;
2020
import io.grpc.InsecureServerCredentials;
2121
import io.grpc.Server;
22+
import io.grpc.ServerBuilder;
2223
import io.grpc.examples.helloworld.GreeterGrpc;
2324
import io.grpc.examples.helloworld.HelloReply;
2425
import io.grpc.examples.helloworld.HelloRequest;
26+
import io.grpc.opentelemetry.GrpcOpenTelemetry;
2527
import io.grpc.stub.StreamObserver;
28+
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
29+
import io.opentelemetry.sdk.OpenTelemetrySdk;
30+
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
2631
import java.io.IOException;
32+
import java.util.concurrent.TimeUnit;
2733
import java.util.logging.Logger;
2834

2935
/**
30-
* Server that manages startup/shutdown of a {@code Greeter} server. This also uses a
31-
* {@link OAuth2ServerInterceptor} to intercept the OAuth2 token passed.
36+
* gRPC server that manages startup/shutdown of a {@code Greeter} server and generates
37+
* gRPC OpenTelemetry metrics data based on the configuration.
3238
*/
3339
public class AuthServer {
34-
3540
private static final Logger logger = Logger.getLogger(AuthServer.class.getName());
3641

3742
private Server server;
38-
private int port;
39-
40-
public AuthServer(int port) {
41-
this.port = port;
42-
}
43-
44-
private void start() throws IOException {
45-
server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
46-
.addService(new GreeterImpl())
47-
.intercept(new OAuth2ServerInterceptor())
48-
.build()
49-
.start();
43+
private void start(int port) throws IOException {
44+
ServerBuilder<?> serverBuilder = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
45+
.addService(new GreeterImpl());
46+
server = serverBuilder.intercept(new OAuth2ServerInterceptor())
47+
.build()
48+
.start();
5049
logger.info("Server started, listening on " + port);
51-
Runtime.getRuntime().addShutdownHook(new Thread() {
52-
@Override
53-
public void run() {
54-
// Use stderr here since the logger may have been reset by its JVM shutdown hook.
55-
System.err.println("*** shutting down gRPC server since JVM is shutting down");
56-
AuthServer.this.stop();
57-
System.err.println("*** server shut down");
58-
}
59-
});
6050
}
6151

62-
private void stop() {
52+
private void stop() throws InterruptedException {
6353
if (server != null) {
64-
server.shutdown();
54+
server.shutdown().awaitTermination(30, TimeUnit.SECONDS);
6555
}
6656
}
6757

@@ -78,19 +68,72 @@ private void blockUntilShutdown() throws InterruptedException {
7868
* Main launches the server from the command line.
7969
*/
8070
public static void main(String[] args) throws IOException, InterruptedException {
71+
// The port on which the server should run.
72+
int port = 50051;
73+
// The port on which prometheus metrics are exposed.
74+
int prometheusPort = 9464;
8175

82-
// The port on which the server should run
83-
int port = 50051; // default
8476
if (args.length > 0) {
77+
if ("--help".equals(args[0])) {
78+
System.err.println("Usage: [port [prometheus_port]]");
79+
System.err.println("");
80+
System.err.println(" port The port on which server will run. Defaults to " + port);
81+
System.err.println(" prometheusPort The port to expose prometheus metrics. Defaults to " + prometheusPort);
82+
System.exit(1);
83+
}
8584
port = Integer.parseInt(args[0]);
8685
}
86+
if (args.length > 1) {
87+
prometheusPort = Integer.parseInt(args[1]);
88+
}
89+
90+
// Adds a PrometheusHttpServer to convert OpenTelemetry metrics to Prometheus format and
91+
// expose these via a HttpServer exporter to the SdkMeterProvider.
92+
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
93+
.registerMetricReader(
94+
PrometheusHttpServer.builder().setPort(prometheusPort).build())
95+
.build();
96+
97+
// Initialize OpenTelemetry SDK with MeterProvider configured with Prometheus metrics exporter
98+
OpenTelemetrySdk openTelemetrySdk =
99+
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
100+
101+
// Initialize gRPC OpenTelemetry.
102+
// Following client metrics are enabled by default :
103+
// 1. grpc.server.call.started
104+
// 2. grpc.server.call.sent_total_compressed_message_size
105+
// 3. grpc.server.call.rcvd_total_compressed_message_size
106+
// 4. grpc.server.call.duration
107+
GrpcOpenTelemetry grpcOpenTelmetry = GrpcOpenTelemetry.newBuilder()
108+
.sdk(openTelemetrySdk)
109+
.build();
110+
// Registers gRPC OpenTelemetry globally.
111+
grpcOpenTelmetry.registerGlobal();
112+
113+
final AuthServer server = new AuthServer();
114+
server.start(port);
115+
116+
Runtime.getRuntime().addShutdownHook(new Thread() {
117+
@Override
118+
public void run() {
119+
System.err.println("*** shutting down gRPC server since JVM is shutting down");
120+
try {
121+
server.stop();
122+
} catch (InterruptedException e) {
123+
e.printStackTrace(System.err);
124+
}
125+
// Shut down OpenTelemetry SDK.
126+
openTelemetrySdk.close();
127+
128+
System.err.println("*** server shut down");
129+
}
130+
});
87131

88-
final AuthServer server = new AuthServer(port);
89-
server.start();
90132
server.blockUntilShutdown();
91133
}
92134

93135
static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
136+
94137
@Override
95138
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
96139
// get client id added to context by interceptor

0 commit comments

Comments
 (0)