in strategy/sampling/centralized.go [129:184]
func (ss *CentralizedStrategy) ShouldTrace(request *Request) *Decision {
ss.mu.Lock()
if !ss.pollerStart {
ss.start()
}
ss.mu.Unlock()
if request.ServiceType == "" {
request.ServiceType = plugins.InstancePluginMetadata.Origin
}
logger.Debugf(
"Determining ShouldTrace decision for:\n\thost: %s\n\tpath: %s\n\tmethod: %s\n\tservicename: %s\n\tservicetype: %s",
request.Host,
request.URL,
request.Method,
request.ServiceName,
request.ServiceType,
)
// Use fallback if manifest is expired
if ss.manifest.expired() {
logger.Debug("Centralized sampling data expired. Using fallback sampling strategy")
return ss.fallback.ShouldTrace(request)
}
ss.manifest.mu.RLock()
defer ss.manifest.mu.RUnlock()
// Match against known rules
for _, r := range ss.manifest.Rules {
r.mu.RLock()
applicable := r.AppliesTo(request)
r.mu.RUnlock()
if !applicable {
continue
}
logger.Debugf("Applicable rule: %s", r.ruleName)
return r.Sample()
}
// Match against default rule
if r := ss.manifest.Default; r != nil {
logger.Debugf("Applicable rule: %s", r.ruleName)
return r.Sample()
}
// Use fallback if default rule is unavailable
logger.Debug("Centralized default sampling rule unavailable. Using fallback sampling strategy")
return ss.fallback.ShouldTrace(request)
}