8000 Add UntypedMetricFamily to prometheus_client.core (#220) · jcsdatera/client_python@9828994 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9828994

Browse files
idsvandermolenbrian-brazil
authored andcommitted
Add UntypedMetricFamily to prometheus_client.core (prometheus#220)
1 parent 4e25eab commit 9828994

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

prometheus_client/core.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,29 @@ def __eq__(self, other):
176176
and self.samples == other.samples)
177177

178178

179+
class UntypedMetricFamily(Metric):
180+
'''A single untyped metric and its samples.
181+
For use by custom collectors.
182+
'''
183+
def __init__(self, name, documentation, value=None, labels=None):
184+
Metric.__init__(self, name, documentation, 'untyped')
185+
if labels is not None and value is not None:
186+
raise ValueError('Can only specify at most one of value and labels.')
187+
if labels is None:
188+
labels = []
189+
self._labelnames = tuple(labels)
190+
if value is not None:
191+
self.add_metric([], value)
192+
193+
def add_metric(self, labels, value):
194+
'''Add a metric to the metric family.
195+
Args:
196+
labels: A list of label values
197+
value: The value of the metric.
198+
'''
199+
self.samples.append((self.name, dict(zip(self._labelnames, labels)), value))
200+
201+
179202
class CounterMetricFamily(Metric):
180203
'''A single counter and its samples.
181204

tests/test_core.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,16 @@ def collect(self):
321321
return [metric_family]
322322
self.registry.register(CustomCollector())
323323

324+
def test_untyped(self):
325+
self.custom_collector(UntypedMetricFamily('u', 'help', value=1))
326+
self.assertEqual(1, self.registry.get_sample_value('u', {}))
327+
328+
def test_untyped_labels(self):
329+
cmf = UntypedMetricFamily('u', 'help', labels=['a', 'c'])
330+
cmf.add_metric(['b', 'd'], 2)
331+
self.custom_collector(cmf)
332+
self.assertEqual(2, self.registry.get_sample_value('u', {'a': 'b', 'c': 'd'}))
333+
324334
def test_counter(self):
325335
self.custom_collector(CounterMetricFamily('c', 'help', value=1))
326336
self.assertEqual(1, self.registry.get_sample_value('c', {}))
@@ -370,6 +380,9 @@ def test_histogram_labels(self):
370380
self.assertEqual(3, self.registry.get_sample_value('h_sum', {'a': 'b'}))
371381

372382
def test_bad_constructors(self):
383+
self.assertRaises(ValueError, UntypedMetricFamily, 'u', 'help', value=1, labels=[])
384+
self.assertRaises(ValueError, UntypedMetricFamily, 'u', 'help', value=1, labels=['a'])
385+
373386
self.assertRaises(ValueError, CounterMetricFamily, 'c', 'help', value=1, labels=[])
374387
self.assertRaises(ValueError, CounterMetricFamily, 'c', 'help', value=1, labels=['a'])
375388

@@ -390,6 +403,8 @@ def test_bad_constructors(self):
390403
self.assertRaises(KeyError, HistogramMetricFamily, 'h', 'help', buckets={}, sum_value=1)
391404

392405
def test_labelnames(self):
406+
cmf = UntypedMetricFamily('u', 'help', labels=iter(['a']))
407+
self.assertEqual(('a',), cmf._labelnames)
393408
cmf = CounterMetricFamily('c', 'help', labels=iter(['a']))
394409
self.assertEqual(('a',), cmf._labelnames)
395410
gmf = GaugeMetricFamily('g', 'help', labels=iter(['a']))

0 commit comments

Comments
 (0)
0