@@ -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