mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-28 06:59:40 -08:00
Merge pull request #927 from prometheus/fix-matchers
Only do regex lookups when there was no equality match.
This commit is contained in:
commit
a48ce1edb7
|
@ -428,39 +428,40 @@ func (s *memorySeriesStorage) MetricsForLabelMatchers(matchers ...*metric.LabelM
|
|||
}
|
||||
|
||||
var resFPs map[clientmodel.Fingerprint]struct{}
|
||||
// If we cannot make a preselection based on equality matchers, expanding the other matchers to labels
|
||||
// and intersecting their fingerprints is still likely to be the best choice.
|
||||
if len(equals) > 0 {
|
||||
resFPs = s.fingerprintsForLabelPairs(equals...)
|
||||
}
|
||||
var remaining metric.LabelMatchers
|
||||
for _, matcher := range filters {
|
||||
// Equal matches are all empty values.
|
||||
if matcher.Match("") {
|
||||
remaining = append(remaining, matcher)
|
||||
continue
|
||||
}
|
||||
intersection := map[clientmodel.Fingerprint]struct{}{}
|
||||
} else {
|
||||
// If we cannot make a preselection based on equality matchers, expanding the other matchers to labels
|
||||
// and intersecting their fingerprints is still likely to be the best choice.
|
||||
var remaining metric.LabelMatchers
|
||||
for _, matcher := range filters {
|
||||
// Equal matches are all empty values.
|
||||
if matcher.Match("") {
|
||||
remaining = append(remaining, matcher)
|
||||
continue
|
||||
}
|
||||
intersection := map[clientmodel.Fingerprint]struct{}{}
|
||||
|
||||
matches := matcher.Filter(s.LabelValuesForLabelName(matcher.Name))
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
for _, v := range matches {
|
||||
fps := s.fingerprintsForLabelPairs(metric.LabelPair{
|
||||
Name: matcher.Name,
|
||||
Value: v,
|
||||
})
|
||||
for fp := range fps {
|
||||
if _, ok := resFPs[fp]; ok || resFPs == nil {
|
||||
intersection[fp] = struct{}{}
|
||||
matches := matcher.Filter(s.LabelValuesForLabelName(matcher.Name))
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
for _, v := range matches {
|
||||
fps := s.fingerprintsForLabelPairs(metric.LabelPair{
|
||||
Name: matcher.Name,
|
||||
Value: v,
|
||||
})
|
||||
for fp := range fps {
|
||||
if _, ok := resFPs[fp]; ok || resFPs == nil {
|
||||
intersection[fp] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
resFPs = intersection
|
||||
}
|
||||
resFPs = intersection
|
||||
// The intersected matchers no longer need to be compared against the actual metrics.
|
||||
filters = remaining
|
||||
}
|
||||
// The intersected matchers no longer need to be compared against the actual metrics.
|
||||
filters = remaining
|
||||
|
||||
result := make(map[clientmodel.Fingerprint]clientmodel.COWMetric, len(resFPs))
|
||||
for fp := range resFPs {
|
||||
|
|
|
@ -70,7 +70,7 @@ func TestMatches(t *testing.T) {
|
|||
}{
|
||||
{
|
||||
matchers: metric.LabelMatchers{newMatcher(metric.Equal, "label1", "x")},
|
||||
expected: fingerprints[:0],
|
||||
expected: clientmodel.Fingerprints{},
|
||||
},
|
||||
{
|
||||
matchers: metric.LabelMatchers{newMatcher(metric.Equal, "label1", "test_0")},
|
||||
|
@ -161,6 +161,20 @@ func TestMatches(t *testing.T) {
|
|||
},
|
||||
expected: append(append(clientmodel.Fingerprints{}, fingerprints[30:35]...), fingerprints[45:60]...),
|
||||
},
|
||||
{
|
||||
matchers: metric.LabelMatchers{
|
||||
newMatcher(metric.Equal, "label1", `nonexistent`),
|
||||
newMatcher(metric.RegexMatch, "label2", `test`),
|
||||
},
|
||||
expected: clientmodel.Fingerprints{},
|
||||
},
|
||||
{
|
||||
matchers: metric.LabelMatchers{
|
||||
newMatcher(metric.Equal, "label1", `test_0`),
|
||||
newMatcher(metric.RegexMatch, "label2", `nonexistent`),
|
||||
},
|
||||
expected: clientmodel.Fingerprints{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, mt := range matcherTests {
|
||||
|
|
Loading…
Reference in a new issue