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  }