diff --git a/examples/settings.gradle b/examples/settings.gradle index c66e61546d..6b395e4287 100644 --- a/examples/settings.gradle +++ b/examples/settings.gradle @@ -16,7 +16,8 @@ include ":opentelemetry-examples-grpc", ":opentelemetry-examples-http", ":opentelemetry-examples-jaeger", ":opentelemetry-examples-metrics", - ":opentelemetry-examples-sdk-usage" + ":opentelemetry-examples-sdk-usage", + ":opentelemetry-examples-zipkin" rootProject.children.each { it.projectDir = "$rootDir/" + it.name diff --git a/examples/zipkin/README.md b/examples/zipkin/README.md new file mode 100644 index 0000000000..672e496d03 --- /dev/null +++ b/examples/zipkin/README.md @@ -0,0 +1,32 @@ +# Zipkin Example + +This is a simple example that demonstrates how to use the OpenTelemetry SDK +to instrument a simple application using Zipkin as trace exporter. + +# How to run + +## Prerequisites +* Java 1.8.231 +* Docker 19.03 + +## 1 - Compile +```shell script +../gradlew fatJar +``` +## 2 - Run Zipkin + +```shell script +docker run --rm -it --name zipkin \ + -p 9411:9411 \ + openzipkin/zipkin:2.21 +``` + +## 3 - Start the Application +```shell script +java -cp build/libs/opentelemetry-examples-zipkin-all-0.1.0-SNAPSHOT.jar io.opentelemetry.example.ZipkinExample localhost 9411 +``` +## 4 - Open the Zipkin UI + +Navigate to http://localhost:9411/zipkin and click on search. + +[zipkin]:[https://zipkin.io/] diff --git a/examples/zipkin/build.gradle b/examples/zipkin/build.gradle new file mode 100644 index 0000000000..9bcf7f0b7f --- /dev/null +++ b/examples/zipkin/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' +} + +description = 'OpenTelemetry Examples for Zipkin Exporter' +ext.moduleName = "io.opentelemetry.examples.zipkin" + +dependencies { + compile("io.opentelemetry:opentelemetry-api:${opentelemetryVersion}") + compile("io.opentelemetry:opentelemetry-sdk:${opentelemetryVersion}") + compile("io.opentelemetry:opentelemetry-exporters-zipkin:${opentelemetryVersion}") +} \ No newline at end of file diff --git a/examples/zipkin/src/main/java/io/opentelemetry/example/ZipkinExample.java b/examples/zipkin/src/main/java/io/opentelemetry/example/ZipkinExample.java new file mode 100644 index 0000000000..8dd7d2ce10 --- /dev/null +++ b/examples/zipkin/src/main/java/io/opentelemetry/example/ZipkinExample.java @@ -0,0 +1,91 @@ +package io.opentelemetry.example; + +import io.opentelemetry.OpenTelemetry; +import io.opentelemetry.exporters.zipkin.ZipkinSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Tracer; + +public class ZipkinExample { + + // Zipkin Hostname or ip and PORT + private String ip; // hostname or ip of the zipkin backend server + private int port; // port of the zipkin backend server + + // Zipkin API Endpoints for uploading spans + private static final String ENDPOINT_V1_SPANS = "/api/v1/spans"; + private static final String ENDPOINT_V2_SPANS = "/api/v2/spans"; + + // Name of the service + private static final String SERVICE_NAME = "myExampleService"; + + private Tracer tracer = OpenTelemetry.getTracer("io.opentelemetry.example.ZipkinExample"); + private ZipkinSpanExporter zipkinExporter; + + public ZipkinExample(String ip, int port) { + this.ip = ip; + this.port = port; + } + + // This method adds SimpleSpanProcessor initialized with ZipkinSpanExporter to the + // TracerSdkProvider + public void setupZipkinExporter() { + String httpUrl = String.format("http://%s:%s", ip, port); + this.zipkinExporter = + ZipkinSpanExporter.newBuilder() + .setEndpoint(httpUrl + ENDPOINT_V2_SPANS) + .setServiceName(SERVICE_NAME) + .build(); + + // Set to process the spans by the Zipkin Exporter + OpenTelemetrySdk.getTracerProvider() + .addSpanProcessor(SimpleSpanProcessor.newBuilder(zipkinExporter).build()); + } + + // This method instruments doWork() method + public void myWonderfulUseCase() { + // Generate span + Span span = tracer.spanBuilder("Start my wonderful use case").startSpan(); + // Add some Event to the span + span.addEvent("Event 0"); + // execute my use case - here we simulate a wait + doWork(); + // Add some Event to the span + span.addEvent("Event 1"); + span.end(); + } + + public void doWork() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + + // graceful shutdown + public void shutdown() { + OpenTelemetrySdk.getTracerProvider().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]); + + // start example + ZipkinExample example = new ZipkinExample(ip, port); + example.setupZipkinExporter(); + example.myWonderfulUseCase(); + + // shutdown example + example.shutdown(); + + System.out.println("Bye"); + } +}