master
go 71 lines 1.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package selector
4
5 import (
6 "github.com/netdata/netdata/go/plugins/pkg/selectorcore"
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 = selectorcore.OpEqual
17 OpNegEqual = selectorcore.OpNegEqual
18 OpRegexp = selectorcore.OpRegexp
19 OpNegRegexp = selectorcore.OpNegRegexp
20 OpSimplePatterns = selectorcore.OpSimplePatterns
21 OpNegSimplePatterns = selectorcore.OpNegSimplePatterns
22 )
23
24 type Func func(lbs labels.Labels) bool
25
26 func (fn Func) Matches(lbs labels.Labels) bool {
27 return fn(lbs)
28 }
29
30 type corePromSelector struct {
31 core selectorcore.Selector
32 }
33
34 func (s corePromSelector) Matches(lbs labels.Labels) bool {
35 return s.core.Matches(metricNameFromPromLabels(lbs), promLabelsView{labels: lbs})
36 }
37
38 func wrapCoreSelector(sel selectorcore.Selector) Selector {
39 if sel == nil {
40 return nil
41 }
42 return corePromSelector{core: sel}
43 }
44
45 type promLabelsView struct {
46 labels labels.Labels
47 }
48
49 func (v promLabelsView) Get(key string) (string, bool) {
50 for _, label := range v.labels {
51 if label.Name == key {
52 return label.Value, true
53 }
54 }
55 return "", false
56 }
57
58 func metricNameFromPromLabels(lbs labels.Labels) string {
59 if len(lbs) == 0 {
60 return ""
61 }
62 if lbs[0].Name == labels.MetricName {
63 return lbs[0].Value
64 }
65 for _, label := range lbs {
66 if label.Name == labels.MetricName {
67 return label.Value
68 }
69 }
70 return ""
71 }