diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index dd2c422a2eb..1a63eb22832 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -1514,28 +1514,31 @@ private DDSpanContext buildSpanContext() { String parentServiceName = null; boolean isRemote = false; - if (parentContext != null - && parentContext.isRemote() - && Config.get().getTracePropagationBehaviorExtract() - == TracePropagationBehaviorExtract.RESTART) { - SpanLink link; - if (parentContext instanceof ExtractedContext) { - ExtractedContext pc = (ExtractedContext) parentContext; - link = - DDSpanLink.from( - pc, - SpanAttributes.builder() - .put("reason", "propagation_behavior_extract") - .put("context_headers", pc.getPropagationStyle().toString()) - .build()); - } else { - link = SpanLink.from(parentContext); + TracePropagationBehaviorExtract behaviorExtract = + Config.get().getTracePropagationBehaviorExtract(); + if (parentContext != null && parentContext.isRemote()) { + if (behaviorExtract == TracePropagationBehaviorExtract.IGNORE) { + // reset links that may have come terminated span links + links = new ArrayList<>(); + parentContext = null; + } else if (behaviorExtract == TracePropagationBehaviorExtract.RESTART) { + links = new ArrayList<>(); + SpanLink link = + (parentContext instanceof ExtractedContext) + ? DDSpanLink.from( + (ExtractedContext) parentContext, + SpanAttributes.builder() + .put("reason", "propagation_behavior_extract") + .put( + "context_headers", + ((ExtractedContext) parentContext).getPropagationStyle().toString()) + .build()) + : SpanLink.from(parentContext); + links.add(link); + parentContext = null; } - // reset links that may have come terminated span links - links = new ArrayList<>(); - links.add(link); - parentContext = null; } + // Propagate internal trace. // Note: if we are not in the context of distributed tracing and we are starting the first // root span, parentContext will be null at this point. diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy index a9a86f5cdad..9d48317022f 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy @@ -363,6 +363,22 @@ class CoreSpanBuilderTest extends DDCoreSpecification { link.traceState() == extractedContext.propagationTags.headerValue(PropagationTags.HeaderType.W3C) } + def "build context from ExtractedContext with TRACE_PROPAGATION_BEHAVIOR_EXTRACT=ignore"() { + setup: + injectSysConfig("trace.propagation.behavior.extract", "ignore") + def extractedContext = new ExtractedContext(DDTraceId.ONE, 2, PrioritySampling.SAMPLER_DROP, null, 0, [:], [:], null, PropagationTags.factory().fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=934086a686-4,_dd.p.anytag=value"), null, DATADOG) + final DDSpan span = tracer.buildSpan("test", "op name") + .asChildOf(extractedContext).start() + + expect: + span.traceId != extractedContext.traceId + span.parentId != extractedContext.spanId + span.samplingPriority() == PrioritySampling.UNSET + + + assert span.links.size() == 0 + } + def "TagContext should populate default span details"() { setup: def thread = Thread.currentThread() diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 18759cd9138..c2218e01ef7 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -1042,14 +1042,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins } // Now we can check if we should pick the default injection/extraction - if (extract.isEmpty()) { - extract = DEFAULT_TRACE_PROPAGATION_STYLE; - } - tracePropagationStylesToExtract = - tracePropagationBehaviorExtract == TracePropagationBehaviorExtract.IGNORE - ? new HashSet<>() - : extract; + extract.isEmpty() ? DEFAULT_TRACE_PROPAGATION_STYLE : extract; tracePropagationStylesToInject = inject.isEmpty() ? DEFAULT_TRACE_PROPAGATION_STYLE : inject; diff --git a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 754e4d281f8..8dafd91f4a2 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -2679,20 +2679,6 @@ class ConfigTest extends DDSpecification { config.finalDebuggerSymDBUrl == "http://localhost:8126/symdb/v1/input" } - def "specify overrides for PROPAGATION_STYLE_EXTRACT when TRACE_PROPAGATION_BEHAVIOR_EXTRACT=ignore"() { - setup: - def prop = new Properties() - prop.setProperty(PROPAGATION_STYLE_EXTRACT, "Datadog, B3") - prop.setProperty(TRACE_PROPAGATION_BEHAVIOR_EXTRACT, "ignore") - - when: - Config config = Config.get(prop) - - then: - config.tracePropagationBehaviorExtract == TracePropagationBehaviorExtract.IGNORE - config.tracePropagationStylesToExtract.toList() == [] - } - def "verify try/catch behavior for invalid strings for TRACE_PROPAGATION_BEHAVIOR_EXTRACT"() { setup: def prop = new Properties()