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.
This commit is contained in:
Han Kang 2019-06-05 17:34:56 -07:00
parent 544e93486d
commit 42d0041804
4 changed files with 54 additions and 2 deletions

View File

@ -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",
],
)

View File

@ -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)

View File

@ -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)
}
}
}

View File

@ -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
}