Skip to content

Commit 6edbab8

Browse files
committed
RUM-10930: dogfood experiment - making Sampler backward compatible with AndroidTracer
1 parent 0862c56 commit 6edbab8

File tree

5 files changed

+324
-38
lines changed

5 files changed

+324
-38
lines changed

features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/common/sampling/RateByServiceTraceSampler.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.datadog.trace.common.sampling;
22

3+
import com.datadog.android.trace.internal.compat.function.Function;
34
import com.datadog.trace.api.cache.DDCache;
45
import com.datadog.trace.api.cache.DDCaches;
56
import com.datadog.trace.api.sampling.PrioritySampling;
@@ -12,21 +13,26 @@
1213

1314
import java.util.HashMap;
1415
import java.util.Map;
15-
import com.datadog.android.trace.internal.compat.function.Function;
1616

1717
/**
1818
* A rate sampler which maintains different sample rates per service+env name.
1919
*
2020
* <p>The configuration of (serviceName,env)->rate is configured by the core agent.
2121
*/
2222
public class RateByServiceTraceSampler implements Sampler, PrioritySampler, RemoteResponseListener {
23+
private static final double DEFAULT_RATE = 1.0;
2324

25+
private volatile RateSamplersByEnvAndService serviceRates;
2426
private static final Logger log = LoggerFactory.getLogger(RateByServiceTraceSampler.class);
2527
public static final String SAMPLING_AGENT_RATE = "_dd.agent_psr";
2628

27-
private static final double DEFAULT_RATE = 1.0;
29+
public RateByServiceTraceSampler() {
30+
this(DEFAULT_RATE);
31+
}
2832

29-
private volatile RateSamplersByEnvAndService serviceRates = new RateSamplersByEnvAndService();
33+
public RateByServiceTraceSampler(Double defaultSampleRate) {
34+
serviceRates = new RateSamplersByEnvAndService(defaultSampleRate);
35+
}
3036

3137
@Override
3238
public <T extends CoreSpan<T>> boolean sample(final T span) {
@@ -86,7 +92,7 @@ public void onResponse(
8692
RateByServiceTraceSampler.createRateSampler(entry.getValue().doubleValue()));
8793
}
8894
}
89-
serviceRates = new RateSamplersByEnvAndService(updatedEnvServiceRates);
95+
serviceRates = new RateSamplersByEnvAndService(updatedEnvServiceRates, serviceRates.getSampleRate());
9096
}
9197
}
9298

@@ -105,16 +111,19 @@ private static RateSampler createRateSampler(final double sampleRate) {
105111
}
106112

