in sdk/src/Core/Sampling/DefaultSamplingStrategy.cs [127:162]
private static SamplingResponse ProcessMatchedRule(SamplingRule sampleRule, TimeStamp time)
{
bool shouldSample = true;
Reservior reservior = sampleRule.Reservior;
sampleRule.IncrementRequestCount(); // increment request counter for matched rule
ReserviorDecision reserviorDecision = reservior.BorrowOrTake(time, sampleRule.CanBorrow); // check if we can borrow or take from reservior
if (reserviorDecision == ReserviorDecision.Borrow)
{
sampleRule.IncrementBorrowCount();
}
else if (reserviorDecision == ReserviorDecision.Take)
{
sampleRule.IncrementSampledCount();
}
else if (ThreadSafeRandom.NextDouble() <= sampleRule.GetRate()) // compute based on fixed rate
{
sampleRule.IncrementSampledCount();
}
else
{
shouldSample = false;
}
SamplingResponse sampleResult;
if (shouldSample)
{
sampleResult = new SamplingResponse(sampleRule.RuleName, SampleDecision.Sampled);
}
else
{
sampleResult = new SamplingResponse(SampleDecision.NotSampled);
}
return sampleResult;
}