Skip to content

Commit 6e98624

Browse files
committed
remove prometheus dependencies from k/k and add testcases for LabelsMatch
1 parent cb719f7 commit 6e98624

File tree

5 files changed

+121
-19
lines changed

5 files changed

+121
-19
lines changed

staging/src/k8s.io/apiserver/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ require (
2727
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
2828
github.com/pkg/errors v0.9.1
2929
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 // indirect
30-
github.com/prometheus/client_model v0.2.0
3130
github.com/spf13/pflag v1.0.5
3231
github.com/stretchr/testify v1.4.0
3332
go.etcd.io/etcd v0.5.0-alpha.5.0.20200401174654-e694b7bb0875

staging/src/k8s.io/apiserver/pkg/admission/metrics/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ go_test(
2626
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
2727
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
2828
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
29-
"//vendor/github.com/prometheus/client_model/go:go_default_library",
29+
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
3030
],
3131
)
3232

staging/src/k8s.io/apiserver/pkg/admission/metrics/testutil_test.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,43 +19,36 @@ package metrics
1919
import (
2020
"testing"
2121

22-
ptype "github.com/prometheus/client_model/go"
2322
"k8s.io/component-base/metrics/legacyregistry"
23+
"k8s.io/component-base/metrics/testutil"
2424
)
2525

