|
28 | 28 | import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper; |
29 | 29 | import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities; |
30 | 30 | import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities; |
| 31 | +import datadog.trace.bootstrap.instrumentation.api.SpanWrapper; |
31 | 32 | import datadog.trace.bootstrap.instrumentation.api.Tags; |
32 | 33 | import datadog.trace.core.util.StackTraces; |
| 34 | +import edu.umd.cs.findbugs.annotations.NonNull; |
33 | 35 | import java.util.Collections; |
34 | 36 | import java.util.List; |
35 | 37 | import java.util.Map; |
@@ -94,9 +96,9 @@ static DDSpan create( |
94 | 96 | private volatile EndpointTracker endpointTracker; |
95 | 97 |
|
96 | 98 | // Cached OT/OTel wrapper to avoid multiple allocations, e.g. when span is activated |
97 | | - private volatile Object wrapper; |
98 | | - private static final AtomicReferenceFieldUpdater<DDSpan, Object> WRAPPER_FIELD_UPDATER = |
99 | | - AtomicReferenceFieldUpdater.newUpdater(DDSpan.class, Object.class, "wrapper"); |
| 99 | + private volatile SpanWrapper wrapper; |
| 100 | + private static final AtomicReferenceFieldUpdater<DDSpan, SpanWrapper> WRAPPER_FIELD_UPDATER = |
| 101 | + AtomicReferenceFieldUpdater.newUpdater(DDSpan.class, SpanWrapper.class, "wrapper"); |
100 | 102 |
|
101 | 103 | // the request is to be blocked (AppSec) |
102 | 104 | private volatile Flow.Action.RequestBlockingAction requestBlockingAction; |
@@ -148,6 +150,10 @@ private void finishAndAddToTrace(final long durationNano) { |
148 | 150 | // ensure a min duration of 1 |
149 | 151 | if (DURATION_NANO_UPDATER.compareAndSet(this, 0, Math.max(1, durationNano))) { |
150 | 152 | setLongRunningVersion(-this.longRunningVersion); |
| 153 | + SpanWrapper wrapper = getWrapper(); |
| 154 | + if (wrapper != null) { |
| 155 | + wrapper.onSpanFinished(); |
| 156 | + } |
151 | 157 | this.metrics.onSpanFinished(); |
152 | 158 | TraceCollector.PublishState publishState = context.getTraceCollector().onPublish(this); |
153 | 159 | log.debug("Finished span ({}): {}", publishState, this); |
@@ -804,12 +810,12 @@ public String toString() { |
804 | 810 | } |
805 | 811 |
|
806 | 812 | @Override |
807 | | - public void attachWrapper(Object wrapper) { |
| 813 | + public void attachWrapper(@NonNull SpanWrapper wrapper) { |
808 | 814 | WRAPPER_FIELD_UPDATER.compareAndSet(this, null, wrapper); |
809 | 815 | } |
810 | 816 |
|
811 | 817 | @Override |
812 | | - public Object getWrapper() { |
| 818 | + public SpanWrapper getWrapper() { |
813 | 819 | return WRAPPER_FIELD_UPDATER.get(this); |
814 | 820 | } |
815 | 821 |
|
|
0 commit comments