Skip to content

Hello World (Traces, Metrics, Logs)

A simple Java console application instrumented with OpenTelemetry that generates a span, metrics and logs and exports them to Collector.

Setup environment

Development Environment

You can run otel-tui as OpenTelemetry Collector, which acts as a terminal OpenTelemetry viewer

docker run -p 4317:4317 -p 4318:4318 --rm -it --name otel-tui ymtdzzz/otel-tui:latest

Install packages

build.gradle.kts
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
plugins {
    id("java")
}

dependencies {
    implementation("io.opentelemetry:opentelemetry-api")
    implementation("io.opentelemetry:opentelemetry-sdk")
    implementation("io.opentelemetry:opentelemetry-exporter-otlp")
    implementation("io.opentelemetry.semconv:opentelemetry-semconv")
    implementation("io.opentelemetry:opentelemetry-exporter-logging")
}

Traces

TracesGrpc.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package snippets;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.semconv.ResourceAttributes;

public class TracesGrpc {
  private static final String SERVICE_NAME = "java.hello-world.TracesGrpc";

  public static void main(String[] args) throws InterruptedException {
    OtlpGrpcSpanExporter spanExporter =
        OtlpGrpcSpanExporter.builder().setEndpoint("http://localhost:4317").build();

    // Builds the Tracer Provider with span processor and resource attribute
    SdkTracerProvider tracerProvider =
        SdkTracerProvider.builder()
            .addSpanProcessor(SimpleSpanProcessor.create(spanExporter))
            .setResource(
                Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, SERVICE_NAME)))
            .build();

    // Sets and registers the Tracer Provider as Global
    OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal();

    // Creates the tracer
    Tracer tracer = GlobalOpenTelemetry.getTracer(SERVICE_NAME);

    // Creates a span, set its attributes and finishes it
    Span span = tracer.spanBuilder("HelloWorldSpanGrpc").startSpan();
    span.setAttribute("foo", "grpc");
    span.end();

    //  Print something to console
    System.out.println("Hello, World!");

    // Waits for things to settle and shuts the Trace Provider down right before finishing the app
    Thread.sleep(2000);
    tracerProvider.shutdown();
  }
}

Run this snippet

gradle shadowJar
java -cp build/libs/hello-world-all.jar snippets.TracesGrpc
TracesConsole.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package snippets;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.semconv.ResourceAttributes;

public class TracesConsole {
  // define service name
  private static final String SERVICE_NAME = "java.hello-world.TracesConsole";

  public static void main(String[] args) throws InterruptedException {
    // Builds the Tracer Provider with span processor and resource attribute
    SdkTracerProvider tracerProvider =
        SdkTracerProvider.builder()
            .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
            .setResource(
                Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, SERVICE_NAME)))
            .build();

    // Sets and registers the Tracer Provider as Global
    OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal();

    // Creates the tracer
    Tracer tracer = GlobalOpenTelemetry.getTracer(SERVICE_NAME);

    // Creates a span, set its attributes and finishes it
    Span span = tracer.spanBuilder("HelloWorldSpanConsole").startSpan();
    span.setAttribute("foo", "console");
    span.end();

    //  Print something to console
    System.out.println("Hello, World!");

    tracerProvider.shutdown();
  }
}

Run this snippet

gradle shadowJar
java -cp build/libs/hello-world-all.jar snippets.TracesConsole

Metrics

TODO

In Development

Logs

TODO

In Development