diff --git a/extensions/jaeger/runtime/src/main/java/io/quarkus/jaeger/runtime/QuarkusJaegerTracer.java b/extensions/jaeger/runtime/src/main/java/io/quarkus/jaeger/runtime/QuarkusJaegerTracer.java index 3a67636bf2b7b..ef1db1aba89c8 100644 --- a/extensions/jaeger/runtime/src/main/java/io/quarkus/jaeger/runtime/QuarkusJaegerTracer.java +++ b/extensions/jaeger/runtime/src/main/java/io/quarkus/jaeger/runtime/QuarkusJaegerTracer.java @@ -3,6 +3,7 @@ import io.jaegertracing.Configuration; import io.jaegertracing.internal.JaegerTracer; import io.jaegertracing.spi.MetricsFactory; +import io.opentracing.Scope; import io.opentracing.ScopeManager; import io.opentracing.Span; import io.opentracing.SpanContext; @@ -17,6 +18,35 @@ public class QuarkusJaegerTracer implements Tracer { private boolean logTraceContext; private MetricsFactory metricsFactory; + private final ScopeManager scopeManager = new ScopeManager() { + + volatile ScopeManager delegate; + + @Override + public Scope activate(Span span, boolean b) { + return sm().activate(span, b); + } + + @Override + public Scope active() { + if (delegate == null) { + return null; + } + return sm().active(); + } + + ScopeManager sm() { + if (delegate == null) { + synchronized (this) { + if (delegate == null) { + delegate = getScopeManager(); + } + } + } + return delegate; + } + }; + void setLogTraceContext(boolean logTraceContext) { this.logTraceContext = logTraceContext; } @@ -44,7 +74,7 @@ private Tracer tracer() { tracer = Configuration.fromEnv() .withMetricsFactory(metricsFactory) .getTracerBuilder() - .withScopeManager(getScopeManager()) + .withScopeManager(scopeManager) .build(); } } @@ -77,7 +107,7 @@ public SpanContext extract(Format format, C carrier) { @Override public ScopeManager scopeManager() { - return tracer().scopeManager(); + return scopeManager; } @Override