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

View File

@ -17,6 +17,7 @@ limitations under the License.
package legacyregistry
import (
"fmt"
apimachineryversion "k8s.io/apimachinery/pkg/version"
"k8s.io/component-base/metrics"
"sync"
@ -38,15 +39,20 @@ type metricsRegistryFactory struct {
// SetRegistryFactoryVersion sets the kubernetes version information for all
// subsequent metrics registry initializations. Only the first call has an effect.
// 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()
defer globalRegistryFactory.registrationLock.Unlock()
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
}
registrationErrs := make([]error, 0)
globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver)
globalRegistryFactory.kubeVersion = ver
globalRegistryFactory.kubeVersion = &ver
for _, c := range globalRegistryFactory.registerQueue {
err := globalRegistryFactory.globalRegistry.Register(c)
if err != nil {

View File

@ -27,7 +27,7 @@ import (
)
func init() {
SetRegistryFactoryVersion(&apimachineryversion.Info{
SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
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)
}
// set the global registry version
errs := SetRegistryFactoryVersion(&apimachineryversion.Info{
errs := SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -185,7 +185,7 @@ func TestDeferredMustRegister(t *testing.T) {
MustRegister(alphaDeprecatedCounter)
assert.Panics(t,
func() {
SetRegistryFactoryVersion(&apimachineryversion.Info{
SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
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
// pre-registered.
func NewKubeRegistry(v *apimachineryversion.Info) KubeRegistry {
func NewKubeRegistry(v apimachineryversion.Info) KubeRegistry {
return &kubeRegistry{
PromRegistry: prometheus.NewRegistry(),
version: parseVersion(*v),
version: parseVersion(v),
}
}

View File

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