Skip to content

Commit

Permalink
Merge pull request #13674 from prometheus/owilliams/dupeok
Browse files Browse the repository at this point in the history
fix: restore ability to match __name__ multiple times in selector
  • Loading branch information
beorn7 committed Feb 29, 2024
2 parents 9187bcb + e01e7d3 commit d5f0a24
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 13 deletions.
13 changes: 0 additions & 13 deletions promql/parser/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -791,20 +791,7 @@ func (p *parser) checkAST(node Node) (typ ValueType) {
// Skip the check for non-empty matchers because an explicit
// metric name is a non-empty matcher.
break
} else {
// We also have to make sure a metric name was not set twice inside the
// braces.
foundMetricName := ""
for _, m := range n.LabelMatchers {
if m != nil && m.Name == labels.MetricName {
if foundMetricName != "" {
p.addParseErrf(n.PositionRange(), "metric name must not be set twice: %q or %q", foundMetricName, m.Value)
}
foundMetricName = m.Value
}
}
}

// A Vector selector must contain at least one non-empty matcher to prevent
// implicit selection of all metrics (e.g. by a typo).
notEmpty := false
Expand Down
44 changes: 44 additions & 0 deletions promql/parser/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1852,6 +1852,48 @@ var testExpr = []struct {
},
},
},
{
// Specifying __name__ twice inside the braces is ok.
input: `{__name__=~"bar", __name__!~"baz"}`,
expected: &VectorSelector{
LabelMatchers: []*labels.Matcher{
MustLabelMatcher(labels.MatchRegexp, model.MetricNameLabel, "bar"),
MustLabelMatcher(labels.MatchNotRegexp, model.MetricNameLabel, "baz"),
},
PosRange: posrange.PositionRange{
Start: 0,
End: 34,
},
},
},
{
// Specifying __name__ with equality twice inside the braces is even allowed.
input: `{__name__="bar", __name__="baz"}`,
expected: &VectorSelector{
LabelMatchers: []*labels.Matcher{
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "bar"),
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "baz"),
},
PosRange: posrange.PositionRange{
Start: 0,
End: 32,
},
},
},
{
// Because the above are allowed, this is also allowed.
input: `{"bar", __name__="baz"}`,
expected: &VectorSelector{
LabelMatchers: []*labels.Matcher{
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "bar"),
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "baz"),
},
PosRange: posrange.PositionRange{
Start: 0,
End: 23,
},
},
},
{
input: `{`,
fail: true,
Expand Down Expand Up @@ -1934,6 +1976,8 @@ var testExpr = []struct {
fail: true,
errMsg: "vector selector must contain at least one non-empty matcher",
},
// Although {"bar", __name__="baz"} is allowed (see above), specifying a
// metric name inside and outside the braces is not.
{
input: `foo{__name__="bar"}`,
fail: true,
Expand Down

0 comments on commit d5f0a24

Please sign in to comment.