From 6804c8c1897660f9b0c2a280aa5ff8ff7dde96fe Mon Sep 17 00:00:00 2001 From: "alejandro.gonzalez" Date: Tue, 21 May 2024 08:34:39 +0200 Subject: [PATCH] tracing libraries must configure the tracer sampling mechanism so that, by default, 1 trace per minute gets sent. --- .../trace/common/sampling/Sampler.java | 4 ++ .../sampling/ServiceAsmTimeTraceSampler.java | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 dd-trace-core/src/main/java/datadog/trace/common/sampling/ServiceAsmTimeTraceSampler.java diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java index 9efc911d54f..744612271da 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java @@ -34,6 +34,10 @@ final class Builder { public static Sampler forConfig(final Config config, final TraceConfig traceConfig) { Sampler sampler; if (config != null) { + if(!config.isTraceEnabled() && config.areTracingDependantProductsEnabled()){ + log.debug("APM is disabled. Only 1 trace per minute will be sent."); + return new ServiceAsmTimeTraceSampler(); + } final Map serviceRules = config.getTraceSamplingServiceRules(); final Map operationRules = config.getTraceSamplingOperationRules(); List traceSamplingRules; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/ServiceAsmTimeTraceSampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/ServiceAsmTimeTraceSampler.java new file mode 100644 index 00000000000..cf881b29d40 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/ServiceAsmTimeTraceSampler.java @@ -0,0 +1,45 @@ +package datadog.trace.common.sampling; + +import datadog.trace.api.sampling.SamplingMechanism; +import datadog.trace.core.CoreSpan; +import datadog.trace.core.util.SimpleRateLimiter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class ServiceAsmTimeTraceSampler implements Sampler, PrioritySampler { + + private static final Logger log = LoggerFactory.getLogger(ServiceAsmTimeTraceSampler.class); + + private final SimpleRateLimiter rateLimiter; + + public ServiceAsmTimeTraceSampler() { + this.rateLimiter = new SimpleRateLimiter(60); //one per minute + } + + @Override + public > boolean sample(final T span) { + // Priority sampling sends all traces to the core agent, including traces marked dropped. + // This allows the core agent to collect stats on all traces. + return true; + } + + @Override + public > void setSamplingPriority(final T span) { + + //TODO check how to short circuit this for ASM + + if (rateLimiter.tryAcquire()) { + span.setSamplingPriority( + PrioritySampling.SAMPLER_KEEP, + SamplingMechanism.DEFAULT); + } else { + span.setSamplingPriority( + PrioritySampling.SAMPLER_DROP, + SamplingMechanism.DEFAULT); + } + + } + +}