Skip to content

Commit c3dfa0b

Browse files
committed
special standalone sampler should only be used when tracing is disabled and appsec/iast are enabled
1 parent 0125288 commit c3dfa0b

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

dd-trace-core/src/main/java/datadog/trace/common/sampling/ApmTracingDisabledSampler.java renamed to dd-trace-core/src/main/java/datadog/trace/common/sampling/AsmStandaloneSampler.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
import org.slf4j.LoggerFactory;
1212

1313
/**
14-
* This class is designed to only allow 1 APM trace per minute for apm tracing disabled. The service
15-
* catalog and the billing need a continuous ingestion of at least at 1 trace per minute to consider
16-
* a service as being live and billable. In the absence of other products events, no APM traces must
17-
* be sent, so we need to let some regular APM traces go through.
14+
* This class is designed to only allow 1 APM trace per minute as standalone ASM is only interested
15+
* in the traces containing ASM events. But the service catalog and the billing need a continuous
16+
* ingestion of at least at 1 trace per minute to consider a service as being live and billable. In
17+
* the absence of ASM events, no APM traces must be sent, so we need to let some regular APM traces
18+
* go through, even in the absence of ASM events.
1819
*/
19-
public class ApmTracingDisabledSampler implements Sampler, PrioritySampler {
20+
public class AsmStandaloneSampler implements Sampler, PrioritySampler {
2021

21-
private static final Logger log = LoggerFactory.getLogger(ApmTracingDisabledSampler.class);
22+
private static final Logger log = LoggerFactory.getLogger(AsmStandaloneSampler.class);
2223
private static final int RATE_IN_MILLISECONDS = 60000; // 1 minute
2324

2425
private final AtomicLong lastSampleTime;
2526
private final Clock clock;
2627

27-
public ApmTracingDisabledSampler(final Clock clock) {
28+
public AsmStandaloneSampler(final Clock clock) {
2829
this.clock = clock;
2930
this.lastSampleTime = new AtomicLong(clock.millis() - RATE_IN_MILLISECONDS);
3031
}
@@ -41,10 +42,10 @@ public <T extends CoreSpan<T>> void setSamplingPriority(final T span) {
4142

4243
if (shouldSample()) {
4344
log.debug("Set SAMPLER_KEEP for span {}", span.getSpanId());
44-
span.setSamplingPriority(SAMPLER_KEEP, SamplingMechanism.DEFAULT);
45+
span.setSamplingPriority(SAMPLER_KEEP, SamplingMechanism.APPSEC);
4546
} else {
4647
log.debug("Set SAMPLER_DROP for span {}", span.getSpanId());
47-
span.setSamplingPriority(SAMPLER_DROP, SamplingMechanism.DEFAULT);
48+
span.setSamplingPriority(SAMPLER_DROP, SamplingMechanism.APPSEC);
4849
}
4950
}
5051

dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static datadog.trace.bootstrap.instrumentation.api.SamplerConstants.KEEP;
55

66
import datadog.trace.api.Config;
7+
import datadog.trace.api.ProductActivation;
78
import datadog.trace.api.TraceConfig;
89
import datadog.trace.api.config.TracerConfig;
910
import datadog.trace.api.sampling.PrioritySampling;
@@ -35,9 +36,11 @@ final class Builder {
3536
public static Sampler forConfig(final Config config, final TraceConfig traceConfig) {
3637
Sampler sampler;
3738
if (config != null) {
38-
if (!config.isApmTracingEnabled()) {
39+
if (!config.isApmTracingEnabled()
40+
&& (config.getAppSecActivation() == ProductActivation.FULLY_ENABLED
41+
|| config.getIastActivation() == ProductActivation.FULLY_ENABLED)) {
3942
log.debug("APM is disabled. Only 1 trace per minute will be sent.");
40-
return new ApmTracingDisabledSampler(Clock.systemUTC());
43+
return new AsmStandaloneSampler(Clock.systemUTC());
4144
}
4245
final Map<String, String> serviceRules = config.getTraceSamplingServiceRules();
4346
final Map<String, String> operationRules = config.getTraceSamplingOperationRules();
+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import datadog.trace.api.sampling.PrioritySampling
77
import java.time.Clock
88
import java.util.concurrent.atomic.AtomicLong
99

10-
class ApmTracingDisabledSamplerTest extends DDCoreSpecification{
10+
class AsmStandaloneSamplerTest extends DDCoreSpecification{
1111

1212
def writer = new ListWriter()
1313

@@ -19,7 +19,7 @@ class ApmTracingDisabledSamplerTest extends DDCoreSpecification{
1919
current.get()
2020
}
2121
}
22-
def sampler = new ApmTracingDisabledSampler(clock)
22+
def sampler = new AsmStandaloneSampler(clock)
2323
def tracer = tracerBuilder().writer(writer).sampler(sampler).build()
2424

2525
when:

dd-trace-core/src/test/groovy/datadog/trace/common/sampling/SamplerTest.groovy

+39-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,52 @@ import datadog.trace.test.util.DDSpecification
55

66
class SamplerTest extends DDSpecification{
77

8-
void "test that TimeSampler is selected when experimentalAppSecStandalone is enabled"() {
8+
void "test that AsmStandaloneSampler is selected when apm tracing disabled and appsec enabled is enabled"() {
99
setup:
1010
System.setProperty("dd.apm.tracing.enabled", "false")
11+
System.setProperty("dd.appsec.enabled", "true")
1112
Config config = new Config()
1213

1314
when:
1415
Sampler sampler = Sampler.Builder.forConfig(config, null)
1516

1617
then:
17-
sampler instanceof ApmTracingDisabledSampler
18+
sampler instanceof AsmStandaloneSampler
19+
}
20+
21+
void "test that AsmStandaloneSampler is selected when apm tracing disabled and iast enabled is enabled"() {
22+
setup:
23+
System.setProperty("dd.apm.tracing.enabled", "false")
24+
System.setProperty("dd.iast.enabled", "true")
25+
Config config = new Config()
26+
27+
when:
28+
Sampler sampler = Sampler.Builder.forConfig(config, null)
29+
30+
then:
31+
sampler instanceof AsmStandaloneSampler
32+
}
33+
34+
void "test that AsmStandaloneSampler is not selected when apm tracing and asm not enabled"() {
35+
setup:
36+
System.setProperty("dd.apm.tracing.enabled", "false")
37+
Config config = new Config()
38+
39+
when:
40+
Sampler sampler = Sampler.Builder.forConfig(config, null)
41+
42+
then:
43+
!(sampler instanceof AsmStandaloneSampler)
44+
}
45+
46+
void "test that AsmStandaloneSampler is not selected when apm tracing and asm not enabled"() {
47+
setup:
48+
Config config = new Config()
49+
50+
when:
51+
Sampler sampler = Sampler.Builder.forConfig(config, null)
52+
53+
then:
54+
!(sampler instanceof AsmStandaloneSampler)
1855
}
1956
}

0 commit comments

Comments
 (0)