-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathoptin.go
More file actions
72 lines (61 loc) · 2.13 KB
/
optin.go
File metadata and controls
72 lines (61 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Copyright 2021 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package optin
import (
"regexp"
"slices"
"strings"
generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator"
)
// MetricFamilyFilter filters metric families which are defined as opt-in by their generator.FamilyGenerator
type MetricFamilyFilter struct {
metrics []*regexp.Regexp
}
// Test tests if a given generator is an opt-in metric family and was passed as an opt-in metric family at startup
func (filter MetricFamilyFilter) Test(generator generator.FamilyGenerator) bool {
if !generator.OptIn {
return true
}
for _, metric := range filter.metrics {
if metric.MatchString(generator.Name) {
return true
}
}
return false
}
// Status returns the metrics contained within the filter as a comma-separated string
func (filter MetricFamilyFilter) Status() string {
asStrings := make([]string, 0)
for _, metric := range filter.metrics {
asStrings = append(asStrings, metric.String())
}
// sort the strings for the sake of ux such that the resulting status is consistent
slices.Sort(asStrings)
return strings.Join(asStrings, ", ")
}
// Count returns the amount of metrics contained within the filter
func (filter MetricFamilyFilter) Count() int {
return len(filter.metrics)
}
// NewMetricFamilyFilter creates new MetricFamilyFilter instances.
func NewMetricFamilyFilter(metrics map[string]struct{}) (*MetricFamilyFilter, error) {
regexes := make([]*regexp.Regexp, 0)
for metric := range metrics {
regex, err := regexp.Compile(metric)
if err != nil {
return nil, err
}
regexes = append(regexes, regex)
}
return &MetricFamilyFilter{regexes}, nil
}