Skip to content

Commit 2f90ba6

Browse files
committed
feat(core): support OTel tracestate sampling
1 parent 1563631 commit 2f90ba6

16 files changed

Lines changed: 978 additions & 56 deletions

File tree

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,19 @@ public <T extends CoreSpan<T>> void setSamplingPriority(final T span) {
5858

5959
final RateSamplersByEnvAndService rates = serviceRates;
6060
RateSampler sampler = rates.getSampler(env, serviceName);
61+
boolean sampled = sampler.sample(span);
62+
int samplingPriority = sampled ? PrioritySampling.SAMPLER_KEEP : PrioritySampling.SAMPLER_DROP;
6163

62-
if (sampler.sample(span)) {
64+
if (rates.hasAgentRates()) {
6365
span.setSamplingPriority(
64-
PrioritySampling.SAMPLER_KEEP,
66+
samplingPriority,
6567
SAMPLING_AGENT_RATE,
6668
sampler.getSampleRate(),
67-
SamplingMechanism.AGENT_RATE);
69+
SamplingMechanism.AGENT_RATE,
70+
sampled);
6871
} else {
6972
span.setSamplingPriority(
70-
PrioritySampling.SAMPLER_DROP,
73+
samplingPriority,
7174
SAMPLING_AGENT_RATE,
7275
sampler.getSampleRate(),
7376
SamplingMechanism.AGENT_RATE);
@@ -161,7 +164,7 @@ public void onResponse(
161164
if (canIncrease && anyCapped) {
162165
lastCappedNanos = now;
163166
}
164-
serviceRates = new RateSamplersByEnvAndService(updatedEnvServiceRates, fallbackSampler);
167+
serviceRates = new RateSamplersByEnvAndService(updatedEnvServiceRates, fallbackSampler, true);
165168
}
166169

167170
private static RateSampler createRateSampler(final double sampleRate) {
@@ -183,15 +186,23 @@ private static final class RateSamplersByEnvAndService {
183186

184187
private final Map<String, TreeMap<String, RateSampler>> envServiceRates;
185188
private final RateSampler fallbackSampler;
189+
private final boolean hasAgentRates;
186190

187191
RateSamplersByEnvAndService() {
188-
this(Collections.emptyMap(), DEFAULT_SAMPLER);
192+
this(Collections.emptyMap(), DEFAULT_SAMPLER, false);
189193
}
190194

191195
RateSamplersByEnvAndService(
192-
Map<String, TreeMap<String, RateSampler>> envServiceRates, RateSampler fallbackSampler) {
196+
Map<String, TreeMap<String, RateSampler>> envServiceRates,
197+
RateSampler fallbackSampler,
198+
boolean hasAgentRates) {
193199
this.envServiceRates = envServiceRates;
194200
this.fallbackSampler = fallbackSampler;
201+
this.hasAgentRates = hasAgentRates;
202+
}
203+
204+
boolean hasAgentRates() {
205+
return hasAgentRates;
195206
}
196207

197208
RateSampler getFallbackSampler() {

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,27 +146,31 @@ public <T extends CoreSpan<T>> void setSamplingPriority(final T span) {
146146
if (matchedRule == null) {
147147
fallbackSampler.setSamplingPriority(span);
148148
} else {
149-
if (matchedRule.sample(span)) {
149+
boolean sampled = matchedRule.sample(span);
150+
if (sampled) {
150151
if (rateLimiter.tryAcquire()) {
151152
span.setSamplingPriority(
152153
PrioritySampling.USER_KEEP,
153154
SAMPLING_RULE_RATE,
154155
matchedRule.getSampler().getSampleRate(),
155-
matchedRule.getMechanism());
156+
matchedRule.getMechanism(),
157+
true);
156158
} else {
157159
span.setSamplingPriority(
158160
PrioritySampling.USER_DROP,
159161
SAMPLING_RULE_RATE,
160162
matchedRule.getSampler().getSampleRate(),
161-
matchedRule.getMechanism());
163+
matchedRule.getMechanism(),
164+
true);
162165
}
163166
span.setMetric(SAMPLING_LIMIT_RATE, rateLimit);
164167
} else {
165168
span.setSamplingPriority(
166169
PrioritySampling.USER_DROP,
167170
SAMPLING_RULE_RATE,
168171
matchedRule.getSampler().getSampleRate(),
169-
matchedRule.getMechanism());
172+
matchedRule.getMechanism(),
173+
false);
170174
}
171175
}
172176
}

‎dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@ default void processTagsAndBaggageWithStructuredLinks(
124124
T setSamplingPriority(
125125
int samplingPriority, CharSequence rate, double sampleRate, int samplingMechanism);
126126

127+
T setSamplingPriority(
128+
int samplingPriority,
129+
CharSequence rate,
130+
double sampleRate,
131+
int samplingMechanism,
132+
boolean sampled);
133+
127134
T setSpanSamplingPriority(double rate, int limit);
128135

129136
T setMetric(CharSequence name, int value);

‎dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,27 @@ public final DDSpan setSamplingPriority(final int newPriority, int samplingMecha
647647
@Override
648648
public DDSpan setSamplingPriority(
649649
int samplingPriority, CharSequence rate, double sampleRate, int samplingMechanism) {
650+
setSamplingPriorityWithRate(samplingPriority, rate, sampleRate, samplingMechanism);
651+
return this;
652+
}
653+
654+
@Override
655+
public DDSpan setSamplingPriority(
656+
int samplingPriority,
657+
CharSequence rate,
658+
double sampleRate,
659+
int samplingMechanism,
660+
boolean sampled) {
661+
if (setSamplingPriorityWithRate(samplingPriority, rate, sampleRate, samplingMechanism)) {
662+
context
663+
.getPropagationTags()
664+
.updateOtelTraceState(getTraceId().toLong(), sampleRate, sampled, samplingPriority);
665+
}
666+
return this;
667+
}
668+
669+
private boolean setSamplingPriorityWithRate(
670+
int samplingPriority, CharSequence rate, double sampleRate, int samplingMechanism) {
650671
if (context.setSamplingPriority(samplingPriority, samplingMechanism)) {
651672
setMetric(rate, sampleRate);
652673
if (samplingMechanism == SamplingMechanism.AGENT_RATE
@@ -655,8 +676,9 @@ public DDSpan setSamplingPriority(
655676
|| samplingMechanism == SamplingMechanism.REMOTE_ADAPTIVE_RULE) {
656677
context.getPropagationTags().updateKnuthSamplingRate(sampleRate);
657678
}
679+
return true;
658680
}
659-
return this;
681+
return false;
660682
}
661683

662684
@Override

‎dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,13 @@ public DDSpanContext(
445445
setOrigin(origin);
446446
}
447447
if (samplingPriority != PrioritySampling.UNSET) {
448-
setSamplingPriority(samplingPriority, SamplingMechanism.UNKNOWN);
448+
if (this.propagationTags.getSamplingPriority() == samplingPriority) {
449+
// Extractors already applied this priority to the propagation tags. Initialize the local
450+
// field without reapplying the decision as an unknown local override.
451+
SAMPLING_PRIORITY_UPDATER.set(this, samplingPriority);
452+
} else {
453+
setSamplingPriority(samplingPriority, SamplingMechanism.UNKNOWN);
454+
}
449455
}
450456
setTag(PARENT_ID, this.propagationTags.getLastParentId());
451457
}

‎dd-trace-core/src/main/java/datadog/trace/core/propagation/PropagationTags.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public interface Factory {
6767

6868
public abstract void forceKeep(int samplingMechanism);
6969

70+
public abstract void updateOtelTraceState(
71+
long traceIdLowOrderBits, double sampleRate, boolean sampled, int samplingPriority);
72+
7073
public abstract int getSamplingPriority();
7174

7275
public abstract void updateTraceOrigin(CharSequence origin);

0 commit comments

Comments
 (0)