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
}