From 86d12e2222cb0e1124e276eb4ee6464b45f59a95 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Tue, 30 Apr 2024 09:35:38 +0100 Subject: [PATCH] Process 'sampling.priority' tags --- .../trace/core/taginterceptor/RuleFlags.java | 1 + .../core/taginterceptor/TagInterceptor.java | 16 +++++++++ .../taginterceptor/TagInterceptorTest.groovy | 34 ++++++++++++------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/RuleFlags.java b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/RuleFlags.java index 3ebcfdd4883..3dce57b3054 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/RuleFlags.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/RuleFlags.java @@ -14,6 +14,7 @@ public enum Feature { DB_STATEMENT("DBStatementRule"), FORCE_MANUAL_DROP("ForceManualDropTagInterceptor"), FORCE_MANUAL_KEEP("ForceManualKeepTagInterceptor"), + FORCE_SAMPLING_PRIORITY("ForceSamplingPriorityTagInterceptor"), PEER_SERVICE("PeerServiceTagInterceptor", false), SERVICE_NAME("ServiceNameTagInterceptor"), SERVLET_CONTEXT("ServletContextTagInterceptor"); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java index 13e6cfe7535..4a49d625cc4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java @@ -5,10 +5,12 @@ import static datadog.trace.api.DDTags.ORIGIN_KEY; import static datadog.trace.api.DDTags.SPAN_TYPE; import static datadog.trace.api.sampling.PrioritySampling.USER_DROP; +import static datadog.trace.api.sampling.PrioritySampling.USER_KEEP; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_METHOD; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_STATUS; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL; import static datadog.trace.core.taginterceptor.RuleFlags.Feature.FORCE_MANUAL_DROP; +import static datadog.trace.core.taginterceptor.RuleFlags.Feature.FORCE_SAMPLING_PRIORITY; import static datadog.trace.core.taginterceptor.RuleFlags.Feature.PEER_SERVICE; import static datadog.trace.core.taginterceptor.RuleFlags.Feature.RESOURCE_NAME; import static datadog.trace.core.taginterceptor.RuleFlags.Feature.SERVICE_NAME; @@ -98,6 +100,8 @@ public boolean interceptTag(DDSpanContext span, String tag, Object value) { case DDTags.MANUAL_DROP: return interceptSamplingPriority( FORCE_MANUAL_DROP, USER_DROP, SamplingMechanism.MANUAL, span, value); + case Tags.SAMPLING_PRIORITY: + return interceptSamplingPriority(span, value); case InstrumentationTags.SERVLET_CONTEXT: return interceptServletContext(span, value); case SPAN_TYPE: @@ -241,6 +245,18 @@ private boolean interceptSamplingPriority( return false; } + private boolean interceptSamplingPriority(DDSpanContext span, Object value) { + if (ruleFlags.isEnabled(FORCE_SAMPLING_PRIORITY)) { + Number samplingPriority = getOrTryParse(value); + if (null != samplingPriority) { + span.setSamplingPriority( + samplingPriority.intValue() > 0 ? USER_KEEP : USER_DROP, SamplingMechanism.MANUAL); + } + return true; + } + return false; + } + private boolean interceptServletContext(DDSpanContext span, Object value) { // even though this tag is sometimes used to set the service name // (which has the side effect of marking the span as eligible for metrics diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/taginterceptor/TagInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/taginterceptor/TagInterceptorTest.groovy index 9c0ba82519f..8ea97775a48 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/taginterceptor/TagInterceptorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/taginterceptor/TagInterceptorTest.groovy @@ -408,18 +408,28 @@ class TagInterceptorTest extends DDCoreSpecification { tracer.close() where: - tag | value | expected - DDTags.MANUAL_KEEP | true | PrioritySampling.USER_KEEP - DDTags.MANUAL_KEEP | false | null - DDTags.MANUAL_KEEP | "true" | PrioritySampling.USER_KEEP - DDTags.MANUAL_KEEP | "false" | null - DDTags.MANUAL_KEEP | "asdf" | null - - DDTags.MANUAL_DROP | true | PrioritySampling.USER_DROP - DDTags.MANUAL_DROP | false | null - DDTags.MANUAL_DROP | "true" | PrioritySampling.USER_DROP - DDTags.MANUAL_DROP | "false" | null - DDTags.MANUAL_DROP | "asdf" | null + tag | value | expected + DDTags.MANUAL_KEEP | true | PrioritySampling.USER_KEEP + DDTags.MANUAL_KEEP | false | null + DDTags.MANUAL_KEEP | "true" | PrioritySampling.USER_KEEP + DDTags.MANUAL_KEEP | "false" | null + DDTags.MANUAL_KEEP | "asdf" | null + + DDTags.MANUAL_DROP | true | PrioritySampling.USER_DROP + DDTags.MANUAL_DROP | false | null + DDTags.MANUAL_DROP | "true" | PrioritySampling.USER_DROP + DDTags.MANUAL_DROP | "false" | null + DDTags.MANUAL_DROP | "asdf" | null + + Tags.SAMPLING_PRIORITY | -1 | PrioritySampling.USER_DROP + Tags.SAMPLING_PRIORITY | 0 | PrioritySampling.USER_DROP + Tags.SAMPLING_PRIORITY | 1 | PrioritySampling.USER_KEEP + Tags.SAMPLING_PRIORITY | 2 | PrioritySampling.USER_KEEP + Tags.SAMPLING_PRIORITY | "-1" | PrioritySampling.USER_DROP + Tags.SAMPLING_PRIORITY | "0" | PrioritySampling.USER_DROP + Tags.SAMPLING_PRIORITY | "1" | PrioritySampling.USER_KEEP + Tags.SAMPLING_PRIORITY | "2" | PrioritySampling.USER_KEEP + Tags.SAMPLING_PRIORITY | "asdf" | null } def "set error flag when error tag reported"() {