Skip to content

Instantly share code, notes, and snippets.

@themarcelor
Created April 19, 2025 23:24
Show Gist options
  • Select an option

  • Save themarcelor/ec5764bc25308f392017ebd328d51698 to your computer and use it in GitHub Desktop.

Select an option

Save themarcelor/ec5764bc25308f392017ebd328d51698 to your computer and use it in GitHub Desktop.
Java OTel exemplar working example
package org.example;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.Context;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import java.time.Duration;
public class App {
public static void main(String[] args) throws InterruptedException {
// Configure OTLP metric exporter to use localhost:4317
MetricExporter metricExporter = OtlpGrpcMetricExporter.builder()
.setEndpoint("http://localhost:4317")
.build();
PeriodicMetricReader reader = PeriodicMetricReader.builder(metricExporter)
.setInterval(Duration.ofSeconds(5))
.build();
SdkMeterProvider meterProvider = SdkMeterProvider.builder()
.registerMetricReader(reader)
.build();
// Configure OTLP trace exporter to use localhost:4417
OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder()
.setEndpoint("http://localhost:4417")
.build();
SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())
.build();
// Register the configured OpenTelemetry SDK
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setMeterProvider(meterProvider)
.buildAndRegisterGlobal();
// Instrumentation
Tracer tracer = openTelemetry.getTracer("example-instrumentation");
Meter meter = openTelemetry.getMeter("example-meter");
LongCounter requestCounter = meter.counterBuilder("example.request_counter")
.setDescription("Counts incoming requests")
.setUnit("requests")
.build();
// Create a span to provide trace context for the exemplar
Span span = tracer.spanBuilder("handleRequest").startSpan();
try (Scope scope = span.makeCurrent()) {
Attributes attributes = Attributes.builder()
.put("endpoint", "/api/resource")
.put("status", "200")
.build();
// Record metric with exemplar (auto-attached via span context)
requestCounter.add(1, attributes, Context.current());
} finally {
span.end();
}
// Give time for the exporter to flush
Thread.sleep(6000);
// Shut down providers
tracerProvider.shutdown();
meterProvider.shutdown();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment