8000 Merge pull request #87 from alex/labels-as-kwargs · yeahnoob/client_python@bda36bf · GitHub
[go: up one dir, main page]

Skip to content

Commit bda36bf

Browse files
authored
Merge pull request prometheus#87 from alex/labels-as-kwargs
Allow passing label values as keyword arguments
2 parents cba7100 + 882d576 commit bda36bf

File tree

3 files changed

+25
-22
lines changed

3 files changed

+25
-22
lines changed

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,13 @@ c.labels('get', '/').inc()
185185
c.labels('post', '/submit').inc()
186186
```
187187

188-
Labels can also be provided as a dict:
188+
Labels can also be passed as keyword-arguments:
189189

190190
```python
191191
from prometheus_client import Counter
192192
c = Counter('my_requests_total', 'HTTP Failures', ['method', 'endpoint'])
193-
c.labels({'method': 'get', 'endpoint': '/'}).inc()
194-
c.labels({'method': 'post', 'endpoint': '/submit'}).inc()
193+
c.labels(method='get', endpoint='/').inc()
194+
c.labels(method='post', endpoint='/submit').inc()
195195
```
196196

197197
### Process Collector
@@ -369,7 +369,7 @@ REGISTRY.register(CustomCollector())
369369
## Parser
370370

371371
The Python client supports parsing the Promeheus text format.
372-
This is intended for advanced use cases where you have servers
372+
This is intended for advanced use cases where you have servers
373373
exposing Prometheus metrics and need to get them into some other
374374
system.
375375

@@ -379,4 +379,3 @@ for family in text_string_to_metric_families("my_gauge 1.0\n"):
379379
for sample in family.samples:
380380
print("Name: {0} Labels: {1} Value: {2}".format(*sample))
381381
```
382-

prometheus_client/core.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ def __init__(self, wrappedClass, name, labelnames, **kwargs):
254254
if l.startswith('__'):
255255
raise ValueError('Invalid label metric name: ' + l)
256256

257-
def labels(self, *labelvalues):
257+
def labels(self, *labelvalues, **labelkwargs):
258258
'''Return the child for the given labelset.
259259
260260
All metrics can have labels, allowing grouping of related time series.
@@ -277,10 +277,13 @@ def labels(self, *labelvalues):
277277
See the best practices on [naming](http://prometheus.io/docs/practices/naming/)
278278
and [labels](http://prometheus.io/docs/practices/instrumentation/#use-labels).
279279
'''
280-
if len(labelvalues) == 1 and type(labelvalues[0]) == dict:
281-
if sorted(labelvalues[0].keys()) != sorted(self._labelnames):
280+
if labelvalues and labelkwargs:
281+
raise ValueError("Can't pass both *args and **kwargs")
282+
283+
if labelkwargs:
284+
if sorted(labelkwargs) != sorted(self._labelnames):
282285
raise ValueError('Incorrect label names')
283-
labelvalues = tuple([unicode(labelvalues[0][l]) for l in self._labelnames])
286+
labelvalues = tuple([unicode(labelkwargs[l]) for l in self._labelnames])
284287
else:
285288
if len(labelvalues) != len(self._labelnames):
286289
raise ValueError('Incorrect label count')

tests/test_core.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def test_incorrect_label_count_raises(self):
261261

262262
def test_labels_coerced_to_string(self):
263263
self.counter.labels(None).inc()
264-
self.counter.labels({'l': None}).inc()
264+
self.counter.labels(l=None).inc()
265265
self.assertEqual(2, self.registry.get_sample_value('c', {'l': 'None'}))
266266

267267
self.counter.remove(None)
@@ -271,26 +271,27 @@ def test_non_string_labels_raises(self):
271271
class Test(object):
272272
__str__ = None
273273
self.assertRaises(TypeError, self.counter.labels, Test())
274-
self.assertRaises(TypeError, self.counter.labels, {'l': Test()})
274+
self.assertRaises(TypeError, self.counter.labels, l=Test())
275275

276276
def test_namespace_subsystem_concatenated(self):
277277
c = Counter('c', 'help', namespace='a', subsystem='b', registry=self.registry)
278278
c.inc()
279279
self.assertEqual(1, self.registry.get_sample_value('a_b_c'))
280280

281-
def test_labels_by_dict(self):
282-
self.counter.labels({'l': 'x'}).inc()
281+
def test_labels_by_kwarg(self):
282+
self.counter.labels(l='x').inc()
283283
self.assertEqual(1, self.registry.get_sample_value('c', {'l': 'x'}))
284-
self.assertRaises(ValueError, self.counter.labels, {'l': 'x', 'm': 'y'})
285-
self.assertRaises(ValueError, self.counter.labels, {'m': 'y'})
286-
self.assertRaises(ValueError, self.counter.labels, {})
287-
self.two_labels.labels({'a': 'x', 'b': 'y'}).inc()
284+
self.assertRaises(ValueError, self.counter.labels, l='x', m='y')
285+
self.assertRaises(ValueError, self.counter.labels, m='y')
286+
self.assertRaises(ValueError, self.counter.labels)
287+
self.two_labels.labels(a='x', b='y').inc()
288288
self.assertEqual(1, self.registry.get_sample_value('two', {'a': 'x', 'b': 'y'}))
289-
self.assertRaises(ValueError, self.two_labels.labels, {'a': 'x', 'b': 'y', 'c': 'z'})
290-
self.assertRaises(ValueError, self.two_labels.labels, {'a': 'x', 'c': 'z'})
291-
self.assertRaises(ValueError, self.two_labels.labels, {'b': 'y', 'c': 'z'})
292-
self.assertRaises(ValueError, self.two_labels.labels, {'c': 'z'})
293-
self.assertRaises(ValueError, self.two_labels.labels, {})
289+
self.assertRaises(ValueError, self.two_labels.labels, a='x', b='y', c='z')
290+
self.assertRaises(ValueError, self.two_labels.labels, a='x', c='z')
291+
self.assertRaises(ValueError, self.two_labels.labels, b='y', c='z')
292+
self.assertRaises(ValueError, self.two_labels.labels, c='z')
293+
self.assertRaises(ValueError, self.two_labels.labels)
294+
self.assertRaises(ValueError, self.two_labels.labels, {'a': 'x'}, b='y')
294295

295296
def test_invalid_names_raise(self):
296297
self.assertRaises(ValueError, Counter, '', 'help')

0 commit comments

Comments
 (0)
0