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
3 changes: 3 additions & 0 deletions prometheus_client/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,9 @@ def info(self, val: Dict[str, str]) -> None:
self._labelnames, val))
if any(i is None for i in val.values()):
raise ValueError('Label value cannot be None')
for k, v in val.items():
if not isinstance(k, str) or not isinstance(v, str):
raise ValueError(f'Info keys and values must be strings, got {k!r}: {v!r}')
with self._lock:
self._value = dict(val)

Expand Down
14 changes: 14 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
from prometheus_client.decorator import getargspec
from prometheus_client.exposition import generate_latest
from prometheus_client.metrics import _get_use_created
from prometheus_client.openmetrics.exposition import (
generate_latest as openmetrics_generate_latest,
)
from prometheus_client.validation import (
disable_legacy_validation, enable_legacy_validation,
)
Expand Down Expand Up @@ -587,6 +590,17 @@ def test_labels(self):
self.labels.labels('a').info({'foo': 'bar'})
self.assertEqual(1, self.registry.get_sample_value('il_info', {'l': 'a', 'foo': 'bar'}))

def test_non_string_keys_and_values(self):
self.info.info({'version': '1.2.3'})
for val in ({'version': 1}, {'temperature': 49.0}, {1: 'x'}, {'tags': ['a', 'b']}):
with self.subTest(val=val):
self.assertRaises(ValueError, self.info.info, val)
self.assertRaises(ValueError, self.labels.labels('a').info, val)
# The rejected calls keep the previous value and the registry stays scrapeable.
self.assertEqual(1, self.registry.get_sample_value('i_info', {'version': '1.2.3'}))
self.assertIn(b'i_info{version="1.2.3"} 1.0', generate_latest(self.registry))
self.assertIn(b'i_info{version="1.2.3"} 1.0', openmetrics_generate_latest(self.registry))


class TestEnum(unittest.TestCase):
def setUp(self):
Expand Down