107113
private static final class RateSamplersByEnvAndService {
108-
private static final RateSampler DEFAULT = createRateSampler(DEFAULT_RATE);
114+
private final double sampleRate;
115+
private final RateSampler defaultSampler;
109116

110117
private final Map<String, Map<String, RateSampler>> envServiceRates;
111118

112-
RateSamplersByEnvAndService() {
113-
this(new HashMap<>(0));
119+
RateSamplersByEnvAndService(double defaultSampleRate) {
120+
this(new HashMap<>(0), defaultSampleRate);
114121
}
115122

116-
RateSamplersByEnvAndService(Map<String, Map<String, RateSampler>> envServiceRates) {
123+
RateSamplersByEnvAndService(Map<String, Map<String, RateSampler>> envServiceRates, double sampleRate) {
124+
this.sampleRate = sampleRate;
117125
this.envServiceRates = envServiceRates;
126+
this.defaultSampler = createRateSampler(sampleRate);
118127
}
119128

120129
// used in tests only
@@ -125,10 +134,14 @@ RateSampler getSampler(EnvAndService envAndService) {
125134
public RateSampler getSampler(String env, String service) {
126135
Map<String, RateSampler> serviceRates = envServiceRates.get(env);
127136
if (serviceRates == null) {
128-
return DEFAULT;
137+
return defaultSampler;
129138
}
130139
RateSampler sampler = serviceRates.get(service);
131-
return null == sampler ? DEFAULT : sampler;
140+
return null == sampler ? defaultSampler : sampler;
141+
}
142+
143+
public double getSampleRate() {
144+
return sampleRate;
132145
}
133146
}
134147

features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/common/sampling/Sampler.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,8 @@ public static Sampler forConfig(final Config config, final TraceConfig traceConf
5252
}
5353
Double traceSampleRate =
5454
null != traceConfig ? traceConfig.getTraceSampleRate() : config.getTraceSampleRate();
55-
if (serviceRulesDefined
56-
|| operationRulesDefined
57-
|| jsonTraceSamplingRulesDefined
58-
|| traceSampleRate != null) {
59-
try {
60-
sampler =
61-
RuleBasedTraceSampler.build(
62-
serviceRules,
63-
operationRules,
64-
traceSamplingRules,
65-
traceSampleRate,
66-
config.getTraceRateLimit());
67-
} catch (final IllegalArgumentException e) {
68-
log.error("Invalid sampler configuration. Using AllSampler", e);
69-
sampler = new AllSampler();
70-
}
55+
if (traceSampleRate != null) {
56+
sampler = new RateByServiceTraceSampler(traceSampleRate);
7157
} else if (config.isPrioritySamplingEnabled()) {
7258
if (KEEP.equalsIgnoreCase(config.getPrioritySamplingForce())) {
7359
log.debug("Force Sampling Priority to: SAMPLER_KEEP.");

reliability/single-fit/okhttp/src/test/kotlin/com/datadog/android/okhttp/HeadBasedSamplingTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class HeadBasedSamplingTest {
329329

330330
// Then
331331
val requestSent = mockServer.takeRequest()
332-
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("2")
332+
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("1")
333333
val leastSignificantTraceId = requestSent.getHeader(DATADOG_TRACE_ID_HEADER)
334334
checkNotNull(leastSignificantTraceId)
335335
val spanId = requestSent.getHeader(DATADOG_SPAN_ID_HEADER)
@@ -352,8 +352,8 @@ class HeadBasedSamplingTest {
352352
)
353353
hasMostSignificant64BitsTraceId(mostSignificantTraceId)
354354
hasParentId("0000000000000000")
355-
hasRulePsr(1.0)
356-
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.USER_KEEP)
355+
hasAgentPsr(1.0)
356+
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.SAMPLER_KEEP)
357357
hasGenericMetricValue("_top_level", 1)
358358
}
359359

@@ -376,7 +376,7 @@ class HeadBasedSamplingTest {
376376
hasName("okhttp.request")
377377
hasResource("http://${mockServer.hostName}:${mockServer.port}/")
378378
hasNoAgentPsr()
379-
hasSamplingPriority(2)
379+
hasNoSamplingPriority()
380380
hasNoGenericMetric("_top_level")
381381
hasSpanKind("client")
382382
hasHttpMethod("GET")
@@ -425,7 +425,7 @@ class HeadBasedSamplingTest {
425425

426426
// Then
427427
val requestSent = mockServer.takeRequest()
428-
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("2")
428+
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("1")
429429
val leastSignificantTraceId = requestSent.getHeader(DATADOG_TRACE_ID_HEADER)
430430
checkNotNull(leastSignificantTraceId)
431431
val spanId = requestSent.getHeader(DATADOG_SPAN_ID_HEADER)
@@ -449,8 +449,8 @@ class HeadBasedSamplingTest {
449449
hasMostSignificant64BitsTraceId(mostSignificantTraceId)
450450
hasParentId("0000000000000000")
451451
// OpenTelemetry span will have _dd.rule_psr instead of _dd.agent_psr
452-
hasRulePsr(1.0)
453-
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.USER_KEEP)
452+
hasAgentPsr(1.0)
453+
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.SAMPLER_KEEP)
454454
hasGenericMetricValue("_top_level", 1)
455455
}
456456

@@ -473,7 +473,7 @@ class HeadBasedSamplingTest {
473473
hasName("okhttp.request")
474474
hasResource("http://${mockServer.hostName}:${mockServer.port}/")
475475
hasNoAgentPsr()
476-
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.USER_KEEP)
476+
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.SAMPLER_KEEP)
477477
hasNoGenericMetric("_top_level")
478478
hasSpanKind("client")
479479
hasHttpMethod("GET")
@@ -574,7 +574,7 @@ class HeadBasedSamplingTest {
574574

575575
// Then
576576
val requestSent = mockServer.takeRequest()
577-
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("2")
577+
assertThat(requestSent.getHeader(DATADOG_SAMPLING_PRIORITY_HEADER)).isEqualTo("1")
578578
val leastSignificantTraceId = requestSent.getHeader(DATADOG_TRACE_ID_HEADER)
579579
checkNotNull(leastSignificantTraceId)
580580
val spanId = requestSent.getHeader(DATADOG_SPAN_ID_HEADER)
@@ -597,8 +597,8 @@ class HeadBasedSamplingTest {
597597
)
598598
hasMostSignificant64BitsTraceId(mostSignificantTraceId)
599599
hasParentId("0000000000000000")
600-
hasRulePsr(1.0)
601-
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.USER_KEEP)
600+
hasAgentPsr(1.0)
601+
hasSamplingPriority(DatadogTracingConstants.PrioritySampling.SAMPLER_KEEP)
602602
hasGenericMetricValue("_top_level", 1)
603603
}
604604

@@ -623,7 +623,7 @@ class HeadBasedSamplingTest {
623623
hasNoAgentPsr()
624624
// this one will have sampling priority unlike in case of propagation with tagged Span directly,
625625
// because there sampling priority is not yet set at the parent during child creation
626-
hasSamplingPriority(2)
626+
hasSamplingPriority(1)
627627
hasNoGenericMetric("_top_level")
628628
hasSpanKind("client")
629629
hasHttpMethod("GET")

0 commit comments

Comments
 (0)