...
1
16
17 package testutil
18
19 import (
20 "fmt"
21 "io"
22 "strings"
23
24 "github.com/prometheus/client_golang/prometheus/testutil/promlint"
25 )
26
27
28
29
30
31
32 var exceptionMetrics = []string{
33
34 "apiserver_egress_dialer_dial_failure_count",
35
36
37 "apiserver_request_total",
38
39
40 "authenticated_user_requests",
41 "authentication_attempts",
42
43
44 "aggregator_openapi_v2_regeneration_count",
45 "apiserver_admission_step_admission_duration_seconds_summary",
46 "apiserver_current_inflight_requests",
47 "apiserver_longrunning_gauge",
48 "get_token_count",
49 "get_token_fail_count",
50 "ssh_tunnel_open_count",
51 "ssh_tunnel_open_fail_count",
52
53
54 "attachdetach_controller_forced_detaches",
55 "authenticated_user_requests",
56 "authentication_attempts",
57 "get_token_count",
58 "get_token_fail_count",
59 "node_collector_evictions_number",
60 }
61
62
63 type Problem promlint.Problem
64
65 func (p *Problem) String() string {
66 return fmt.Sprintf("%s:%s", p.Metric, p.Text)
67 }
68
69
70
71 type Linter struct {
72 promLinter *promlint.Linter
73 }
74
75
76
77
78 func (l *Linter) Lint() ([]Problem, error) {
79 promProblems, err := l.promLinter.Lint()
80 if err != nil {
81 return nil, err
82 }
83
84
85 problems := make([]Problem, 0, len(promProblems))
86 for i := range promProblems {
87 if !l.shouldIgnore(promProblems[i].Metric) {
88 problems = append(problems, Problem(promProblems[i]))
89 }
90 }
91
92 return problems, nil
93 }
94
95
96 func (l *Linter) shouldIgnore(metricName string) bool {
97 for i := range exceptionMetrics {
98 if metricName == exceptionMetrics[i] {
99 return true
100 }
101 }
102
103 return false
104 }
105
106
107
108 func NewPromLinter(r io.Reader) *Linter {
109 return &Linter{
110 promLinter: promlint.New(r),
111 }
112 }
113
114 func mergeProblems(problems []Problem) string {
115 var problemsMsg []string
116
117 for index := range problems {
118 problemsMsg = append(problemsMsg, problems[index].String())
119 }
120
121 return strings.Join(problemsMsg, ",")
122 }
123
124
125 func shouldIgnore(metricName string) bool {
126 for i := range exceptionMetrics {
127 if metricName == exceptionMetrics[i] {
128 return true
129 }
130 }
131
132 return false
133 }
134
135
136 func getLintError(problems []promlint.Problem) error {
137 var filteredProblems []Problem
138 for _, problem := range problems {
139 if shouldIgnore(problem.Metric) {
140 continue
141 }
142
143 filteredProblems = append(filteredProblems, Problem(problem))
144 }
145
146 if len(filteredProblems) == 0 {
147 return nil
148 }
149
150 return fmt.Errorf("lint error: %s", mergeProblems(filteredProblems))
151 }
152
View as plain text