github.com/netdata/go.d.plugin@v0.58.1/pkg/prometheus/selector/selector.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package selector 4 5 import ( 6 "github.com/netdata/go.d.plugin/pkg/matcher" 7 8 "github.com/prometheus/prometheus/model/labels" 9 ) 10 11 type Selector interface { 12 Matches(lbs labels.Labels) bool 13 } 14 15 const ( 16 OpEqual = "=" 17 OpNegEqual = "!=" 18 OpRegexp = "=~" 19 OpNegRegexp = "!~" 20 OpSimplePatterns = "=*" 21 OpNegSimplePatterns = "!*" 22 ) 23 24 type labelSelector struct { 25 name string 26 m matcher.Matcher 27 } 28 29 func (s labelSelector) Matches(lbs labels.Labels) bool { 30 if s.name == labels.MetricName { 31 return s.m.MatchString(lbs[0].Value) 32 } 33 if label, ok := lookupLabel(s.name, lbs[1:]); ok { 34 return s.m.MatchString(label.Value) 35 } 36 return false 37 } 38 39 type Func func(lbs labels.Labels) bool 40 41 func (fn Func) Matches(lbs labels.Labels) bool { 42 return fn(lbs) 43 } 44 45 func lookupLabel(name string, lbs labels.Labels) (labels.Label, bool) { 46 for _, label := range lbs { 47 if label.Name == name { 48 return label, true 49 } 50 } 51 return labels.Label{}, false 52 }