Update the grpc example to more carefully match our best practices (#2538)

This commit is contained in:
John Watson 2021-01-15 10:35:26 -08:00 committed by GitHub
parent 41a298c848
commit 13f9d3169e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 57 deletions

View File

@ -6,12 +6,12 @@ description = 'OpenTelemetry Examples for gRPC'
ext.moduleName = "io.opentelemetry.examples.grpc"
dependencies {
compile "io.opentelemetry:opentelemetry-api"
compile "io.opentelemetry:opentelemetry-sdk"
compile "io.opentelemetry:opentelemetry-exporter-logging"
compile "io.grpc:grpc-protobuf"
compile "io.grpc:grpc-stub"
compile "io.grpc:grpc-netty-shaded"
implementation "io.opentelemetry:opentelemetry-api"
implementation "io.opentelemetry:opentelemetry-sdk"
implementation "io.opentelemetry:opentelemetry-exporter-logging"
implementation "io.grpc:grpc-protobuf"
implementation "io.grpc:grpc-stub"
implementation "io.grpc:grpc-netty-shaded"
if (JavaVersion.current().isJava9Compatible()) {
// Workaround for @javax.annotation.Generated

View File

@ -0,0 +1,45 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.example.grpc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
class ExampleConfiguration {
static OpenTelemetry initOpenTelemetry() {
// Set to process the spans with the LoggingSpanExporter
LoggingSpanExporter exporter = new LoggingSpanExporter();
SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(exporter)).build();
OpenTelemetrySdk openTelemetrySdk =
OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
// install the W3C Trace Context propagator
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.build();
// it's always a good idea to shutdown the SDK when your process exits.
Runtime.getRuntime()
.addShutdownHook(
new Thread(
() -> {
System.err.println(
"*** forcing the Span Exporter to shutdown and process the remaining spans");
openTelemetrySdk.getTracerManagement().shutdown();
System.err.println("*** Trace Exporter shut down");
}));
return openTelemetrySdk;
}
}

View File

@ -20,15 +20,9 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -40,14 +34,18 @@ public class HelloWorldClient {
private final Integer serverPort;
private final GreeterGrpc.GreeterBlockingStub blockingStub;
private static final OpenTelemetry openTelemetry = initOpenTelemetry();
// it is important to initialize the OpenTelemetry SDK as early as possible in your application's
// lifecycle.
private static final OpenTelemetry openTelemetry = ExampleConfiguration.initOpenTelemetry();
// OTel API
private Tracer tracer = openTelemetry.getTracer("io.opentelemetry.example.HelloWorldClient");
// OTel Tracing API
private final Tracer tracer =
openTelemetry.getTracer("io.opentelemetry.example.HelloWorldClient");
// Share context via text headers
private TextMapPropagator textFormat = openTelemetry.getPropagators().getTextMapPropagator();
private final TextMapPropagator textFormat =
openTelemetry.getPropagators().getTextMapPropagator();
// Inject context into the gRPC request metadata
private TextMapPropagator.Setter<Metadata> setter =
private final TextMapPropagator.Setter<Metadata> setter =
(carrier, key, value) ->
carrier.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value);
@ -116,20 +114,6 @@ public class HelloWorldClient {
}
}
private static OpenTelemetry initOpenTelemetry() {
// install the W3C Trace Context propagator
// Get the tracer management instance
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
// Set to process the the spans by the LogExporter
LoggingSpanExporter exporter = new LoggingSpanExporter();
sdkTracerProvider.addSpanProcessor(SimpleSpanProcessor.builder(exporter).build());
return OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.build();
}
/**
* Greet server. If provided, the first element of {@code args} is the name to use in the
* greeting.
@ -138,12 +122,14 @@ public class HelloWorldClient {
// Access a service running on the local machine on port 50051
HelloWorldClient client = new HelloWorldClient("localhost", 50051);
try {
String user = "world";
String user = "World";
// Use the arg as the name to greet if provided
if (args.length > 0) {
user = args[0];
}
client.greet(user);
for (int i = 0; i < 10; i++) {
client.greet(user + " " + i);
}
} finally {
client.shutdown();
}

View File

@ -17,15 +17,9 @@ import io.grpc.stub.StreamObserver;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.logging.Logger;
@ -35,8 +29,10 @@ public class HelloWorldServer {
private static final Logger logger = Logger.getLogger(HelloWorldServer.class.getName());
private static final int PORT = 50051;
private static final LoggingSpanExporter exporter = new LoggingSpanExporter();
private static final OpenTelemetry openTelemetry = initOpenTelemetry(exporter);
// it is important to initialize the OpenTelemetry SDK as early as possible in your application's
// lifecycle.
private static final OpenTelemetry openTelemetry = ExampleConfiguration.initOpenTelemetry();
private Server server;
@ -82,10 +78,6 @@ public class HelloWorldServer {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
HelloWorldServer.this.stop();
System.err.println("*** server shut down");
System.err.println(
"*** forcing also the Tracer Exporter to shutdown and process the remaining traces");
exporter.shutdown();
System.err.println("*** Trace Exporter shut down");
}));
}
@ -166,18 +158,6 @@ public class HelloWorldServer {
}
}
private static OpenTelemetry initOpenTelemetry(LoggingSpanExporter exporter) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
// Set to process the the spans by the LogExporter
sdkTracerProvider.addSpanProcessor(SimpleSpanProcessor.builder(exporter).build());
return OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
// install the W3C Trace Context propagator
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.build();
}
/** Main launches the server from the command line. */
public static void main(String[] args) throws IOException, InterruptedException {
final HelloWorldServer server = new HelloWorldServer();