Skip to content

Commit 47fe25d

Browse files
Fixed OpenTelemetry span events
1 parent f69e043 commit 47fe25d

File tree

8 files changed

+41
-17
lines changed
  • dd-java-agent
    • agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace
    • instrumentation
      • opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry
      • opentracing
        • api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31
        • api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32
  • dd-trace-core/src/main/java/datadog/trace/core
  • dd-trace-ot/src/main/java/datadog/opentracing
  • internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api

8 files changed

+41
-17
lines changed

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpan.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper;
1818
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities;
1919
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
20+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
2021
import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan;
2122
import io.opentelemetry.api.common.AttributeKey;
2223
import io.opentelemetry.api.common.Attributes;
@@ -31,7 +32,7 @@
3132
import javax.annotation.ParametersAreNonnullByDefault;
3233

3334
@ParametersAreNonnullByDefault
34-
public class OtelSpan implements Span, WithAgentSpan {
35+
public class OtelSpan implements Span, WithAgentSpan, SpanWrapper {
3536
private final AgentSpan delegate;
3637
private StatusCode statusCode;
3738
private boolean recording;
@@ -142,16 +143,12 @@ public Span updateName(String name) {
142143
@Override
143144
public void end() {
144145
this.recording = false;
145-
applyNamingConvention(this.delegate);
146-
setEventsAsTag(this.delegate, this.events);
147146
this.delegate.finish();
148147
}
149148

150149
@Override
151150
public void end(long timestamp, TimeUnit unit) {
152151
this.recording = false;
153-
applyNamingConvention(this.delegate);
154-
setEventsAsTag(this.delegate, this.events);
155152
this.delegate.finish(unit.toMicros(timestamp));
156153
}
157154

@@ -178,6 +175,12 @@ public AgentSpan asAgentSpan() {
178175
return this.delegate;
179176
}
180177

178+
@Override
179+
public void onSpanFinished() {
180+
applyNamingConvention(this.delegate);
181+
setEventsAsTag(this.delegate, this.events);
182+
}
183+
181184
private static class NoopSpan implements Span {
182185
private static final Span INSTANCE = new NoopSpan();
183186

dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datadog.trace.api.DDTags;
44
import datadog.trace.api.interceptor.MutableSpan;
55
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
6+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
67
import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan;
78
import io.opentelemetry.common.AttributeValue;
89
import io.opentelemetry.trace.EndSpanOptions;
@@ -13,7 +14,7 @@
1314
import java.util.Map;
1415
import java.util.concurrent.TimeUnit;
1516

16-
public class OtelSpan implements Span, MutableSpan, WithAgentSpan {
17+
public class OtelSpan implements Span, MutableSpan, WithAgentSpan, SpanWrapper {
1718
private final AgentSpan delegate;
1819
private final TypeConverter converter;
1920

@@ -242,4 +243,7 @@ public MutableSpan getLocalRootSpan() {
242243
public AgentSpan asAgentSpan() {
243244
return delegate;
244245
}
246+
247+
@Override
248+
public void onSpanFinished() {}
245249
}

dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/TypeConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public Span toSpan(final AgentSpan agentSpan) {
4141
if (wrapper instanceof Span) {
4242
return (Span) wrapper;
4343
}
44-
Span spanWrapper = new OtelSpan(agentSpan, this);
44+
OtelSpan spanWrapper = new OtelSpan(agentSpan, this);
4545
attachableSpanWrapper.attachWrapper(spanWrapper);
4646
return spanWrapper;
4747
}

dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTSpan.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
55
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities;
66
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
7+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
78
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
89
import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan;
910
import datadog.trace.instrumentation.opentracing.LogHandler;
@@ -15,7 +16,7 @@
1516
* This class should be castable to MutableSpan since that is the way we've encouraged users to
1617
* interact with non-ot parts of our API.
1718
*/
18-
class OTSpan implements Span, MutableSpan, WithAgentSpan {
19+
class OTSpan implements Span, MutableSpan, WithAgentSpan, SpanWrapper {
1920
private final AgentSpan delegate;
2021
private final TypeConverter converter;
2122
private final LogHandler logHandler;
@@ -235,4 +236,7 @@ public int hashCode() {
235236
public AgentSpan asAgentSpan() {
236237
return delegate;
237238
}
239+
240+
@Override
241+
public void onSpanFinished() {}
238242
}

dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTSpan.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
55
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities;
66
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
7+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
78
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
89
import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan;
910
import datadog.trace.instrumentation.opentracing.LogHandler;
@@ -16,7 +17,7 @@
1617
* This class should be castable to MutableSpan since that is the way we've encouraged users to
1718
* interact with non-ot parts of our API.
1819
*/
19-
class OTSpan implements Span, MutableSpan, WithAgentSpan {
20+
class OTSpan implements Span, MutableSpan, WithAgentSpan, SpanWrapper {
2021
private final AgentSpan delegate;
2122
private final TypeConverter converter;
2223
private final LogHandler logHandler;
@@ -242,4 +243,7 @@ public int hashCode() {
242243
public AgentSpan asAgentSpan() {
243244
return delegate;
244245
}
246+
247+
@Override
248+
public void onSpanFinished() {}
245249
}

dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper;
2929
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities;
3030
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
31+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
3132
import datadog.trace.bootstrap.instrumentation.api.Tags;
3233
import datadog.trace.core.util.StackTraces;
3334
import java.util.Collections;
@@ -94,9 +95,9 @@ static DDSpan create(
9495
private volatile EndpointTracker endpointTracker;
9596

9697
// 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");
98+
private volatile SpanWrapper wrapper;
99+
private static final AtomicReferenceFieldUpdater<DDSpan, SpanWrapper> WRAPPER_FIELD_UPDATER =
100+
AtomicReferenceFieldUpdater.newUpdater(DDSpan.class, SpanWrapper.class, "wrapper");
100101

101102
// the request is to be blocked (AppSec)
102103
private volatile Flow.Action.RequestBlockingAction requestBlockingAction;
@@ -148,6 +149,10 @@ private void finishAndAddToTrace(final long durationNano) {
148149
// ensure a min duration of 1
149150
if (DURATION_NANO_UPDATER.compareAndSet(this, 0, Math.max(1, durationNano))) {
150151
setLongRunningVersion(-this.longRunningVersion);
152+
SpanWrapper wrapper = getWrapper();
153+
if (wrapper != null) {
154+
wrapper.onSpanFinished();
155+
}
151156
this.metrics.onSpanFinished();
152157
TraceCollector.PublishState publishState = context.getTraceCollector().onPublish(this);
153158
log.debug("Finished span ({}): {}", publishState, this);
@@ -804,12 +809,12 @@ public String toString() {
804809
}
805810

806811
@Override
807-
public void attachWrapper(Object wrapper) {
812+
public void attachWrapper(SpanWrapper wrapper) {
808813
WRAPPER_FIELD_UPDATER.compareAndSet(this, null, wrapper);
809814
}
810815

811816
@Override
812-
public Object getWrapper() {
817+
public SpanWrapper getWrapper() {
813818
return WRAPPER_FIELD_UPDATER.get(this);
814819
}
815820

dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
55
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities;
66
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
7+
import datadog.trace.bootstrap.instrumentation.api.SpanWrapper;
78
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
89
import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan;
910
import io.opentracing.Span;
@@ -15,7 +16,7 @@
1516
* This class should be castable to MutableSpan since that is the way we've encouraged users to
1617
* interact with non-ot parts of our API.
1718
*/
18-
class OTSpan implements Span, MutableSpan, WithAgentSpan {
19+
class OTSpan implements Span, MutableSpan, WithAgentSpan, SpanWrapper {
1920
private final AgentSpan delegate;
2021
private final TypeConverter converter;
2122
private final LogHandler logHandler;
@@ -241,4 +242,7 @@ public int hashCode() {
241242
public AgentSpan asAgentSpan() {
242243
return delegate;
243244
}
245+
246+
@Override
247+
public void onSpanFinished() {}
244248
}

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AttachableWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
public interface AttachableWrapper {
88

99
/** Attaches a OT/OTel wrapper to a tracer object. */
10-
void attachWrapper(@Nonnull Object wrapper);
10+
void attachWrapper(@Nonnull SpanWrapper wrapper);
1111

1212
/** Returns an attached OT/OTel wrapper or null. */
1313
@Nullable
14-
Object getWrapper();
14+
SpanWrapper getWrapper();
1515
}

0 commit comments

Comments
 (0)