diff --git a/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/ExampleConfiguration.java b/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/ExampleConfiguration.java new file mode 100644 index 0000000000..cd3a9e6395 --- /dev/null +++ b/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/ExampleConfiguration.java @@ -0,0 +1,57 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.example.jaeger; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import java.util.concurrent.TimeUnit; + +/** + * All SDK management takes place here, away from the instrumentation code, which should only access + * the OpenTelemetry APIs. + */ +class ExampleConfiguration { + + /** + * Initialize an OpenTelemetry SDK with a Jaeger exporter and a SimpleSpanProcessor. + * + * @param jaegerHost The host of your Jaeger instance. + * @param jaegerPort the port of your Jaeger instance. + * @return A ready-to-use {@link OpenTelemetry} instance. + */ + static OpenTelemetry initOpenTelemetry(String jaegerHost, int jaegerPort) { + // Create a channel towards Jaeger end point + ManagedChannel jaegerChannel = + ManagedChannelBuilder.forAddress(jaegerHost, jaegerPort).usePlaintext().build(); + // Export traces to Jaeger + JaegerGrpcSpanExporter jaegerExporter = + JaegerGrpcSpanExporter.builder() + .setServiceName("otel-jaeger-example") + .setChannel(jaegerChannel) + .setTimeout(30, TimeUnit.SECONDS) + .build(); + + // Set to process the spans by the Jaeger Exporter + OpenTelemetrySdk openTelemetry = + OpenTelemetrySdk.builder() + .setTracerProvider( + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter)) + .build()) + .build(); + + // it's always a good idea to shut down the SDK cleanly at JVM exit. + Runtime.getRuntime() + .addShutdownHook(new Thread(() -> openTelemetry.getTracerManagement().shutdown())); + + return openTelemetry; + } +} diff --git a/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/JaegerExample.java b/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/JaegerExample.java index a017c3fa83..34d779b919 100644 --- a/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/JaegerExample.java +++ b/examples/jaeger/src/main/java/io/opentelemetry/example/jaeger/JaegerExample.java @@ -1,48 +1,15 @@ package io.opentelemetry.example.jaeger; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.trace.SdkTracerManagement; -import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; -import java.util.concurrent.TimeUnit; public class JaegerExample { - // OTel API - private final SdkTracerManagement sdkTracerManagement; private final Tracer tracer; - public JaegerExample(String ip, int port) { - OpenTelemetrySdk sdk = initOpenTelemetry(ip, port); - this.sdkTracerManagement = sdk.getTracerManagement(); - tracer = sdk.getTracer("io.opentelemetry.example.JaegerExample"); - } - - private OpenTelemetrySdk initOpenTelemetry(String ip, int port) { - // Create a channel towards Jaeger end point - ManagedChannel jaegerChannel = - ManagedChannelBuilder.forAddress(ip, port).usePlaintext().build(); - // Export traces to Jaeger - // Export traces to Jaeger - JaegerGrpcSpanExporter jaegerExporter = - JaegerGrpcSpanExporter.builder() - .setServiceName("otel-jaeger-example") - .setChannel(jaegerChannel) - .setTimeout(30, TimeUnit.SECONDS) - .build(); - - // Set to process the spans by the Jaeger Exporter - return OpenTelemetrySdk.builder() - .setTracerProvider( - SdkTracerProvider.builder() - .addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter)) - .build()) - .build(); + public JaegerExample(OpenTelemetry openTelemetry) { + tracer = openTelemetry.getTracer("io.opentelemetry.example.JaegerExample"); } private void myWonderfulUseCase() { @@ -63,33 +30,26 @@ public class JaegerExample { } } - // graceful shutdown - public void shutdown() { - // note: this doesn't wait for everything to get cleaned up. We need an SDK update to enable - // that. - sdkTracerManagement.shutdown(); - } - public static void main(String[] args) { // Parsing the input if (args.length < 2) { System.out.println("Missing [hostname] [port]"); System.exit(1); } - String ip = args[0]; - int port = Integer.parseInt(args[1]); + String jaegerHostName = args[0]; + int jaegerPort = Integer.parseInt(args[1]); + + // it is important to initialize your SDK as early as possible in your application's lifecycle + OpenTelemetry openTelemetry = + ExampleConfiguration.initOpenTelemetry(jaegerHostName, jaegerPort); // Start the example - JaegerExample example = new JaegerExample(ip, port); - example.initOpenTelemetry(ip, port); + JaegerExample example = new JaegerExample(openTelemetry); // generate a few sample spans for (int i = 0; i < 10; i++) { example.myWonderfulUseCase(); } - // Shutdown example - example.shutdown(); - System.out.println("Bye"); } }