opentelemetry-java-instrume.../dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/SimpleScope.java

59 lines
1.6 KiB
Java

package datadog.opentracing.scopemanager;
import datadog.trace.context.ScopeListener;
import io.opentracing.Span;
/** Simple scope implementation which does not propagate across threads. */
public class SimpleScope implements DDScope {
private final ContextualScopeManager scopeManager;
private final Span spanUnderScope;
private final boolean finishOnClose;
private final DDScope toRestore;
private final int depth;
public SimpleScope(
final ContextualScopeManager scopeManager,
final Span spanUnderScope,
final boolean finishOnClose) {
assert spanUnderScope != null : "span must not be null";
this.scopeManager = scopeManager;
this.spanUnderScope = spanUnderScope;
this.finishOnClose = finishOnClose;
toRestore = scopeManager.tlsScope.get();
scopeManager.tlsScope.set(this);
depth = toRestore == null ? 0 : toRestore.depth() + 1;
for (final ScopeListener listener : scopeManager.scopeListeners) {
listener.afterScopeActivated();
}
}
@Override
public void close() {
if (finishOnClose) {
spanUnderScope.finish();
}
for (final ScopeListener listener : scopeManager.scopeListeners) {
listener.afterScopeClosed();
}
if (scopeManager.tlsScope.get() == this) {
scopeManager.tlsScope.set(toRestore);
if (toRestore != null) {
for (final ScopeListener listener : scopeManager.scopeListeners) {
listener.afterScopeActivated();
}
}
}
}
@Override
public Span span() {
return spanUnderScope;
}
@Override
public int depth() {
return depth;
}
}