Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion prometheus_client/metrics_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ def add_metric(self, labels: Sequence[str], value: float, timestamp: Optional[Un
labels: A list of label values
value: The value of the metric.
"""
labels = tuple(str(l) for l in labels)
self.samples.append(Sample(self.name, dict(zip(self._labelnames, labels)), value, timestamp))


Expand Down Expand Up @@ -140,6 +141,7 @@ def add_metric(self,
value: The value of the metric
created: Optional unix timestamp the child was created at.
"""
labels = tuple(str(l) for l in labels)
self.samples.append(Sample(self.name + '_total', dict(zip(self._labelnames, labels)), value, timestamp, exemplar))
if created is not None:
self.samples.append(Sample(self.name + '_created', dict(zip(self._labelnames, labels)), created, timestamp))
Expand Down Expand Up @@ -174,6 +176,7 @@ def add_metric(self, labels: Sequence[str], value: float, timestamp: Optional[Un
labels: A list of label values
value: A float
"""
labels = tuple(str(l) for l in labels)
self.samples.append(Sample(self.name, dict(zip(self._labelnames, labels)), value, timestamp))


Expand Down Expand Up @@ -217,6 +220,7 @@ def add_metric(self,
count_value: The count value of the metric.
sum_value: The sum value of the metric.
"""
labels = tuple(str(l) for l in labels)
self.samples.append(Sample(self.name + '_count', dict(zip(self._labelnames, labels)), count_value, timestamp))
self.samples.append(Sample(self.name + '_sum', dict(zip(self._labelnames, labels)), sum_value, timestamp))

Expand Down Expand Up @@ -261,6 +265,7 @@ def add_metric(self,
The buckets must be sorted, and +Inf present.
sum_value: The sum value of the metric.
"""
labels = tuple(str(l) for l in labels)
for b in buckets:
bucket, value = b[:2]
exemplar = None
Expand Down Expand Up @@ -319,6 +324,7 @@ def add_metric(self,
The buckets must be sorted, and +Inf present.
gsum_value: The sum value of the metric.
"""
labels = tuple(str(l) for l in labels)
for bucket, value in buckets:
self.samples.append(Sample(
self.name + '_bucket',
Expand Down Expand Up @@ -364,6 +370,7 @@ def add_metric(self,
labels: A list of label values
value: A dict of labels
"""
labels = tuple(str(l) for l in labels)
self.samples.append(Sample(
self.name + '_info',
dict(dict(zip(self._labelnames, labels)), **value),
Expand Down Expand Up @@ -404,7 +411,7 @@ def add_metric(self,
labels: A list of label values
value: A dict of string state names to booleans
"""
labels = tuple(labels)
labels = tuple(str(l) for l in labels)
for state, enabled in sorted(value.items()):
v = (1 if enabled else 0)
self.samples.append(Sample(
Expand Down
50 changes: 50 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
StateSetMetricFamily, Summary, SummaryMetricFamily, UntypedMetricFamily,
)
from prometheus_client.decorator import getargspec
from prometheus_client.exposition import generate_latest
from prometheus_client.metrics import _get_use_created
from prometheus_client.validation import (
disable_legacy_validation, enable_legacy_validation,
Expand Down Expand Up @@ -889,6 +890,55 @@ def test_stateset_labels(self):
self.assertEqual(0, self.registry.get_sample_value('s', {'foo': 'bar', 's': 'a'}))
self.assertEqual(0, self.registry.get_sample_value('s', {'foo': 'bar', 's': 'b'}))

def test_labels_coerced_to_string(self):
umf = UntypedMetricFamily('u', 'help', labels=['a'])
umf.add_metric([1], 2)
self.custom_collector(umf)
self.assertEqual(2, self.registry.get_sample_value('u', {'a': '1'}))

cmf = CounterMetricFamily('c', 'help', labels=['a'])
cmf.add_metric([1], 2, created=3)
self.custom_collector(cmf)
self.assertEqual(2, self.registry.get_sample_value('c_total', {'a': '1'}))
self.assertEqual(3, self.registry.get_sample_value('c_created', {'a': '1'}))

gmf = GaugeMetricFamily('g', 'help', labels=['a'])
gmf.add_metric([1], 2)
self.custom_collector(gmf)
self.assertEqual(2, self.registry.get_sample_value('g', {'a': '1'}))

smf = SummaryMetricFamily('s', 'help', labels=['a'])
smf.add_metric([1], count_value=1, sum_value=2)
self.custom_collector(smf)
self.assertEqual(1, self.registry.get_sample_value('s_count', {'a': '1'}))
self.assertEqual(2, self.registry.get_sample_value('s_sum', {'a': '1'}))

hmf = HistogramMetricFamily('h', 'help', labels=['a'])
hmf.add_metric([1], buckets=[('0', 1), ('+Inf', 2)], sum_value=3)
self.custom_collector(hmf)
self.assertEqual(1, self.registry.get_sample_value('h_bucket', {'a': '1', 'le': '0'}))
self.assertEqual(2, self.registry.get_sample_value('h_count', {'a': '1'}))
self.assertEqual(3, self.registry.get_sample_value('h_sum', {'a': '1'}))

ghmf = GaugeHistogramMetricFamily('gh', 'help', labels=['a'])
ghmf.add_metric([1], buckets=[('0', 1), ('+Inf', 2)], gsum_value=3)
self.custom_collector(ghmf)
self.assertEqual(1, self.registry.get_sample_value('gh_bucket', {'a': '1', 'le': '0'}))
self.assertEqual(2, self.registry.get_sample_value('gh_gcount', {'a': '1'}))
self.assertEqual(3, self.registry.get_sample_value('gh_gsum', {'a': '1'}))

imf = InfoMetricFamily('i', 'help', labels=['a'])
imf.add_metric([1], {'c': 'd'})
self.custom_collector(imf)
self.assertEqual(1, self.registry.get_sample_value('i_info', {'a': '1', 'c': 'd'}))

ssf = StateSetMetricFamily('ss', 'help', labels=['a'])
ssf.add_metric([1], {'x': True})
self.custom_collector(ssf)
self.assertEqual(1, self.registry.get_sample_value('ss', {'a': '1', 'ss': 'x'}))

self.assertIn(b'g{a="1"} 2.0', generate_latest(self.registry))

def test_bad_constructors(self):
self.assertRaises(ValueError, UntypedMetricFamily, 'u', 'help', value=1, labels=[])
self.assertRaises(ValueError, UntypedMetricFamily, 'u', 'help', value=1, labels=['a'])
Expand Down
Loading