diff --git a/pkg/validator/expression.go b/pkg/validator/expression.go index 84ae0fb..564df41 100644 --- a/pkg/validator/expression.go +++ b/pkg/validator/expression.go @@ -403,13 +403,13 @@ func (e expressionWithNoMetricName) String() string { func (e expressionWithNoMetricName) Validate(rule rulefmt.Rule, _ *prometheus.Client) []error { var errs []error - names, err := getExpressionMetricsNames(rule.Expr) + vectorsWithNames, err := getExpressionMetricsNames(rule.Expr) if err != nil { return []error{err} } - for _, s := range names { - if s == "" { - errs = append(errs, fmt.Errorf("missing metric name for expression `%s`", rule.Expr)) + for _, v := range vectorsWithNames { + if v.MetricName == "" { + errs = append(errs, fmt.Errorf("missing metric name for vector `%s`", v.Vector.String())) } } return errs diff --git a/pkg/validator/expression_helpers.go b/pkg/validator/expression_helpers.go index 77a0c6c..7a05b1c 100644 --- a/pkg/validator/expression_helpers.go +++ b/pkg/validator/expression_helpers.go @@ -48,20 +48,26 @@ func getExpressionSelectors(expr string) ([]string, error) { return selectors, nil } -func getExpressionMetricsNames(expr string) ([]string, error) { +type VectorSelectorWithMetricName struct { + Vector *parser.VectorSelector + MetricName string +} + +func getExpressionMetricsNames(expr string) ([]VectorSelectorWithMetricName, error) { promQl, err := parser.ParseExpr(expr) if err != nil { - return []string{}, fmt.Errorf("failed to parse expression `%s`: %s", expr, err) + return []VectorSelectorWithMetricName{}, fmt.Errorf("failed to parse expression `%s`: %s", expr, err) } - var names []string + var vectors []VectorSelectorWithMetricName parser.Inspect(promQl, func(n parser.Node, ns []parser.Node) error { switch v := n.(type) { case *parser.VectorSelector: - names = append(names, getMetricNameFromLabels(v.LabelMatchers)) + metricName := getMetricNameFromLabels(v.LabelMatchers) + vectors = append(vectors, VectorSelectorWithMetricName{Vector: v, MetricName: metricName}) } return nil }) - return names, nil + return vectors, nil } func getMetricNameFromLabels(labels []*labels.Matcher) string {