diff --git a/prometheus/testutil/promlint/promlint_test.go b/prometheus/testutil/promlint/promlint_test.go index 7a0ba46bb..c60507c19 100644 --- a/prometheus/testutil/promlint/promlint_test.go +++ b/prometheus/testutil/promlint/promlint_test.go @@ -839,3 +839,27 @@ mc_something_total 10 lintAndVerify(l2, cv) }) } + +func TestLintDuplicateMetric(t *testing.T) { + const msg = "metric not unique" + + tests := []test{ + { + name: "metric not unique", + in: ` +# HELP not_unique_total the helptext +# TYPE not_unique_total counter +not_unique_total{bar="abc", spam="xyz"} 1 +not_unique_total{bar="abc", spam="xyz"} 2 +`, + problems: []promlint.Problem{ + { + Metric: "not_unique_total", + Text: msg, + }, + }, + }, + } + + runTests(t, tests) +} diff --git a/prometheus/testutil/promlint/validation.go b/prometheus/testutil/promlint/validation.go index f52ad9eab..e1441598d 100644 --- a/prometheus/testutil/promlint/validation.go +++ b/prometheus/testutil/promlint/validation.go @@ -30,4 +30,5 @@ var defaultValidations = []Validation{ validations.LintReservedChars, validations.LintCamelCase, validations.LintUnitAbbreviations, + validations.LintDuplicateMetric, } diff --git a/prometheus/testutil/promlint/validations/duplicate_validations.go b/prometheus/testutil/promlint/validations/duplicate_validations.go new file mode 100644 index 000000000..fdc1e6239 --- /dev/null +++ b/prometheus/testutil/promlint/validations/duplicate_validations.go @@ -0,0 +1,37 @@ +// Copyright 2024 The Prometheus Authors +// 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 validations + +import ( + "fmt" + "reflect" + + dto "github.com/prometheus/client_model/go" +) + +// LintDuplicateMetric detects duplicate metric. +func LintDuplicateMetric(mf *dto.MetricFamily) []error { + var problems []error + + for i, m := range mf.Metric { + for _, k := range mf.Metric[i+1:] { + if reflect.DeepEqual(m.Label, k.Label) { + problems = append(problems, fmt.Errorf("metric not unique")) + break + } + } + } + + return problems +}