1515
1616from threading import Lock
1717from timeit import default_timer
18+ from collections import namedtuple
1819
1920from .decorator import decorate
2021
3435_unpack_integer = struct .Struct (b'i' ).unpack_from
3536_unpack_double = struct .Struct (b'd' ).unpack_from
3637
38+ Sample = namedtuple ('Sample' , ['name' , 'labels' , 'value' , 'timestamp' , 'exemplar' ])
39+ # Timestamp and exemplar are optional.
40+ Sample .__new__ .__defaults__ = (None , None )
3741
3842class CollectorRegistry (object ):
3943 '''Metric collector registry.
@@ -142,9 +146,9 @@ def get_sample_value(self, name, labels=None):
142146 if labels is None :
143147 labels = {}
144148 for metric in self .collect ():
145- for n , l , value in metric .samples :
146- if n == name and l == labels :
147- return value
149+ for s in metric .samples :
150+ if s . name == name and s . labels == labels :
151+ return s . value
148152 return None
149153
150154
@@ -175,7 +179,7 @@ def add_sample(self, name, labels, value):
175179 '''Add a sample to the metric.
176180
177181 Internal-only, do not use.'''
178- self .samples .append ((name , labels , value ))
182+ self .samples .append (Sample (name , labels , value ))
179183
180184 def __eq__ (self , other ):
181185 return (isinstance (other , Metric ) and
@@ -208,7 +212,7 @@ def add_metric(self, labels, value):
208212 labels: A list of label values
209213 value: The value of the metric.
210214 '''
211- self .samples .append ((self .name , dict (zip (self ._labelnames , labels )), value ))
215+ self .samples .append (Sample (self .name , dict (zip (self ._labelnames , labels )), value ))
212216
213217
214218class CounterMetricFamily (Metric ):
@@ -237,9 +241,9 @@ def add_metric(self, labels, value, created=None):
237241 value: The value of the metric
238242 created: Optional unix timestamp the child was created at.
239243 '''
240- self .samples .append ((self .name + '_total' , dict (zip (self ._labelnames , labels )), value ))
244+ self .samples .append (Sample (self .name + '_total' , dict (zip (self ._labelnames , labels )), value ))
241245 if created is not None :
242- self .samples .append ((self .name + '_created' , dict (zip (self ._labelnames , labels )), created ))
246+ self .samples .append (Sample (self .name + '_created' , dict (zip (self ._labelnames , labels )), created ))
243247
244248
245249class GaugeMetricFamily (Metric ):
@@ -264,7 +268,7 @@ def add_metric(self, labels, value):
264268 labels: A list of label values
265269 value: A float
266270 '''
267- self .samples .append ((self .name , dict (zip (self ._labelnames , labels )), value ))
271+ self .samples .append (Sample (self .name , dict (zip (self ._labelnames , labels )), value ))
268272
269273
270274class SummaryMetricFamily (Metric ):
@@ -292,8 +296,8 @@ def add_metric(self, labels, count_value, sum_value):
292296 count_value: The count value of the metric.
293297 sum_value: The sum value of the metric.
294298 '''
295- self .samples .append ((self .name + '_count' , dict (zip (self ._labelnames , labels )), count_value ))
296- self .samples .append ((self .name + '_sum' , dict (zip (self ._labelnames , labels )), sum_value ))
299+ self .samples .append (Sample (self .name + '_count' , dict (zip (self ._labelnames , labels )), count_value ))
300+ self .samples .append (Sample (self .name + '_sum' , dict (zip (self ._labelnames , labels )), sum_value ))
297301
298302
299303class HistogramMetricFamily (Metric ):
@@ -323,10 +327,10 @@ def add_metric(self, labels, buckets, sum_value):
323327 sum_value: The sum value of the metric.
324328 '''
325329 for bucket , value in buckets :
326- self .samples .append ((self .name + '_bucket' , dict (list (zip (self ._labelnames , labels )) + [('le' , bucket )]), value ))
330+ self .samples .append (Sample (self .name + '_bucket' , dict (list (zip (self ._labelnames , labels )) + [('le' , bucket )]), value ))
327331 # +Inf is last and provides the count value.
328- self .samples .append ((self .name + '_count' , dict (zip (self ._labelnames , labels )), buckets [- 1 ][1 ]))
329- self .samples .append ((self .name + '_sum' , dict (zip (self ._labelnames , labels )), sum_value ))
332+ self .samples .append (Sample (self .name + '_count' , dict (zip (self ._labelnames , labels )), buckets [- 1 ][1 ]))
333+ self .samples .append (Sample (self .name + '_sum' , dict (zip (self ._labelnames , labels )), sum_value ))
330334
331335
332336class GaugeHistogramMetricFamily (Metric ):
@@ -353,7 +357,10 @@ def add_metric(self, labels, buckets):
353357 The buckets must be sorted, and +Inf present.
354358 '''
355359 for bucket , value in buckets :
356- self .samples .append ((self .name + '_bucket' , dict (list (zip (self ._labelnames , labels )) + [('le' , bucket )]), value ))
360+ self .samples .append (Sample (
361+ self .name + '_bucket' ,
362+ dict (list (zip (self ._labelnames , labels )) + [('le' , bucket )]),
363+ value ))
357364
358365
359366class InfoMetricFamily (Metric ):
@@ -378,7 +385,7 @@ def add_metric(self, labels, value):
378385 labels: A list of label values
379386 value: A dict of labels
380387 '''
381- self .samples .append ((self .name + '_info' ,
388+ self .samples .append (Sample (self .name + '_info' ,
382389 dict (dict (zip (self ._labelnames , labels )), ** value ), 1 ))
383390
384391
@@ -407,7 +414,7 @@ def add_metric(self, labels, value):
407414 labels = tuple (labels )
408415 for state , enabled in value .items ():
409416 v = (1 if enabled else 0 )
410- self .samples .append ((self .name ,
417+ self .samples .append (Sample (self .name ,
411418 dict (zip (self ._labelnames + (self .name ,), labels + (state ,))), v ))
412419
413420
0 commit comments