From 3fefc0d95ff83e3136b301d05ccba970ad82fd32 Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Fri, 29 Nov 2024 15:07:59 +0100 Subject: [PATCH 1/8] add latency trace interceptor --- .../datadog/trace/api/ConfigDefaults.java | 1 + .../trace/api/config/TracerConfig.java | 2 +- .../interceptor/AbstractTraceInterceptor.java | 3 ++ .../java/datadog/trace/core/CoreTracer.java | 5 ++ .../LatencyTraceInterceptor.java | 36 +++++++++++++++ .../LatencyTraceInterceptorTest.groovy | 46 +++++++++++++++++++ .../main/java/datadog/trace/api/Config.java | 20 ++++++++ 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java create mode 100644 dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy diff --git a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java index 5319aa9a18f..9aaba32bb56 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java @@ -69,6 +69,7 @@ public final class ConfigDefaults { static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX = false; static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST = false; static final String DEFAULT_DB_DBM_PROPAGATION_MODE_MODE = "disabled"; + static final int DEFAULT_TRACE_LATENCY_INTERCEPTOR_VALUE = -1; static final int DEFAULT_SCOPE_DEPTH_LIMIT = 100; static final int DEFAULT_SCOPE_ITERATION_KEEP_ALIVE = 30; // in seconds static final int DEFAULT_PARTIAL_FLUSH_MIN_SPANS = 1000; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index cd48250cb27..a48bc69f0c4 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -73,7 +73,7 @@ public final class TracerConfig { public static final String TRACE_HTTP_CLIENT_ERROR_STATUSES = "trace.http.client.error.statuses"; public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; - + public static final String TRACE_LATENCY_INTERCEPTOR_VALUE = "trace.latency.interceptor.value"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; public static final String SCOPE_STRICT_MODE = "trace.scope.strict.mode"; public static final String SCOPE_ITERATION_KEEP_ALIVE = "trace.scope.iteration.keep.alive"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/AbstractTraceInterceptor.java b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/AbstractTraceInterceptor.java index 0afc6229083..b155e585a94 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/AbstractTraceInterceptor.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/AbstractTraceInterceptor.java @@ -22,6 +22,9 @@ public enum Priority { DD_INTAKE(2), GIT_METADATA(3), + // trace custom sampling + ROOT_SPAN_LATENCY(Integer.MAX_VALUE - 2), + // trace data collection CI_VISIBILITY_TELEMETRY(Integer.MAX_VALUE - 1), SERVICE_NAME_COLLECTING(Integer.MAX_VALUE); 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 d4e01b3adfc..fb64d80e051 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 @@ -88,6 +88,7 @@ import datadog.trace.core.scopemanager.ContinuableScopeManager; import datadog.trace.core.taginterceptor.RuleFlags; import datadog.trace.core.taginterceptor.TagInterceptor; +import datadog.trace.core.traceinterceptor.LatencyTraceInterceptor; import datadog.trace.lambda.LambdaHandler; import datadog.trace.relocate.api.RatelimitedLogger; import datadog.trace.util.AgentTaskScheduler; @@ -745,6 +746,10 @@ private CoreTracer( addTraceInterceptor(GitMetadataTraceInterceptor.INSTANCE); } + if (config.isTraceLatencyInterceptorEnabled()) { + addTraceInterceptor(LatencyTraceInterceptor.INSTANCE); + } + this.instrumentationGateway = instrumentationGateway; callbackProviderAppSec = instrumentationGateway.getCallbackProvider(RequestContextSlot.APPSEC); callbackProviderIast = instrumentationGateway.getCallbackProvider(RequestContextSlot.IAST); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java new file mode 100644 index 00000000000..9c09257ae63 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java @@ -0,0 +1,36 @@ +package datadog.trace.core.traceinterceptor; + +import datadog.trace.api.Config; +import datadog.trace.api.DDTags; +import datadog.trace.api.interceptor.AbstractTraceInterceptor; +import datadog.trace.api.interceptor.MutableSpan; +import datadog.trace.api.interceptor.TraceInterceptor; +import java.util.Collection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LatencyTraceInterceptor extends AbstractTraceInterceptor { + private static final Logger log = LoggerFactory.getLogger(LatencyTraceInterceptor.class); + // duration configured in ms, need to be converted in nano seconds + private static final int LATENCY = Config.get().getTraceLatencyInterceptorValue() * 1000000; + + public static final TraceInterceptor INSTANCE = + new LatencyTraceInterceptor(Priority.ROOT_SPAN_LATENCY); + + protected LatencyTraceInterceptor(Priority priority) { + super(priority); + } + + @Override + public Collection onTraceComplete( + Collection latencyTrace) { + if (latencyTrace.isEmpty()) { + return latencyTrace; + } + MutableSpan rootSpan = latencyTrace.iterator().next().getLocalRootSpan(); + if (rootSpan != null && rootSpan.getDurationNano() > LATENCY) { + rootSpan.setTag(DDTags.MANUAL_KEEP, true); + } + return latencyTrace; + } +} diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy new file mode 100644 index 00000000000..10408b9fe3d --- /dev/null +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy @@ -0,0 +1,46 @@ +package datadog.trace.core.traceinterceptor + +import datadog.trace.api.DDTags +import datadog.trace.common.writer.ListWriter + +import datadog.trace.core.test.DDCoreSpecification + +import spock.lang.Timeout + +@Timeout(10) +class LatencyTraceInterceptorTest extends DDCoreSpecification { + + + def "test set sampling priority according to latency"() { + setup: + def writer = new ListWriter() + def props = new Properties() + props.setProperty("trace.partial.flush.enabled", partialFlushEnabled) + props.setProperty("trace.latency.interceptor.value", latencyThreshold) + + def tracer = tracerBuilder().withProperties(props).writer(writer).build() + + def spanSetup = tracer.buildSpan("test","my_operation_name").withTag(tagname, true).start() + sleep(duration) + spanSetup.finish() + + expect: + def trace = writer.firstTrace() + trace.size() == 1 + def span = trace[0] + + span.context().getSamplingPriority() == expected + + tracer.close() + where: + partialFlushEnabled | latencyThreshold | tagname | duration | expected + "true" | "102" | DDTags.MANUAL_KEEP | 100 | 2 + "true" | "102" | DDTags.MANUAL_DROP | 100 | -1 + "true" | "102" | DDTags.MANUAL_KEEP | 105 | 2 + "true" | "102" | DDTags.MANUAL_DROP | 105 | -1 + // "false" | "102" | DDTags.MANUAL_KEEP | 100 | 2 + // "false" | "102" | DDTags.MANUAL_DROP | 100 | -1 + // "false" | "102" | DDTags.MANUAL_KEEP | 105 | 2 + // "false" | "102" | DDTags.MANUAL_DROP | 105 | 2 + } +} 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 a67d0c519bb..c50f4946be6 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -176,6 +176,8 @@ public static String getHostName() { private final boolean scopeStrictMode; private final int scopeIterationKeepAlive; private final int partialFlushMinSpans; + private final int traceLatencyInterceptorValue; + private final boolean traceLatencyInterceptorEnabled; private final boolean traceStrictWritesEnabled; private final boolean logExtractHeaderNames; private final Set propagationStylesToExtract; @@ -860,6 +862,12 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins ? 0 : configProvider.getInteger(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS); + traceLatencyInterceptorValue = + configProvider.getInteger( + TRACE_LATENCY_INTERCEPTOR_VALUE, DEFAULT_TRACE_LATENCY_INTERCEPTOR_VALUE); + + traceLatencyInterceptorEnabled = !partialFlushEnabled && (traceLatencyInterceptorValue >= 0); + traceStrictWritesEnabled = configProvider.getBoolean(TRACE_STRICT_WRITES_ENABLED, false); logExtractHeaderNames = @@ -2075,6 +2083,14 @@ public int getPartialFlushMinSpans() { return partialFlushMinSpans; } + public int getTraceLatencyInterceptorValue() { + return traceLatencyInterceptorValue; + } + + public boolean isTraceLatencyInterceptorEnabled() { + return traceLatencyInterceptorEnabled; + } + public boolean isTraceStrictWritesEnabled() { return traceStrictWritesEnabled; } @@ -4158,6 +4174,10 @@ public String toString() { + scopeIterationKeepAlive + ", partialFlushMinSpans=" + partialFlushMinSpans + + ", traceLatencyInterceptorEnabled=" + + traceLatencyInterceptorEnabled + + ", traceLatencyInterceptorValue=" + + traceLatencyInterceptorValue + ", traceStrictWritesEnabled=" + traceStrictWritesEnabled + ", tracePropagationStylesToExtract=" From c1a79783e0ec687ee62a2f54e97532ee7e9468bf Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Fri, 29 Nov 2024 16:48:26 +0100 Subject: [PATCH 2/8] Fix text --- .../LatencyTraceInterceptorTest.groovy | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy index 10408b9fe3d..b647040badc 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy @@ -13,34 +13,38 @@ class LatencyTraceInterceptorTest extends DDCoreSpecification { def "test set sampling priority according to latency"() { setup: - def writer = new ListWriter() - def props = new Properties() - props.setProperty("trace.partial.flush.enabled", partialFlushEnabled) - props.setProperty("trace.latency.interceptor.value", latencyThreshold) - def tracer = tracerBuilder().withProperties(props).writer(writer).build() + injectSysConfig("trace.partial.flush.enabled", partialFlushEnabled) + injectSysConfig("trace.latency.interceptor.value", latencyThreshold) + + when: + def writer = new ListWriter() + def tracer = tracerBuilder().writer(writer).build() - def spanSetup = tracer.buildSpan("test","my_operation_name").withTag(tagname, true).start() - sleep(duration) + def spanSetup = tracer.buildSpan("test","my_operation_name").withTag(priorityTag, true).start() + sleep(minDuration) spanSetup.finish() - expect: + then: def trace = writer.firstTrace() trace.size() == 1 def span = trace[0] - span.context().getSamplingPriority() == expected + cleanup: tracer.close() + where: - partialFlushEnabled | latencyThreshold | tagname | duration | expected - "true" | "102" | DDTags.MANUAL_KEEP | 100 | 2 - "true" | "102" | DDTags.MANUAL_DROP | 100 | -1 - "true" | "102" | DDTags.MANUAL_KEEP | 105 | 2 - "true" | "102" | DDTags.MANUAL_DROP | 105 | -1 - // "false" | "102" | DDTags.MANUAL_KEEP | 100 | 2 - // "false" | "102" | DDTags.MANUAL_DROP | 100 | -1 - // "false" | "102" | DDTags.MANUAL_KEEP | 105 | 2 - // "false" | "102" | DDTags.MANUAL_DROP | 105 | 2 + partialFlushEnabled | latencyThreshold | priorityTag | minDuration | expected + "true" | "200" | DDTags.MANUAL_KEEP | 10 | 2 + "true" | "200" | DDTags.MANUAL_DROP | 10 | -1 + "true" | "200" | DDTags.MANUAL_KEEP | 300 | 2 + "true" | "200" | DDTags.MANUAL_DROP | 300 | -1 + "false" | "200" | DDTags.MANUAL_KEEP | 10 | 2 + "false" | "200" | DDTags.MANUAL_DROP | 10 | -1 + "false" | "200" | DDTags.MANUAL_KEEP | 300 | 2 + "false" | "200" | DDTags.MANUAL_DROP | 300 | 2 } + + } From ea65fd8a476bce11fd1926185f5858384e8fa06c Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Fri, 29 Nov 2024 17:11:16 +0100 Subject: [PATCH 3/8] add comments --- .../main/java/datadog/trace/api/ConfigDefaults.java | 1 + .../java/datadog/trace/api/config/TracerConfig.java | 1 + .../core/traceinterceptor/LatencyTraceInterceptor.java | 10 ++++++++++ .../LatencyTraceInterceptorTest.groovy | 2 -- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java index 9aaba32bb56..1b2383ce991 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java @@ -69,6 +69,7 @@ public final class ConfigDefaults { static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX = false; static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST = false; static final String DEFAULT_DB_DBM_PROPAGATION_MODE_MODE = "disabled"; + // Default value is set to -1, it disables the latency trace interceptor static final int DEFAULT_TRACE_LATENCY_INTERCEPTOR_VALUE = -1; static final int DEFAULT_SCOPE_DEPTH_LIMIT = 100; static final int DEFAULT_SCOPE_ITERATION_KEEP_ALIVE = 30; // in seconds diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index a48bc69f0c4..aa595d522e4 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -73,6 +73,7 @@ public final class TracerConfig { public static final String TRACE_HTTP_CLIENT_ERROR_STATUSES = "trace.http.client.error.statuses"; public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; + // trace latency interceptor value should be in ms public static final String TRACE_LATENCY_INTERCEPTOR_VALUE = "trace.latency.interceptor.value"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; public static final String SCOPE_STRICT_MODE = "trace.scope.strict.mode"; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java index 9c09257ae63..c0cf5662396 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java @@ -9,6 +9,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +// This trace latency interceptor is disabled by default. +// We can activate it by setting the value of dd.trace.latency.interceptor.value to a positive value +// This value should be in milliseconds and this interceptor will retain any local trace who has a +// root +// span duration greater than this value. +// The activation of this interceptor is ignored if partial flush is enabled. +// Note that since we're changing the sampling priority at the end of local trace, there is no +// guarantee to get complete traces, +// since the original sampling priority for this trace may have been already propagated. + public class LatencyTraceInterceptor extends AbstractTraceInterceptor { private static final Logger log = LoggerFactory.getLogger(LatencyTraceInterceptor.class); // duration configured in ms, need to be converted in nano seconds diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy index b647040badc..1366cf3b6dd 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy @@ -45,6 +45,4 @@ class LatencyTraceInterceptorTest extends DDCoreSpecification { "false" | "200" | DDTags.MANUAL_KEEP | 300 | 2 "false" | "200" | DDTags.MANUAL_DROP | 300 | 2 } - - } From 955e3822172b01cbffff35eb6fcd960720bccbd8 Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Fri, 29 Nov 2024 17:17:17 +0100 Subject: [PATCH 4/8] improve comments --- .../trace/core/traceinterceptor/LatencyTraceInterceptor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java index c0cf5662396..16bb5f17f90 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java @@ -14,10 +14,11 @@ // This value should be in milliseconds and this interceptor will retain any local trace who has a // root // span duration greater than this value. -// The activation of this interceptor is ignored if partial flush is enabled. +// The activation of this interceptor is ignored if partial flush is enabled in order to avoid +// incomplete local trace (incomplete chunk of trace). // Note that since we're changing the sampling priority at the end of local trace, there is no // guarantee to get complete traces, -// since the original sampling priority for this trace may have been already propagated. +// since the original sampling priority for this trace may have already been propagated. public class LatencyTraceInterceptor extends AbstractTraceInterceptor { private static final Logger log = LoggerFactory.getLogger(LatencyTraceInterceptor.class); From f127aa7a8e4aac8742f1708c34cb0bcfda6a6ab5 Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Thu, 5 Dec 2024 14:00:43 +0100 Subject: [PATCH 5/8] changes after review --- .../datadog/trace/api/ConfigDefaults.java | 4 +-- .../trace/api/config/TracerConfig.java | 2 +- .../java/datadog/trace/core/CoreTracer.java | 2 +- .../LatencyTraceInterceptor.java | 22 +++++++--------- .../LatencyTraceInterceptorTest.groovy | 2 +- .../main/java/datadog/trace/api/Config.java | 26 +++++++++---------- 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java index 1b2383ce991..9c12e7dda8c 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java @@ -69,8 +69,8 @@ public final class ConfigDefaults { static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX = false; static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST = false; static final String DEFAULT_DB_DBM_PROPAGATION_MODE_MODE = "disabled"; - // Default value is set to -1, it disables the latency trace interceptor - static final int DEFAULT_TRACE_LATENCY_INTERCEPTOR_VALUE = -1; + // Default value is set to 0, it disables the latency trace interceptor + static final int DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS = 0; static final int DEFAULT_SCOPE_DEPTH_LIMIT = 100; static final int DEFAULT_SCOPE_ITERATION_KEEP_ALIVE = 30; // in seconds static final int DEFAULT_PARTIAL_FLUSH_MIN_SPANS = 1000; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index aa595d522e4..bb8d51e644f 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -74,7 +74,7 @@ public final class TracerConfig { public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; // trace latency interceptor value should be in ms - public static final String TRACE_LATENCY_INTERCEPTOR_VALUE = "trace.latency.interceptor.value"; + public static final String TRACE_KEEP_LATENCY_THRESHOLD_MS = "trace.keep.latency.threshold.ms"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; public static final String SCOPE_STRICT_MODE = "trace.scope.strict.mode"; public static final String SCOPE_ITERATION_KEEP_ALIVE = "trace.scope.iteration.keep.alive"; 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 fb64d80e051..4be835039a2 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 @@ -746,7 +746,7 @@ private CoreTracer( addTraceInterceptor(GitMetadataTraceInterceptor.INSTANCE); } - if (config.isTraceLatencyInterceptorEnabled()) { + if (config.isTraceKeepLatencyThresholdEnabled()) { addTraceInterceptor(LatencyTraceInterceptor.INSTANCE); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java index 16bb5f17f90..1f6f5818aa0 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptor.java @@ -9,21 +9,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -// This trace latency interceptor is disabled by default. -// We can activate it by setting the value of dd.trace.latency.interceptor.value to a positive value -// This value should be in milliseconds and this interceptor will retain any local trace who has a -// root -// span duration greater than this value. -// The activation of this interceptor is ignored if partial flush is enabled in order to avoid -// incomplete local trace (incomplete chunk of trace). -// Note that since we're changing the sampling priority at the end of local trace, there is no -// guarantee to get complete traces, -// since the original sampling priority for this trace may have already been propagated. - +/** + * This trace latency interceptor is disabled by default. We can activate it by setting the value of + * dd.trace.latency.interceptor.value to a positive value This value should be in milliseconds and + * this interceptor will retain any local trace who has a root span duration greater than this + * value. The activation of this interceptor is ignored if partial flush is enabled in order to + * avoid incomplete local trace (incomplete chunk of trace). Note that since we're changing the + * sampling priority at the end of local trace, there is no guarantee to get complete traces, since + * the original sampling priority for this trace may have already been propagated. + */ public class LatencyTraceInterceptor extends AbstractTraceInterceptor { private static final Logger log = LoggerFactory.getLogger(LatencyTraceInterceptor.class); // duration configured in ms, need to be converted in nano seconds - private static final int LATENCY = Config.get().getTraceLatencyInterceptorValue() * 1000000; + private static final long LATENCY = Config.get().getTraceKeepLatencyThreshold() * 1000000L; public static final TraceInterceptor INSTANCE = new LatencyTraceInterceptor(Priority.ROOT_SPAN_LATENCY); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy index 1366cf3b6dd..6fd14bb64f5 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy @@ -15,7 +15,7 @@ class LatencyTraceInterceptorTest extends DDCoreSpecification { setup: injectSysConfig("trace.partial.flush.enabled", partialFlushEnabled) - injectSysConfig("trace.latency.interceptor.value", latencyThreshold) + injectSysConfig("trace.keep.latency.threshold.ms", latencyThreshold) when: def writer = new ListWriter() 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 c50f4946be6..e934d7a9382 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -176,8 +176,8 @@ public static String getHostName() { private final boolean scopeStrictMode; private final int scopeIterationKeepAlive; private final int partialFlushMinSpans; - private final int traceLatencyInterceptorValue; - private final boolean traceLatencyInterceptorEnabled; + private final int traceKeepLatencyThreshold; + private final boolean traceKeepLatencyThresholdEnabled; private final boolean traceStrictWritesEnabled; private final boolean logExtractHeaderNames; private final Set propagationStylesToExtract; @@ -862,11 +862,11 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins ? 0 : configProvider.getInteger(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS); - traceLatencyInterceptorValue = + traceKeepLatencyThreshold = configProvider.getInteger( - TRACE_LATENCY_INTERCEPTOR_VALUE, DEFAULT_TRACE_LATENCY_INTERCEPTOR_VALUE); + TRACE_KEEP_LATENCY_THRESHOLD_MS, DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS); - traceLatencyInterceptorEnabled = !partialFlushEnabled && (traceLatencyInterceptorValue >= 0); + traceKeepLatencyThresholdEnabled = !partialFlushEnabled && (traceKeepLatencyThreshold > 0); traceStrictWritesEnabled = configProvider.getBoolean(TRACE_STRICT_WRITES_ENABLED, false); @@ -2083,12 +2083,12 @@ public int getPartialFlushMinSpans() { return partialFlushMinSpans; } - public int getTraceLatencyInterceptorValue() { - return traceLatencyInterceptorValue; + public int getTraceKeepLatencyThreshold() { + return traceKeepLatencyThreshold; } - public boolean isTraceLatencyInterceptorEnabled() { - return traceLatencyInterceptorEnabled; + public boolean isTraceKeepLatencyThresholdEnabled() { + return traceKeepLatencyThresholdEnabled; } public boolean isTraceStrictWritesEnabled() { @@ -4174,10 +4174,10 @@ public String toString() { + scopeIterationKeepAlive + ", partialFlushMinSpans=" + partialFlushMinSpans - + ", traceLatencyInterceptorEnabled=" - + traceLatencyInterceptorEnabled - + ", traceLatencyInterceptorValue=" - + traceLatencyInterceptorValue + + ", traceKeepLatencyThresholdEnabled=" + + traceKeepLatencyThresholdEnabled + + ", traceKeepLatencyThreshold=" + + traceKeepLatencyThreshold + ", traceStrictWritesEnabled=" + traceStrictWritesEnabled + ", tracePropagationStylesToExtract=" From 16496e9c5ca42a9b510824406b718d86c998b0fa Mon Sep 17 00:00:00 2001 From: cecile <32452337+cecile75@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:57:46 +0100 Subject: [PATCH 6/8] Add "experimental" in configuration key Co-authored-by: Brian Marks --- .../src/main/java/datadog/trace/api/config/TracerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index bb8d51e644f..f30d0f86eb2 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -74,7 +74,7 @@ public final class TracerConfig { public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; // trace latency interceptor value should be in ms - public static final String TRACE_KEEP_LATENCY_THRESHOLD_MS = "trace.keep.latency.threshold.ms"; + public static final String TRACE_KEEP_LATENCY_THRESHOLD_MS = "trace.experimental.keep.latency.threshold.ms"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; public static final String SCOPE_STRICT_MODE = "trace.scope.strict.mode"; public static final String SCOPE_ITERATION_KEEP_ALIVE = "trace.scope.iteration.keep.alive"; From a287c8d996526947d38d25ad0c504588621cc860 Mon Sep 17 00:00:00 2001 From: cecile <32452337+cecile75@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:58:07 +0100 Subject: [PATCH 7/8] Add "experimental" in configuration key (for tests) Co-authored-by: Brian Marks --- .../core/traceinterceptor/LatencyTraceInterceptorTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy index 6fd14bb64f5..e0ed91db723 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.groovy @@ -15,7 +15,7 @@ class LatencyTraceInterceptorTest extends DDCoreSpecification { setup: injectSysConfig("trace.partial.flush.enabled", partialFlushEnabled) - injectSysConfig("trace.keep.latency.threshold.ms", latencyThreshold) + injectSysConfig("trace.experimental.keep.latency.threshold.ms", latencyThreshold) when: def writer = new ListWriter() From d63fbf5cd62090b22a52f5bb4bd5bd92c1cec758 Mon Sep 17 00:00:00 2001 From: Cecile Terpin <“cecile.terpin@datadoghq.com”> Date: Thu, 5 Dec 2024 16:42:13 +0100 Subject: [PATCH 8/8] spotlessApply --- .../src/main/java/datadog/trace/api/config/TracerConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index f30d0f86eb2..b3426d8d989 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -74,7 +74,8 @@ public final class TracerConfig { public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; // trace latency interceptor value should be in ms - public static final String TRACE_KEEP_LATENCY_THRESHOLD_MS = "trace.experimental.keep.latency.threshold.ms"; + public static final String TRACE_KEEP_LATENCY_THRESHOLD_MS = + "trace.experimental.keep.latency.threshold.ms"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; public static final String SCOPE_STRICT_MODE = "trace.scope.strict.mode"; public static final String SCOPE_ITERATION_KEEP_ALIVE = "trace.scope.iteration.keep.alive";