From 755bbca820db30c1a1d071d0ab4709fc49c003a5 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 31 Jul 2017 21:50:30 -0400 Subject: [PATCH] Fix duplicate metrics collector registration attempted error Kubernetes-commit: 1da4f4a745bf536c34e377321a252b4774d1a7e0 --- tools/cache/reflector.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/cache/reflector.go b/tools/cache/reflector.go index ca73ba92..d0cb2dd1 100644 --- a/tools/cache/reflector.go +++ b/tools/cache/reflector.go @@ -30,6 +30,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "syscall" "time" @@ -98,12 +99,17 @@ func NewReflector(lw ListerWatcher, expectedType interface{}, store Store, resyn return NewNamedReflector(getDefaultReflectorName(internalPackages...), lw, expectedType, store, resyncPeriod) } +// reflectorDisambiguator is used to disambiguate started reflectors. +// initialized to an unstable value to ensure meaning isn't attributed to the suffix. +var reflectorDisambiguator = int64(time.Now().UnixNano() % 12345) + // NewNamedReflector same as NewReflector, but with a specified name for logging func NewNamedReflector(name string, lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { + reflectorSuffix := atomic.AddInt64(&reflectorDisambiguator, 1) r := &Reflector{ name: name, // we need this to be unique per process (some names are still the same)but obvious who it belongs to - metrics: newReflectorMetrics(makeValidPromethusMetricName(fmt.Sprintf("reflector_"+name+"_%07d", rand.Intn(1000000)))), + metrics: newReflectorMetrics(makeValidPromethusMetricName(fmt.Sprintf("reflector_"+name+"_%d", reflectorSuffix))), listerWatcher: lw, store: store, expectedType: reflect.TypeOf(expectedType),