diff --git a/README.md b/README.md index b7aad7d5f..5b78945f6 100644 --- a/README.md +++ b/README.md @@ -298,6 +298,8 @@ class YourClass { ## Exemplars +TODO: Document that Exemplars are supported with OpenTelemetry 0.16.0 or higher. When `client_java` 0.11.0 was released the current OpenTelemetry version was 1.1.0. + Exemplars are a feature of the [OpenMetrics](http://openmetrics.io) format that allows applications to link metrics to example traces. Starting with version 0.11.0, `client_java` automatically adds Exemplars for applications that are instrumented with [OpenTelemetry](https://opentelemetry.io/) distributed tracing. No code change is required. diff --git a/integration_tests/exemplars_otel/src/main/java/io/prometheus/it/exemplars_otel/Server.java b/integration_tests/exemplars_otel/src/main/java/io/prometheus/it/exemplars_otel/Server.java index 348ccc5c0..cc7b7c01f 100644 --- a/integration_tests/exemplars_otel/src/main/java/io/prometheus/it/exemplars_otel/Server.java +++ b/integration_tests/exemplars_otel/src/main/java/io/prometheus/it/exemplars_otel/Server.java @@ -17,11 +17,57 @@ public static void main(String[] args) throws IOException, InterruptedException .help("help") .register(); + // The following code works with OpenTelemetry versions 0.13.0 and higher. + // Exemplars work with 0.16.0 and higher. With 0.15.0 or lower the example will run but not have exemplars. + System.out.println(Tracer.class.getProtectionDomain().getCodeSource().getLocation()); Tracer tracer = SdkTracerProvider.builder().build().get(null); Span span = tracer.spanBuilder("my span").startSpan(); span.makeCurrent(); counter.inc(1); span.end(); Thread.currentThread().join(); // sleep forever + + // Examples with older OpenTelemetry versions used for manual testing: + + /* + // OpenTelemetry versions 0.10.0 - 0.12.0 + System.out.println(Tracer.class.getProtectionDomain().getCodeSource().getLocation()); + Tracer tracer = OpenTelemetrySdk.get().getTracer("test"); + Span span = tracer.spanBuilder("my span").startSpan(); + span.makeCurrent(); + counter.inc(1); + span.end(); + Thread.currentThread().join(); // sleep forever + */ + + /* + // OpenTelemetry versions 0.4.0 - 0.9.1 + System.out.println(TracerSdkProvider.class.getProtectionDomain().getCodeSource().getLocation()); + Tracer tracer = TracerSdkProvider.builder().build().get("test"); + Span span = tracer.spanBuilder("my span").startSpan(); + counter.inc(1); + span.end(); + Thread.currentThread().join(); // sleep forever + */ + + /* + // OpenTelemetry version 0.3.0 + System.out.println(TracerSdkProvider.class.getProtectionDomain().getCodeSource().getLocation()); + TracerSdk tracer = TracerSdkProvider.builder().build().get("test"); + Span span = tracer.spanBuilder("my span").startSpan(); + counter.inc(1); + span.end(); + Thread.currentThread().join(); // sleep forever + */ + + /* + // OpenTelemetry version 0.2.0 + System.out.println(TracerSdkFactory.class.getProtectionDomain().getCodeSource().getLocation()); + TracerSdk tracer = TracerSdkFactory.create().get("test"); + Span span = tracer.spanBuilder("my span").startSpan(); + counter.inc(1); + span.end(); + Thread.currentThread().join(); // sleep forever + */ } } diff --git a/tracer_parent/tracer_otel/src/main/java/io/prometheus/client/exemplars/tracer/otel/OpenTelemetrySpanContextSupplier.java b/tracer_parent/tracer_otel/src/main/java/io/prometheus/client/exemplars/tracer/otel/OpenTelemetrySpanContextSupplier.java index d7c39cb35..143211b95 100644 --- a/tracer_parent/tracer_otel/src/main/java/io/prometheus/client/exemplars/tracer/otel/OpenTelemetrySpanContextSupplier.java +++ b/tracer_parent/tracer_otel/src/main/java/io/prometheus/client/exemplars/tracer/otel/OpenTelemetrySpanContextSupplier.java @@ -13,7 +13,11 @@ public static boolean isAvailable() { test.getSpanId(); test.getSpanId(); return true; - } catch (NoClassDefFoundError e) { + } catch (LinkageError ignored) { + // NoClassDefFoundError: + // Either OpenTelemetry is not present, or it is version 0.9.1 or older when io.opentelemetry.api.trace.Span did not exist. + // IncompatibleClassChangeError: + // The application uses an OpenTelemetry version between 0.10.0 and 0.15.0 when SpanContext was a class, and not an interface. return false; } } diff --git a/tracer_parent/tracer_otel_agent/src/main/java/io/prometheus/client/exemplars/tracer/otel_agent/OpenTelemetryAgentSpanContextSupplier.java b/tracer_parent/tracer_otel_agent/src/main/java/io/prometheus/client/exemplars/tracer/otel_agent/OpenTelemetryAgentSpanContextSupplier.java index 0ea37eabf..c91f87d1b 100644 --- a/tracer_parent/tracer_otel_agent/src/main/java/io/prometheus/client/exemplars/tracer/otel_agent/OpenTelemetryAgentSpanContextSupplier.java +++ b/tracer_parent/tracer_otel_agent/src/main/java/io/prometheus/client/exemplars/tracer/otel_agent/OpenTelemetryAgentSpanContextSupplier.java @@ -18,7 +18,11 @@ public static boolean isAvailable() { test.getSpanId(); test.getSpanId(); return true; - } catch (NoClassDefFoundError e) { + } catch (LinkageError ignored) { + // NoClassDefFoundError: + // Either OpenTelemetry is not present, or it is version 0.9.1 or older when io.opentelemetry.api.trace.Span did not exist. + // IncompatibleClassChangeError: + // The application uses an OpenTelemetry version between 0.10.0 and 0.15.0 when SpanContext was a class, and not an interface. return false; } }