diff --git a/tracing/opentelemetry/src/main/java/io/helidon/tracing/opentelemetry/OpenTelemetryTracerProvider.java b/tracing/opentelemetry/src/main/java/io/helidon/tracing/opentelemetry/OpenTelemetryTracerProvider.java index 6bb0d67a12b..20b2648ca10 100644 --- a/tracing/opentelemetry/src/main/java/io/helidon/tracing/opentelemetry/OpenTelemetryTracerProvider.java +++ b/tracing/opentelemetry/src/main/java/io/helidon/tracing/opentelemetry/OpenTelemetryTracerProvider.java @@ -91,10 +91,17 @@ public static Tracer globalTracer() { * @return optional of the current span */ public static Optional activeSpan() { - // OTel returns a no-op span if there is no current one. - io.opentelemetry.api.trace.Span otelSpan = io.opentelemetry.api.trace.Span.current(); + io.opentelemetry.context.Context otelContext = io.opentelemetry.context.Context.current(); - // OTel returns empty baggage if there is no current one. + // OTel Span.current() returns a no-op span if there is no current one. Use fromContextOrNull instead to distinguish. + io.opentelemetry.api.trace.Span otelSpan = + io.opentelemetry.api.trace.Span.fromContextOrNull(otelContext); + + if (otelSpan == null) { + return Optional.empty(); + } + + // OTel Baggage.current() returns empty baggage if there is no current one. That's OK for baggage. io.opentelemetry.api.baggage.Baggage otelBaggage = io.opentelemetry.api.baggage.Baggage.current(); // Create the span directly with the retrieved baggage. Ideally, it will be our writable baggage because we had put it diff --git a/tracing/opentelemetry/src/test/java/io/helidon/tracing/opentelemetry/TestSpanAndBaggage.java b/tracing/opentelemetry/src/test/java/io/helidon/tracing/opentelemetry/TestSpanAndBaggage.java index 1060fef456a..de50fc51ffb 100644 --- a/tracing/opentelemetry/src/test/java/io/helidon/tracing/opentelemetry/TestSpanAndBaggage.java +++ b/tracing/opentelemetry/src/test/java/io/helidon/tracing/opentelemetry/TestSpanAndBaggage.java @@ -113,14 +113,11 @@ void testActiveSpanScopeWithBaggage() { outerSpan.end(e); } - // There was no active span before outerSpan was activated, so expect the "default" ad-hoc span ID of all zeroes. + // There was no active span before outerSpan was activated, so expect an empty current span. Optional currentSpanAfterTryResourcesBlock = Span.current(); assertThat("Current span just after try-resources block", currentSpanAfterTryResourcesBlock, - OptionalMatcher.optionalPresent()); - assertThat("Current span just after try-resources block", - currentSpanAfterTryResourcesBlock.get().context().spanId(), - containsString("00000000")); + OptionalMatcher.optionalEmpty()); }