in strategy/sampling/sampling_rule.go [100:150]
func (r *CentralizedRule) Sample() *Decision {
now := r.clock.Now().Unix()
sd := &Decision{
Rule: &r.ruleName,
}
r.mu.Lock()
defer r.mu.Unlock()
r.requests++
// Fallback to bernoulli sampling if quota has expired
if r.reservoir.expired(now) {
if r.reservoir.borrow(now) {
logger.Debugf(
"Sampling target has expired for rule %s. Borrowing a request.",
r.ruleName,
)
sd.Sample = true
r.borrows++
return sd
}
logger.Debugf(
"Sampling target has expired for rule %s. Using fixed rate.",
r.ruleName,
)
sd.Sample = r.bernoulliSample()
return sd
}
// Take from reservoir quota, if possible
if r.reservoir.Take(now) {
r.sampled++
sd.Sample = true
return sd
}
logger.Debugf(
"Sampling target has been exhausted for rule %s. Using fixed rate.",
r.ruleName,
)
// Use bernoulli sampling if quota expended
sd.Sample = r.bernoulliSample()
return sd
}