Created
April 19, 2025 23:24
-
-
Save themarcelor/ec5764bc25308f392017ebd328d51698 to your computer and use it in GitHub Desktop.
Java OTel exemplar working example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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