func processManifest()

in strategy/sampling/sampling_rule_manifest.go [87:139]


func processManifest(srm *RuleManifest) error {
	if srm == nil {
		return errors.New("sampling rule manifest must not be nil")
	}
	if srm.Version != 1 && srm.Version != 2 {
		return fmt.Errorf("sampling rule manifest version %d not supported", srm.Version)
	}
	if srm.Default == nil {
		return errors.New("sampling rule manifest must include a default rule")
	}
	if srm.Default.URLPath != "" || srm.Default.ServiceName != "" || srm.Default.HTTPMethod != "" {
		return errors.New("the default rule must not specify values for url_path, service_name, or http_method")
	}
	if srm.Default.FixedTarget < 0 || srm.Default.Rate < 0 {
		return errors.New("the default rule must specify non-negative values for fixed_target and rate")
	}

	c := &utils.DefaultClock{}

	srm.Default.reservoir = &Reservoir{
		clock: c,
		reservoir: &reservoir{
			capacity: srm.Default.FixedTarget,
		},
	}

	if srm.Rules != nil {
		for _, r := range srm.Rules {

			if srm.Version == 1 {
				if err := validateVersion1(r); err != nil {
					return err
				}
				r.Host = r.ServiceName // V1 sampling rule contains service name and not host
				r.ServiceName = ""
			}

			if srm.Version == 2 {
				if err := validateVersion2(r); err != nil {
					return err
				}
			}

			r.reservoir = &Reservoir{
				clock: c,
				reservoir: &reservoir{
					capacity: r.FixedTarget,
				},
			}
		}
	}
	return nil
}