Skip to content

Commit 26e3055

Browse files
author
Arthur Silva Sens
authored
Merge pull request #1472 from prometheus/i5242
Add LintDuplicateMetric to promlint
2 parents 7882668 + 2507462 commit 26e3055

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

prometheus/testutil/promlint/promlint_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,3 +839,27 @@ mc_something_total 10
839839
lintAndVerify(l2, cv)
840840
})
841841
}
842+
843+
func TestLintDuplicateMetric(t *testing.T) {
844+
const msg = "metric not unique"
845+
846+
tests := []test{
847+
{
848+
name: "metric not unique",
849+
in: `
850+
# HELP not_unique_total the helptext
851+
# TYPE not_unique_total counter
852+
not_unique_total{bar="abc", spam="xyz"} 1
853+
not_unique_total{bar="abc", spam="xyz"} 2
854+
`,
855+
problems: []promlint.Problem{
856+
{
857+
Metric: "not_unique_total",
858+
Text: msg,
859+
},
860+
},
861+
},
862+
}
863+
864+
runTests(t, tests)
865+
}

prometheus/testutil/promlint/validation.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ var defaultValidations = []Validation{
3030
validations.LintReservedChars,
3131
validations.LintCamelCase,
3232
validations.LintUnitAbbreviations,
33+
validations.LintDuplicateMetric,
3334
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2024 The Prometheus Authors
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
package validations
15+
16+
import (
17+
"fmt"
18+
"reflect"
19+
20+
dto "github.com/prometheus/client_model/go"
21+
)
22+
23+
// LintDuplicateMetric detects duplicate metric.
24+
func LintDuplicateMetric(mf *dto.MetricFamily) []error {
25+
var problems []error
26+
27+
for i, m := range mf.Metric {
28+
for _, k := range mf.Metric[i+1:] {
29+
if reflect.DeepEqual(m.Label, k.Label) {
30+
problems = append(problems, fmt.Errorf("metric not unique"))
31+
break
32+
}
33+
}
34+
}
35+
36+
return problems
37+
}

0 commit comments

Comments
 (0)