@@ -97,17 +97,30 @@ type Registerable interface {
97
97
FQName () string
98
98
}
99
99
100
+ type resettable interface {
101
+ Reset ()
102
+ }
103
+
100
104
// KubeRegistry is an interface which implements a subset of prometheus.Registerer and
101
105
// prometheus.Gatherer interfaces
102
106
type KubeRegistry interface {
103
107
// Deprecated
104
108
RawMustRegister (... prometheus.Collector )
109
+ // CustomRegister is our internal variant of Prometheus registry.Register
105
110
CustomRegister (c StableCollector ) error
111
+ // CustomMustRegister is our internal variant of Prometheus registry.MustRegister
106
112
CustomMustRegister (cs ... StableCollector )
113
+ // Register conforms to Prometheus registry.Register
107
114
Register (Registerable ) error
115
+ // MustRegister conforms to Prometheus registry.MustRegister
108
116
MustRegister (... Registerable )
117
+ // Unregister conforms to Prometheus registry.Unregister
109
118
Unregister (collector Collector ) bool
119
+ // Gather conforms to Prometheus gatherer.Gather
110
120
Gather () ([]* dto.MetricFamily , error )
121
+ // Reset invokes the Reset() function on all items in the registry
122
+ // which are added as resettables.
123
+ Reset ()
111
124
}
112
125
113
126
// kubeRegistry is a wrapper around a prometheus registry-type object. Upon initialization
@@ -120,6 +133,8 @@ type kubeRegistry struct {
120
133
stableCollectors []StableCollector // stores all stable collector
121
134
hiddenCollectorsLock sync.RWMutex
122
135
stableCollectorsLock sync.RWMutex
136
+ resetLock sync.RWMutex
137
+ resettables []resettable
123
138
}
124
139
125
140
// Register registers a new Collector to be included in metrics
@@ -129,11 +144,11 @@ type kubeRegistry struct {
129
144
// uniqueness criteria described in the documentation of metric.Desc.
130
145
func (kr * kubeRegistry ) Register (c Registerable ) error {
131
146
if c .Create (& kr .version ) {
147
+ defer kr .addResettable (c )
132
148
return kr .PromRegistry .Register (c )
133
149
}
134
150
135
151
kr .trackHiddenCollector (c )
136
-
137
152
return nil
138
153
}
139
154
@@ -145,6 +160,7 @@ func (kr *kubeRegistry) MustRegister(cs ...Registerable) {
145
160
for _ , c := range cs {
146
161
if c .Create (& kr .version ) {
147
162
metrics = append (metrics , c )
163
+ kr .addResettable (c )
148
164
} else {
149
165
kr .trackHiddenCollector (c )
150
166
}
@@ -155,7 +171,7 @@ func (kr *kubeRegistry) MustRegister(cs ...Registerable) {
155
171
// CustomRegister registers a new custom collector.
156
172
func (kr * kubeRegistry ) CustomRegister (c StableCollector ) error {
157
173
kr .trackStableCollectors (c )
158
-
174
+ defer kr . addResettable ( c )
159
175
if c .Create (& kr .version , c ) {
160
176
return kr .PromRegistry .Register (c )
161
177
}
@@ -167,14 +183,13 @@ func (kr *kubeRegistry) CustomRegister(c StableCollector) error {
167
183
// error.
168
184
func (kr * kubeRegistry ) CustomMustRegister (cs ... StableCollector ) {
169
185
kr .trackStableCollectors (cs ... )
170
-
171
186
collectors := make ([]prometheus.Collector , 0 , len (cs ))
172
187
for _ , c := range cs {
173
188
if c .Create (& kr .version , c ) {
189
+ kr .addResettable (c )
174
190
collectors = append (collectors , c )
175
191
}
176
192
}
177
-
178
193
kr .PromRegistry .MustRegister (collectors ... )
179
194
}
180
195
@@ -185,6 +200,19 @@ func (kr *kubeRegistry) CustomMustRegister(cs ...StableCollector) {
185
200
// Deprecated
186
201
func (kr * kubeRegistry ) RawMustRegister (cs ... prometheus.Collector ) {
187
202
kr .PromRegistry .MustRegister (cs ... )
203
+ for _ , c := range cs {
204
+ kr .addResettable (c )
205
+ }
206
+ }
207
+
208
+ // addResettable will automatically add our metric to our reset
209
+ // list if it satisfies the interface
210
+ func (kr * kubeRegistry ) addResettable (i interface {}) {
211
+ kr .resetLock .Lock ()
212
+ defer kr .resetLock .Unlock ()
213
+ if resettable , ok := i .(resettable ); ok {
214
+ kr .resettables = append (kr .resettables , resettable )
215
+ }
188
216
}
189
217
190
218
// Unregister unregisters the Collector that equals the Collector passed
@@ -266,6 +294,15 @@ func (kr *kubeRegistry) enableHiddenStableCollectors() {
266
294
kr .CustomMustRegister (cs ... )
267
295
}
268
296
297
+ // Reset invokes Reset on all metrics that are resettable.
298
+ func (kr * kubeRegistry ) Reset () {
299
+ kr .resetLock .RLock ()
300
+ defer kr .resetLock .RUnlock ()
301
+ for _ , r := range kr .resettables {
302
+ r .Reset ()
303
+ }
304
+ }
305
+
269
306
// BuildVersion is a helper function that can be easily mocked.
270
307
var BuildVersion = version .Get
271
308
@@ -274,6 +311,7 @@ func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry {
274
311
PromRegistry : prometheus .NewRegistry (),
275
312
version : parseVersion (v ),
276
313
hiddenCollectors : make (map [string ]Registerable ),
314
+ resettables : make ([]resettable , 0 ),
277
315
}
278
316
279
317
registriesLock .Lock ()
@@ -287,6 +325,5 @@ func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry {
287
325
// pre-registered.
288
326
func NewKubeRegistry () KubeRegistry {
289
327
r := newKubeRegistry (BuildVersion ())
290
-
291
328
return r
292
329
}
0 commit comments