func()

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)
}