Skip to content

Commit fd3ed8b

Browse files
mccullsdevflow.devflow-routing-intake
andauthored
Translate a sampling.priority tag set to a positive value to forceKeep, overriding any locked sampling priority (#11621)
Translate a sampling.priority tag set to a positive value to forceKeep, overriding any locked sampling priority Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent dec024e commit fd3ed8b

2 files changed

Lines changed: 61 additions & 3 deletions

File tree

dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import static datadog.trace.api.DDTags.ORIGIN_KEY;
66
import static datadog.trace.api.DDTags.SPAN_TYPE;
77
import static datadog.trace.api.sampling.PrioritySampling.USER_DROP;
8-
import static datadog.trace.api.sampling.PrioritySampling.USER_KEEP;
98
import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.SERVLET_CONTEXT;
109
import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.SPLIT_BY_SERVLET_CONTEXT;
1110
import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.SPLIT_BY_TAGS;
@@ -327,8 +326,11 @@ private boolean interceptSamplingPriority(DDSpanContext span, Object value) {
327326
if (ruleFlags.isEnabled(FORCE_SAMPLING_PRIORITY)) {
328327
Number samplingPriority = getOrTryParse(value);
329328
if (null != samplingPriority) {
330-
span.setSamplingPriority(
331-
samplingPriority.intValue() > 0 ? USER_KEEP : USER_DROP, SamplingMechanism.MANUAL);
329+
if (samplingPriority.intValue() > 0) {
330+
span.forceKeep(SamplingMechanism.MANUAL);
331+
} else {
332+
span.setSamplingPriority(USER_DROP, SamplingMechanism.MANUAL);
333+
}
332334
}
333335
return true;
334336
}

dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.core.taginterceptor;
22

33
import static datadog.trace.api.DDTags.ANALYTICS_SAMPLE_RATE;
4+
import static datadog.trace.api.TracePropagationStyle.DATADOG;
45
import static datadog.trace.api.config.TracerConfig.SPLIT_BY_TAGS;
56
import static datadog.trace.junit.utils.config.WithConfigExtension.injectSysConfig;
67
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -16,11 +17,14 @@
1617

1718
import datadog.trace.api.DDSpanTypes;
1819
import datadog.trace.api.DDTags;
20+
import datadog.trace.api.DDTraceId;
1921
import datadog.trace.api.ProductTraceSource;
2022
import datadog.trace.api.remoteconfig.ServiceNameCollector;
2123
import datadog.trace.api.remoteconfig.ServiceNameCollectorTestBridge;
2224
import datadog.trace.api.sampling.PrioritySampling;
25+
import datadog.trace.api.sampling.SamplingMechanism;
2326
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
27+
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
2428
import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags;
2529
import datadog.trace.bootstrap.instrumentation.api.Tags;
2630
import datadog.trace.common.sampling.AllSampler;
@@ -29,7 +33,10 @@
2933
import datadog.trace.core.CoreSpan;
3034
import datadog.trace.core.CoreTracer;
3135
import datadog.trace.core.DDCoreJavaSpecification;
36+
import datadog.trace.core.DDSpan;
3237
import datadog.trace.core.DDSpanContext;
38+
import datadog.trace.core.propagation.ExtractedContext;
39+
import datadog.trace.core.propagation.PropagationTags;
3340
import datadog.trace.junit.utils.config.WithConfig;
3441
import datadog.trace.junit.utils.tabletest.ConfigDefaultsConverter;
3542
import datadog.trace.junit.utils.tabletest.DDTagsConverter;
@@ -415,6 +422,55 @@ void setPrioritySamplingViaTag(String scenario, String tag, Object value, Intege
415422
assertEquals(expected, span.getSamplingPriority());
416423
}
417424

425+
@Test
426+
void samplingPriorityPositiveTagOverridesLockedPriority() {
427+
CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build();
428+
AgentSpan span = tracer.buildSpan("datadog", "test").start();
429+
430+
// Simulate upstream propagation of x-datadog-sampling-priority: -1 (USER_DROP)
431+
span.setSamplingPriority(PrioritySampling.USER_DROP, SamplingMechanism.UNKNOWN);
432+
assertEquals((int) PrioritySampling.USER_DROP, span.getSamplingPriority());
433+
434+
// positive sampling.priority overrides the propagated locked priority
435+
span.setTag(Tags.SAMPLING_PRIORITY, 2);
436+
assertEquals((int) PrioritySampling.USER_KEEP, span.getSamplingPriority());
437+
}
438+
439+
@Test
440+
void samplingPriorityNonPositiveTagDoesNotOverrideLockedPriority() {
441+
CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build();
442+
AgentSpan span = tracer.buildSpan("datadog", "test").start();
443+
444+
// Simulate upstream propagation of x-datadog-sampling-priority: 2 (USER_KEEP)
445+
span.setSamplingPriority(PrioritySampling.USER_KEEP, SamplingMechanism.UNKNOWN);
446+
assertEquals((int) PrioritySampling.USER_KEEP, span.getSamplingPriority());
447+
448+
// non-positive sampling.priority respects the propagated locked priority
449+
span.setTag(Tags.SAMPLING_PRIORITY, 0);
450+
assertEquals((int) PrioritySampling.USER_KEEP, span.getSamplingPriority());
451+
}
452+
453+
@Test
454+
void samplingPriorityPositiveTagOverridesDecisionMakerFromUpstreamPropagation() {
455+
CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build();
456+
// Upstream service dropped with LOCAL_USER_RULE and propagated _dd.p.dm=-3
457+
PropagationTags propagationTags =
458+
PropagationTags.factory()
459+
.fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=-3");
460+
AgentSpanContext extracted =
461+
new ExtractedContext(
462+
DDTraceId.from(123), 456L, PrioritySampling.USER_DROP, null, propagationTags, DATADOG);
463+
DDSpan span = (DDSpan) tracer.buildSpan("datadog", "test").asChildOf(extracted).start();
464+
465+
// positive sampling.priority overrides locked priority and sets _dd.p.dm to MANUAL
466+
span.setTag(Tags.SAMPLING_PRIORITY, 2);
467+
468+
assertEquals((int) PrioritySampling.USER_KEEP, span.getSamplingPriority());
469+
assertEquals(
470+
"_dd.p.dm=-4",
471+
span.context().getPropagationTags().headerValue(PropagationTags.HeaderType.DATADOG));
472+
}
473+
418474
@ParameterizedTest
419475
@ValueSource(booleans = {true, false})
420476
void setErrorFlagWhenErrorTagReported(boolean error) throws Exception {

0 commit comments

Comments
 (0)