From 42d00418048536cff8d3de367c4e7fb77f3b83ac Mon Sep 17 00:00:00 2001 From: Han Kang Date: Wed, 5 Jun 2019 17:34:56 -0700 Subject: [PATCH] preload metrics for legacyregistry for backwards compatibility The global prometheus registry comes preloaded with process and go metrics. Since these are not under kubernetes control, they can't be considered stable. However, we can make a best effort to maintain backwards compatibility by preloading the same metrics. --- .../metrics/legacyregistry/BUILD | 1 + .../metrics/legacyregistry/registry.go | 10 +++++-- .../metrics/legacyregistry/registry_test.go | 30 +++++++++++++++++++ .../k8s.io/component-base/metrics/registry.go | 15 ++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/component-base/metrics/legacyregistry/BUILD b/staging/src/k8s.io/component-base/metrics/legacyregistry/BUILD index 2afa5d91353..d713da30039 100644 --- a/staging/src/k8s.io/component-base/metrics/legacyregistry/BUILD +++ b/staging/src/k8s.io/component-base/metrics/legacyregistry/BUILD @@ -10,6 +10,7 @@ go_library( deps = [ "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", ], ) diff --git a/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go b/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go index 2653cf54f32..cd824e54df9 100644 --- a/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go +++ b/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go @@ -18,9 +18,11 @@ package legacyregistry import ( "fmt" + "sync" + + "github.com/prometheus/client_golang/prometheus" apimachineryversion "k8s.io/apimachinery/pkg/version" "k8s.io/component-base/metrics" - "sync" ) var globalRegistryFactory = metricsRegistryFactory{ @@ -51,7 +53,11 @@ func SetRegistryFactoryVersion(ver apimachineryversion.Info) []error { return nil } registrationErrs := make([]error, 0) - globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver) + preloadedMetrics := []prometheus.Collector{ + prometheus.NewGoCollector(), + prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}), + } + globalRegistryFactory.globalRegistry = metrics.NewPreloadedKubeRegistry(ver, preloadedMetrics...) globalRegistryFactory.kubeVersion = &ver for _, c := range globalRegistryFactory.registerQueue { err := globalRegistryFactory.globalRegistry.Register(c) diff --git a/staging/src/k8s.io/component-base/metrics/legacyregistry/registry_test.go b/staging/src/k8s.io/component-base/metrics/legacyregistry/registry_test.go index fdb4b13c50a..cde07f4d9f2 100644 --- a/staging/src/k8s.io/component-base/metrics/legacyregistry/registry_test.go +++ b/staging/src/k8s.io/component-base/metrics/legacyregistry/registry_test.go @@ -193,3 +193,33 @@ func TestDeferredMustRegister(t *testing.T) { }, "Did not panic even though we expected it.") } + +func TestPreloadedMetrics(t *testing.T) { + // reset the global registry for this test. + globalRegistryFactory = metricsRegistryFactory{ + registerQueue: make([]metrics.KubeCollector, 0), + mustRegisterQueue: make([]metrics.KubeCollector, 0), + } + + SetRegistryFactoryVersion(apimachineryversion.Info{ + Major: "1", + Minor: "15", + GitVersion: "v1.15.0-alpha-1.12345", + }) + // partial list of some preregistered metrics we expect + expectedMetricNames := []string{"go_gc_duration_seconds", "process_start_time_seconds"} + + mf, err := globalRegistryFactory.globalRegistry.Gather() + if err != nil { + t.Errorf("Got unexpected error %v ", err) + } + metricNames := map[string]struct{}{} + for _, f := range mf { + metricNames[f.GetName()] = struct{}{} + } + for _, expectedMetric := range expectedMetricNames { + if _, ok := metricNames[expectedMetric]; !ok { + t.Errorf("Expected %v to be preregistered", expectedMetric) + } + } +} diff --git a/staging/src/k8s.io/component-base/metrics/registry.go b/staging/src/k8s.io/component-base/metrics/registry.go index 1471cd7a8da..70a7db3f093 100644 --- a/staging/src/k8s.io/component-base/metrics/registry.go +++ b/staging/src/k8s.io/component-base/metrics/registry.go @@ -94,3 +94,18 @@ func NewKubeRegistry(v apimachineryversion.Info) KubeRegistry { version: parseVersion(v), } } + +// NewPreloadedKubeRegistry creates a new Registry with preloaded prometheus collectors +// already registered. This is exposed specifically to maintain backwards +// compatibility with the global prometheus registry. +// +// Deprecated +func NewPreloadedKubeRegistry(v apimachineryversion.Info, cs ...prometheus.Collector) KubeRegistry { + registry := &kubeRegistry{ + PromRegistry: prometheus.NewRegistry(), + version: parseVersion(v), + } + + registry.PromRegistry.MustRegister(cs...) + return registry +}