handle global registry version loading more than once (with different versions)

This commit is contained in:
Han Kang 2019-05-08 10:54:20 -07:00
parent 91d3a79aaf
commit 6d839235c2
5 changed files with 17 additions and 11 deletions

View File

@ -74,7 +74,7 @@ func TestCounter(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(&apimachineryversion.Info{ registry := NewKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",
@ -175,7 +175,7 @@ func TestCounterVec(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(&apimachineryversion.Info{ registry := NewKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -17,6 +17,7 @@ limitations under the License.
package legacyregistry package legacyregistry
import ( import (
"fmt"
apimachineryversion "k8s.io/apimachinery/pkg/version" apimachineryversion "k8s.io/apimachinery/pkg/version"
"k8s.io/component-base/metrics" "k8s.io/component-base/metrics"
"sync" "sync"
@ -38,15 +39,20 @@ type metricsRegistryFactory struct {
// SetRegistryFactoryVersion sets the kubernetes version information for all // SetRegistryFactoryVersion sets the kubernetes version information for all
// subsequent metrics registry initializations. Only the first call has an effect. // subsequent metrics registry initializations. Only the first call has an effect.
// If a version is not set, then metrics registry creation will no-opt // If a version is not set, then metrics registry creation will no-opt
func SetRegistryFactoryVersion(ver *apimachineryversion.Info) []error { func SetRegistryFactoryVersion(ver apimachineryversion.Info) []error {
globalRegistryFactory.registrationLock.Lock() globalRegistryFactory.registrationLock.Lock()
defer globalRegistryFactory.registrationLock.Unlock() defer globalRegistryFactory.registrationLock.Unlock()
if globalRegistryFactory.kubeVersion != nil { if globalRegistryFactory.kubeVersion != nil {
if globalRegistryFactory.kubeVersion.String() != ver.String() {
panic(fmt.Sprintf("Cannot load a global registry more than once, had %s tried to load %s",
globalRegistryFactory.kubeVersion.String(),
ver.String()))
}
return nil return nil
} }
registrationErrs := make([]error, 0) registrationErrs := make([]error, 0)
globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver) globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver)
globalRegistryFactory.kubeVersion = ver globalRegistryFactory.kubeVersion = &ver
for _, c := range globalRegistryFactory.registerQueue { for _, c := range globalRegistryFactory.registerQueue {
err := globalRegistryFactory.globalRegistry.Register(c) err := globalRegistryFactory.globalRegistry.Register(c)
if err != nil { if err != nil {

View File

@ -27,7 +27,7 @@ import (
) )
func init() { func init() {
SetRegistryFactoryVersion(&apimachineryversion.Info{ SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",
@ -161,7 +161,7 @@ func TestDeferredRegister(t *testing.T) {
t.Errorf("Got err == %v, expected no error", err) t.Errorf("Got err == %v, expected no error", err)
} }
// set the global registry version // set the global registry version
errs := SetRegistryFactoryVersion(&apimachineryversion.Info{ errs := SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",
@ -185,7 +185,7 @@ func TestDeferredMustRegister(t *testing.T) {
MustRegister(alphaDeprecatedCounter) MustRegister(alphaDeprecatedCounter)
assert.Panics(t, assert.Panics(t,
func() { func() {
SetRegistryFactoryVersion(&apimachineryversion.Info{ SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -88,9 +88,9 @@ func (kr *kubeRegistry) Gather() ([]*dto.MetricFamily, error) {
// NewKubeRegistry creates a new vanilla Registry without any Collectors // NewKubeRegistry creates a new vanilla Registry without any Collectors
// pre-registered. // pre-registered.
func NewKubeRegistry(v *apimachineryversion.Info) KubeRegistry { func NewKubeRegistry(v apimachineryversion.Info) KubeRegistry {
return &kubeRegistry{ return &kubeRegistry{
PromRegistry: prometheus.NewRegistry(), PromRegistry: prometheus.NewRegistry(),
version: parseVersion(*v), version: parseVersion(v),
} }
} }

View File

@ -108,7 +108,7 @@ func TestRegister(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(&apimachineryversion.Info{ registry := NewKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",
@ -179,7 +179,7 @@ func TestMustRegister(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(&apimachineryversion.Info{ registry := NewKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345", GitVersion: "v1.15.0-alpha-1.12345",