func validateRuleImpl()

in prometheus/alert/client.go [91:137]


func validateRuleImpl(r rulefmt.RuleNode) error {
	err := errors.New("Rule Validation Error")
	if r.Record.Value != "" && r.Alert.Value != "" {
		err = fmt.Errorf("%v; only one of 'record' and 'alert' must be set", err)
	}
	if r.Record.Value == "" && r.Alert.Value == "" {
		if r.Record.Value == "0" {
			err = fmt.Errorf("%v; one of 'record' or 'alert' must be set", err)
		} else {
			err = fmt.Errorf("%v; one of 'record' or 'alert' must be set", err)
		}
	}

	if r.Expr.Value == "" {
		err = fmt.Errorf("%v; field 'expr' must be set in rule", err)
	} else if _, e := parser.ParseExpr(r.Expr.Value); e != nil {
		err = fmt.Errorf("%v; could not parse expression: %v", err, e)
	}
	if r.Record.Value != "" {
		if len(r.Annotations) > 0 {
			err = fmt.Errorf("%v; invalid field 'annotations' in recording rule", err)
		}
		if r.For != 0 {
			err = fmt.Errorf("%v; invalid field 'for' in recording rule", err)
		}
		if !model.IsValidMetricName(model.LabelValue(r.Record.Value)) {
			err = fmt.Errorf("%v; invalid recording rule name: %s", err, r.Record.Value)
		}
	}

	for k, v := range r.Labels {
		if !model.LabelName(k).IsValid() || k == model.MetricNameLabel {
			err = fmt.Errorf("%v; invalid label name: %s", err, k)
		}

		if !model.LabelValue(v).IsValid() {
			err = fmt.Errorf("%v; invalid label value: %s", err, v)
		}
	}

	for k := range r.Annotations {
		if !model.LabelName(k).IsValid() {
			err = fmt.Errorf("%v; invalid annotation name: %s", err, k)
		}
	}
	return err
}