Skip to content

Commit 4ed183c

Browse files
Fix possible invalid parent span using OpenTelemetry API (#5666)
1 parent f94340f commit 4ed183c

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/main/java/datadog/trace/instrumentation/opentelemetry14/OtelExtractedContext.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import io.opentelemetry.api.trace.SpanContext;
1212
import io.opentelemetry.context.Context;
1313
import java.util.Map;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1416

1517
class OtelExtractedContext implements AgentSpan.Context {
18+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelExtractedContext.class);
1619
private final DDTraceId traceId;
1720
private final long spanId;
1821
private final int prioritySampling;
@@ -29,13 +32,17 @@ static AgentSpan.Context extract(Context context) {
2932
SpanContext spanContext = span.getSpanContext();
3033
if (spanContext instanceof OtelSpanContext) {
3134
return ((OtelSpanContext) spanContext).delegate;
32-
} else {
35+
} else if (spanContext.isValid()) {
3336
try {
3437
return new OtelExtractedContext(spanContext);
3538
} catch (NumberFormatException e) {
36-
return AgentTracer.NoopContext.INSTANCE;
39+
LOGGER.debug(
40+
"Failed to convert span context with trace id = {} and span id = {}",
41+
spanContext.getTraceId(),
42+
spanContext.getSpanId());
3743
}
3844
}
45+
return null;
3946
}
4047

4148
@Override

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/main/java/datadog/trace/instrumentation/opentelemetry14/OtelSpanBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ public OtelSpanBuilder(AgentTracer.SpanBuilder delegate) {
2626

2727
@Override
2828
public SpanBuilder setParent(Context context) {
29-
this.delegate.asChildOf(extract(context));
29+
AgentSpan.Context extractedContext = extract(context);
30+
if (extractedContext != null) {
31+
this.delegate.asChildOf(extractedContext);
32+
}
3033
return this;
3134
}
3235

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/main/java/datadog/trace/instrumentation/opentelemetry14/OtelTracerProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
import io.opentelemetry.api.trace.TracerProvider;
66
import java.util.HashMap;
77
import java.util.Map;
8-
import java.util.logging.Logger;
98
import javax.annotation.ParametersAreNonnullByDefault;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
1011

1112
@ParametersAreNonnullByDefault
1213
public class OtelTracerProvider implements TracerProvider {
13-
private static final Logger logger = Logger.getLogger(OtelTracerProvider.class.getName());
14+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelTracerProvider.class);
1415
private static final String DEFAULT_TRACER_NAME = "";
1516
public static final OtelTracerProvider INSTANCE = new OtelTracerProvider();
1617

@@ -47,7 +48,7 @@ public Tracer get(String instrumentationScopeName, String instrumentationScopeVe
4748
@Override
4849
public TracerBuilder tracerBuilder(String instrumentationScopeName) {
4950
if (instrumentationScopeName.trim().isEmpty()) {
50-
logger.fine("Tracer requested without instrumentation scope name.");
51+
LOGGER.debug("Tracer requested without instrumentation scope name.");
5152
instrumentationScopeName = DEFAULT_TRACER_NAME;
5253
}
5354
return new OtelTracerBuilder(instrumentationScopeName);

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14Test.groovy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,23 @@ class OpenTelemetry14Test extends AgentTestRunner {
100100
}
101101
}
102102

103+
def "test parent span using invalid reference"() {
104+
when:
105+
def invalidCurrentSpanContext = Context.root() // Contains a SpanContext with TID/SID to 0 as current span
106+
def childSpan = tracer.spanBuilder("some-name")
107+
.setParent(invalidCurrentSpanContext)
108+
.startSpan()
109+
childSpan.end()
110+
111+
TEST_WRITER.waitForTraces(1)
112+
def trace = TEST_WRITER.firstTrace()
113+
114+
115+
then:
116+
trace.size() == 1
117+
trace[0].spanId != 0
118+
}
119+
103120
def "test no parent to create new root span"() {
104121
setup:
105122
def parentSpan = tracer.spanBuilder("some-name").startSpan()

0 commit comments

Comments
 (0)