26-
func labelsMatch(metric *ptype.Metric, labelFilter map[string]string) bool {
27-
for _, lp := range metric.GetLabel() {
28-
if value, ok := labelFilter[lp.GetName()]; ok && lp.GetValue() != value {
29-
return false
30-
}
31-
}
32-
return true
33-
}
34-
3526
// expectFindMetric find a metric with the given name nad labels or reports a fatal test error.
36-
func expectFindMetric(t *testing.T, name string, expectedLabels map[string]string) *ptype.Metric {
27+
func expectFindMetric(t *testing.T, name string, expectedLabels map[string]string) {
3728
metrics, err := legacyregistry.DefaultGatherer.Gather()
3829
if err != nil {
3930
t.Fatalf("Failed to gather metrics: %s", err)
4031
}
4132

33+
if len(metrics) == 0 {
34+
t.Fatalf("No metric found with name %s and labels %#+v", name, expectedLabels)
35+
}
36+
4237
for _, mf := range metrics {
4338
if mf.GetName() == name {
4439
for _, metric := range mf.GetMetric() {
45-
if labelsMatch(metric, expectedLabels) {
40+
if testutil.LabelsMatch(metric, expectedLabels) {
4641
gotLabelCount := len(metric.GetLabel())
4742
wantLabelCount := len(expectedLabels)
4843
if wantLabelCount != gotLabelCount {
4944
t.Errorf("Got metric with %d labels, but wanted %d labels. Wanted %#+v for %s",
5045
gotLabelCount, wantLabelCount, expectedLabels, metric.String())
46+
continue
5147
}
52-
return metric
5348
}
5449
}
5550
}
5651
}
57-
t.Fatalf("No metric found with name %s and labels %#+v", name, expectedLabels)
58-
return nil
5952
}
6053

6154
// expectHistogramCountTotal ensures that the sum of counts of metrics matching the labelFilter is as
@@ -72,7 +65,7 @@ func expectHistogramCountTotal(t *testing.T, name string, labelFilter map[string
7265
continue // Ignore other metrics.
7366
}
7467
for _, metric := range mf.GetMetric() {
75-
if !labelsMatch(metric, labelFilter) {
68+
if !testutil.LabelsMatch(metric, labelFilter) {
7669
continue
7770
}
7871
counterSum += int(metric.GetHistogram().GetSampleCount())
@@ -104,7 +97,7 @@ func expectCounterValue(t *testing.T, name string, labelFilter map[string]string
10497
continue // Ignore other metrics.
10598
}
10699
for _, metric := range mf.GetMetric() {
107-
if !labelsMatch(metric, labelFilter) {
100+
if !testutil.LabelsMatch(metric, labelFilter) {
108101
continue
109102
}
110103
counterSum += int(metric.GetCounter().GetValue())

staging/src/k8s.io/component-base/metrics/testutil/metrics.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,3 +360,25 @@ func GetHistogramMetricValue(m metrics.ObserverMetric) (float64, error) {
360360
}
361361
return metricProto.Histogram.GetSampleSum(), nil
362362
}
363+
364+
// LabelsMatch returns true if metric has all expected labels otherwise false
365+
func LabelsMatch(metric *dto.Metric, labelFilter map[string]string) bool {
366+
metricLabels := map[string]string{}
367+
368+
for _, labelPair := range metric.Label {
369+
metricLabels[labelPair.GetName()] = labelPair.GetValue()
370+
}
371+
372+
// length comparison then match key to values in the maps
373+
if len(labelFilter) > len(metricLabels) {
374+
return false
375+
}
376+
377+
for labelName, labelValue := range labelFilter {
378+
if value, ok := metricLabels[labelName]; !ok || value != labelValue {
379+
return false
380+
}
381+
}
382+
383+
return true
384+
}

staging/src/k8s.io/component-base/metrics/testutil/metrics_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,91 @@ func TestHistogramValidate(t *testing.T) {
265265
}
266266
}
267267
}
268+
269+
func TestLabelsMatch(t *testing.T) {
270+
cases := []struct {
271+
name string
272+
metric *dto.Metric
273+
labelFilter map[string]string
274+
expectedMatch bool
275+
}{
276+
{name: "metric labels and labelFilter have the same labels and values", metric: &dto.Metric{
277+
Label: []*dto.LabelPair{
278+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
279+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
280+
{Name: pointer.StringPtr("c"), Value: pointer.StringPtr("3")},
281+
}}, labelFilter: map[string]string{
282+
"a": "1",
283+
"b": "2",
284+
"c": "3",
285+
}, expectedMatch: true},
286+
{name: "metric labels contain all labelFilter labels, and labelFilter is a subset of metric labels", metric: &dto.Metric{
287+
Label: []*dto.LabelPair{
288+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
289+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
290+
{Name: pointer.StringPtr("c"), Value: pointer.StringPtr("3")},
291+
}}, labelFilter: map[string]string{
292+
"a": "1",
293+
"b": "2",
294+
}, expectedMatch: true},
295+
{name: "metric labels don't have all labelFilter labels and value", metric: &dto.Metric{
296+
Label: []*dto.LabelPair{
297+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
298+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
299+
}}, labelFilter: map[string]string{
300+
"a": "1",
301+
"b": "2",
302+
"c": "3",
303+
}, expectedMatch: false},
304+
{name: "The intersection of metric labels and labelFilter labels is empty", metric: &dto.Metric{
305+
Label: []*dto.LabelPair{
306+
{Name: pointer.StringPtr("aa"), Value: pointer.StringPtr("11")},
307+
{Name: pointer.StringPtr("bb"), Value: pointer.StringPtr("22")},
308+
{Name: pointer.StringPtr("cc"), Value: pointer.StringPtr("33")},
309+
}}, labelFilter: map[string]string{
310+
"a": "1",
311+
"b": "2",
312+
"c": "3",
313+
}, expectedMatch: false},
314+
{name: "metric labels have the same labels names but different values with labelFilter labels and value", metric: &dto.Metric{
315+
Label: []*dto.LabelPair{
316+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
317+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
318+
{Name: pointer.StringPtr("c"), Value: pointer.StringPtr("3")},
319+
}}, labelFilter: map[string]string{
320+
"a": "11",
321+
"b": "2",
322+
"c": "3",
323+
}, expectedMatch: false},
324+
{name: "metric labels contain label name but different values with labelFilter labels and value", metric: &dto.Metric{
325+
Label: []*dto.LabelPair{
326+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
327+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
328+
{Name: pointer.StringPtr("c"), Value: pointer.StringPtr("33")},
329+
{Name: pointer.StringPtr("d"), Value: pointer.StringPtr("4")},
330+
}}, labelFilter: map[string]string{
331+
"a": "1",
332+
"b": "2",
333+
"c": "3",
334+
}, expectedMatch: false},
335+
{name: "metric labels is empty and labelFilter is not empty", metric: &dto.Metric{
336+
Label: []*dto.LabelPair{}}, labelFilter: map[string]string{
337+
"a": "1",
338+
"b": "2",
339+
"c": "3",
340+
}, expectedMatch: false},
341+
{name: "metric labels is not empty and labelFilter is empty", metric: &dto.Metric{
342+
Label: []*dto.LabelPair{
343+
{Name: pointer.StringPtr("a"), Value: pointer.StringPtr("1")},
344+
{Name: pointer.StringPtr("b"), Value: pointer.StringPtr("2")},
345+
}}, labelFilter: map[string]string{}, expectedMatch: true},
346+
}
347+
for _, tt := range cases {
348+
t.Run(tt.name, func(t *testing.T) {
349+
got := LabelsMatch(tt.metric, tt.labelFilter)
350+
if got != tt.expectedMatch {
351+
t.Errorf("Expected %v, got %v instead", tt.expectedMatch, got)
352+
}
353+
})
354+
}
355+
}

0 commit comments

Comments
 (0)