in strategy/sampling/centralized.go [474:514]
func (ss *CentralizedStrategy) updateTarget(t *SamplingTargetDocument) (err error) {
// Pre-emptively dereference SamplingTarget fields and return early on nil values
// A panic in the middle of an update may leave the rule in an inconsistent state.
if t.RuleName == nil {
return errors.New("invalid sampling target. Missing rule name")
}
if t.FixedRate == nil {
return fmt.Errorf("invalid sampling target for rule %s. Missing fixed rate", *t.RuleName)
}
// Rule for given target
ss.manifest.mu.RLock()
r, ok := ss.manifest.Index[*t.RuleName]
ss.manifest.mu.RUnlock()
if !ok {
return fmt.Errorf("rule %s not found", *t.RuleName)
}
r.mu.Lock()
defer r.mu.Unlock()
r.reservoir.refreshedAt = ss.clock.Now().Unix()
// Update non-optional attributes from response
r.Rate = *t.FixedRate
// Update optional attributes from response
if t.ReservoirQuota != nil {
r.reservoir.quota = *t.ReservoirQuota
}
if t.ReservoirQuotaTTL != nil {
r.reservoir.expiresAt = int64(*t.ReservoirQuotaTTL)
}
if t.Interval != nil {
r.reservoir.interval = *t.Interval
}
return nil
}