From 334a5aeda5e654586b61a22da2592da9fb601643 Mon Sep 17 00:00:00 2001 From: Han Kang Date: Thu, 20 Jun 2019 11:43:29 -0700 Subject: [PATCH] enable ability to show hidden metrics --- .../k8s.io/component-base/metrics/metric.go | 4 ++ .../k8s.io/component-base/metrics/registry.go | 24 +++++++++++ .../component-base/metrics/registry_test.go | 41 ++++++++++++++++++- 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/component-base/metrics/metric.go b/staging/src/k8s.io/component-base/metrics/metric.go index 0d2eca5ac86..2c213db879c 100644 --- a/staging/src/k8s.io/component-base/metrics/metric.go +++ b/staging/src/k8s.io/component-base/metrics/metric.go @@ -92,6 +92,10 @@ func (r *lazyMetric) determineDeprecationStatus(version semver.Version) { if selfVersion.LTE(version) { r.isDeprecated = true } + if ShouldShowHidden() { + klog.Warningf("Hidden metrics have been manually overridden, showing this very deprecated metric.") + return + } if selfVersion.LT(version) { klog.Warningf("This metric has been deprecated for more than one release, hiding.") r.isHidden = true diff --git a/staging/src/k8s.io/component-base/metrics/registry.go b/staging/src/k8s.io/component-base/metrics/registry.go index 42615df3099..237ef69c92f 100644 --- a/staging/src/k8s.io/component-base/metrics/registry.go +++ b/staging/src/k8s.io/component-base/metrics/registry.go @@ -17,12 +17,36 @@ limitations under the License. package metrics import ( + "sync" + "sync/atomic" + "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + apimachineryversion "k8s.io/apimachinery/pkg/version" ) +var ( + showHiddenOnce sync.Once + showHidden atomic.Value +) + +// SetShowHidden will enable showing hidden metrics. This will no-opt +// after the initial call +func SetShowHidden() { + showHiddenOnce.Do(func() { + showHidden.Store(true) + }) +} + +// ShouldShowHidden returns whether showing hidden deprecated metrics +// is enabled. While the primary usecase for this is internal (to determine +// registration behavior) this can also be used to introspect +func ShouldShowHidden() bool { + return showHidden.Load() != nil && showHidden.Load().(bool) +} + // Registerable is an interface for a collector metric which we // will register with KubeRegistry. type Registerable interface { diff --git a/staging/src/k8s.io/component-base/metrics/registry_test.go b/staging/src/k8s.io/component-base/metrics/registry_test.go index 30ad55b528f..612f34385d8 100644 --- a/staging/src/k8s.io/component-base/metrics/registry_test.go +++ b/staging/src/k8s.io/component-base/metrics/registry_test.go @@ -17,11 +17,12 @@ limitations under the License. package metrics import ( + "testing" + "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/assert" apimachineryversion "k8s.io/apimachinery/pkg/version" - "testing" ) var ( @@ -195,4 +196,42 @@ func TestMustRegister(t *testing.T) { } }) } + +} +func TestShowHiddenMetric(t *testing.T) { + registry := NewKubeRegistry(apimachineryversion.Info{ + Major: "1", + Minor: "15", + GitVersion: "v1.15.0-alpha-1.12345", + }) + + expectedMetricCount := 0 + registry.MustRegister(alphaHiddenCounter) + + ms, err := registry.Gather() + if len(ms) != expectedMetricCount { + t.Errorf("Got %v metrics, Want: %v metrics", len(ms), expectedMetricCount) + } + showHidden.Store(true) + defer showHidden.Store(false) + registry.MustRegister(NewCounter( + &CounterOpts{ + Namespace: "some_namespace", + Name: "test_alpha_show_hidden_counter", + Subsystem: "subsystem", + StabilityLevel: ALPHA, + Help: "counter help", + DeprecatedVersion: &v114, + }, + )) + expectedMetricCount = 1 + + ms, err = registry.Gather() + if len(ms) != expectedMetricCount { + t.Errorf("Got %v metrics, Want: %v metrics", len(ms), expectedMetricCount) + } + if err != nil { + t.Fatalf("Gather failed %v", err) + } + }