Skip to content

Commit bc7348b

Browse files
committed
up
1 parent 11b4832 commit bc7348b

File tree

1 file changed

+48
-27
lines changed
  • agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling

1 file changed

+48
-27
lines changed

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/AiSampler.java

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,11 @@ public class AiSampler implements Sampler {
2929

3030
private static final double SAMPLE_RATE_TO_DISABLE_INGESTION_SAMPLING = 99.99;
3131

32-
private final boolean ingestionSamplingEnabled;
33-
private final boolean sampleWhenLocalParentSampled;
34-
private final boolean dropWhenLocalParentDropped;
3532
private final SamplingPercentage requestSamplingPercentage;
36-
// when localParentBased=false, then this applies to all dependencies, not only parentless
3733
private final SamplingPercentage parentlessDependencySamplingPercentage;
34+
private final boolean ingestionSamplingEnabled;
35+
private final boolean override;
36+
3837
private final Cache<Double, SamplingResult> recordAndSampleWithSampleRateMap = Cache.bounded(100);
3938

4039
public static AiSampler create(
@@ -45,33 +44,25 @@ public static AiSampler create(
4544
requestSamplingPercentage,
4645
parentlessDependencySamplingPercentage,
4746
ingestionSamplingEnabled,
48-
true,
49-
true);
47+
false);
5048
}
5149

5250
public static AiSampler createSamplingOverride(
5351
SamplingPercentage samplingPercentage,
5452
boolean sampleWhenLocalParentSampled,
5553
boolean dropWhenLocalParentDropped) {
56-
return new AiSampler(
57-
samplingPercentage,
58-
samplingPercentage,
59-
false,
60-
sampleWhenLocalParentSampled,
61-
dropWhenLocalParentDropped);
54+
return new AiSampler(samplingPercentage, samplingPercentage, false, true);
6255
}
6356

6457
private AiSampler(
6558
SamplingPercentage requestSamplingPercentage,
6659
SamplingPercentage parentlessDependencySamplingPercentage,
6760
boolean ingestionSamplingEnabled,
68-
boolean sampleWhenLocalParentSampled,
69-
boolean dropWhenLocalParentDropped) {
61+
boolean override) {
7062
this.requestSamplingPercentage = requestSamplingPercentage;
7163
this.parentlessDependencySamplingPercentage = parentlessDependencySamplingPercentage;
7264
this.ingestionSamplingEnabled = ingestionSamplingEnabled;
73-
this.sampleWhenLocalParentSampled = sampleWhenLocalParentSampled;
74-
this.dropWhenLocalParentDropped = dropWhenLocalParentDropped;
65+
this.override = override;
7566
}
7667

7768
@Override
@@ -115,12 +106,10 @@ private SamplingResult internalShouldSample(
115106
SpanKind spanKind,
116107
Attributes attributes) {
117108

118-
if (sampleWhenLocalParentSampled || dropWhenLocalParentDropped) {
119-
SamplingResult samplingResult =
120-
useLocalParentDecisionIfPossible(parentSpanContext, parentSpanSampleRate);
121-
if (samplingResult != null) {
122-
return samplingResult;
123-
}
109+
SamplingResult samplingResult =
110+
useLocalParentDecisionIfPossible(parentSpanContext, parentSpanSampleRate);
111+
if (samplingResult != null) {
112+
return samplingResult;
124113
}
125114

126115
double sp;
@@ -154,7 +143,7 @@ private SamplingResult internalShouldSample(
154143
sp = SAMPLE_RATE_TO_DISABLE_INGESTION_SAMPLING;
155144
}
156145

157-
SamplingResult samplingResult = recordAndSampleWithSampleRateMap.get(sp);
146+
samplingResult = recordAndSampleWithSampleRateMap.get(sp);
158147
if (samplingResult == null) {
159148
samplingResult = new RecordAndSampleWithItemCount(sp);
160149
recordAndSampleWithSampleRateMap.put(sp, samplingResult);
@@ -165,19 +154,51 @@ private SamplingResult internalShouldSample(
165154
@Nullable
166155
private SamplingResult useLocalParentDecisionIfPossible(
167156
SpanContext parentSpanContext, @Nullable Double parentSpanSampleRate) {
157+
168158
// remote parent-based sampling messes up item counts since item count is not propagated in
169159
// tracestate (yet), but local parent-based sampling doesn't have this issue since we are
170160
// propagating item count locally
161+
171162
if (!parentSpanContext.isValid() || parentSpanContext.isRemote()) {
172163
return null;
173164
}
165+
166+
if (!override) {
167+
if (!parentSpanContext.isSampled()) {
168+
return SamplingResult.drop();
169+
}
170+
if (parentSpanSampleRate == null) {
171+
return null;
172+
}
173+
return new RecordAndSampleWithItemCount(parentSpanSampleRate);
174+
}
175+
176+
// override case:
177+
178+
// note: in the override case, requestSamplingPercentage and
179+
// parentlessDependencySamplingPercentage are always the same (and fixed)
180+
double sp = parentlessDependencySamplingPercentage.get();
181+
174182
if (!parentSpanContext.isSampled()) {
175-
return dropWhenLocalParentDropped ? SamplingResult.drop() : null;
183+
if (sp < 100) {
184+
// only 100% sampling override will override an unsampled parent!!
185+
return SamplingResult.drop();
186+
} else {
187+
// falls back in this case to sp
188+
return null;
189+
}
176190
}
177-
if (sampleWhenLocalParentSampled && parentSpanSampleRate != null) {
178-
return new RecordAndSampleWithItemCount(parentSpanSampleRate);
191+
192+
if (parentSpanSampleRate == null) {
193+
return null;
194+
}
195+
196+
if (sp < parentSpanSampleRate || sp == 100) {
197+
// falls back in this case to sp
198+
return null;
179199
}
180-
return null;
200+
// don't sample more dependencies than parent in this case
201+
return new RecordAndSampleWithItemCount(parentSpanSampleRate);
181202
}
182203

183204
public static boolean shouldRecordAndSample(String traceId, double percentage) {

0 commit comments

Comments
 (0)