From a4f31e0de700938e015f2208119bd0e12845ccdb Mon Sep 17 00:00:00 2001 From: RainbowMango Date: Wed, 15 Jan 2020 18:02:56 +0800 Subject: [PATCH] Add NewFakeKubeRegistry() for testing deprecated metrics. --- .../k8s.io/component-base/metrics/registry.go | 5 +- .../metrics/testutil/testutil.go | 20 +++++ .../metrics/testutil/testutil_test.go | 89 +++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 staging/src/k8s.io/component-base/metrics/testutil/testutil_test.go diff --git a/staging/src/k8s.io/component-base/metrics/registry.go b/staging/src/k8s.io/component-base/metrics/registry.go index 277166e9b5e..65dd3a60d32 100644 --- a/staging/src/k8s.io/component-base/metrics/registry.go +++ b/staging/src/k8s.io/component-base/metrics/registry.go @@ -279,6 +279,9 @@ func (kr *kubeRegistry) enableHiddenStableCollectors() { kr.CustomMustRegister(cs...) } +// BuildVersion is a helper function that can be easily mocked. +var BuildVersion = version.Get + func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry { r := &kubeRegistry{ PromRegistry: prometheus.NewRegistry(), @@ -296,7 +299,7 @@ func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry { // NewKubeRegistry creates a new vanilla Registry without any Collectors // pre-registered. func NewKubeRegistry() KubeRegistry { - r := newKubeRegistry(version.Get()) + r := newKubeRegistry(BuildVersion()) return r } diff --git a/staging/src/k8s.io/component-base/metrics/testutil/testutil.go b/staging/src/k8s.io/component-base/metrics/testutil/testutil.go index 3710edf0a26..eefef4aa025 100644 --- a/staging/src/k8s.io/component-base/metrics/testutil/testutil.go +++ b/staging/src/k8s.io/component-base/metrics/testutil/testutil.go @@ -17,10 +17,12 @@ limitations under the License. package testutil import ( + "fmt" "io" "github.com/prometheus/client_golang/prometheus/testutil" + apimachineryversion "k8s.io/apimachinery/pkg/version" "k8s.io/component-base/metrics" ) @@ -48,3 +50,21 @@ func CustomCollectAndCompare(c metrics.StableCollector, expected io.Reader, metr return GatherAndCompare(registry, expected, metricNames...) } + +// NewFakeKubeRegistry creates a fake `KubeRegistry` that takes the input version as `build in version`. +// It should only be used in testing scenario especially for the deprecated metrics. +// The input version format should be `major.minor.patch`, e.g. '1.18.0'. +func NewFakeKubeRegistry(ver string) metrics.KubeRegistry { + backup := metrics.BuildVersion + defer func() { + metrics.BuildVersion = backup + }() + + metrics.BuildVersion = func() apimachineryversion.Info { + return apimachineryversion.Info{ + GitVersion: fmt.Sprintf("v%s-alpha+1.12345", ver), + } + } + + return metrics.NewKubeRegistry() +} diff --git a/staging/src/k8s.io/component-base/metrics/testutil/testutil_test.go b/staging/src/k8s.io/component-base/metrics/testutil/testutil_test.go new file mode 100644 index 00000000000..9123cb55185 --- /dev/null +++ b/staging/src/k8s.io/component-base/metrics/testutil/testutil_test.go @@ -0,0 +1,89 @@ +/* +Copyright 2020 The Kubernetes 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 testutil + +import ( + "strings" + "testing" + + "k8s.io/component-base/metrics" +) + +func TestNewFakeKubeRegistry(t *testing.T) { + registryVersion := "1.18.0" + counter := metrics.NewCounter( + &metrics.CounterOpts{ + Name: "test_counter_name", + Help: "counter help", + }, + ) + deprecatedCounter := metrics.NewCounter( + &metrics.CounterOpts{ + Name: "test_deprecated_counter", + Help: "counter help", + DeprecatedVersion: "1.18.0", + }, + ) + hiddenCounter := metrics.NewCounter( + &metrics.CounterOpts{ + Name: "test_hidden_counter", + Help: "counter help", + DeprecatedVersion: "1.17.0", + }, + ) + + var tests = []struct { + name string + metric *metrics.Counter + expected string + }{ + { + name: "normal", + metric: counter, + expected: ` + # HELP test_counter_name [ALPHA] counter help + # TYPE test_counter_name counter + test_counter_name 0 + `, + }, + { + name: "deprecated", + metric: deprecatedCounter, + expected: ` + # HELP test_deprecated_counter [ALPHA] (Deprecated since 1.18.0) counter help + # TYPE test_deprecated_counter counter + test_deprecated_counter 0 + `, + }, + { + name: "hidden", + metric: hiddenCounter, + expected: ``, + }, + } + + for _, test := range tests { + tc := test + t.Run(tc.name, func(t *testing.T) { + registry := NewFakeKubeRegistry(registryVersion) + registry.MustRegister(tc.metric) + if err := GatherAndCompare(registry, strings.NewReader(tc.expected), tc.metric.FQName()); err != nil { + t.Fatal(err) + } + }) + } +}