8000 Merge pull request #804 from butlerx/multi-process-help · anantha96/client_python@781e3e1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 781e3e1

Browse files
authored
Merge pull request prometheus#804 from butlerx/multi-process-help
Support metric help text in multiprocess mode
2 parents d6e08e3 + 9a2c50f commit 781e3e1

File tree

5 files changed

+44
-19
lines changed

5 files changed

+44
-19
lines changed

prometheus_client/metrics.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def f():
275275

276276
def _metric_init(self) -> None:
277277
self._value = values.ValueClass(self._type, self._name, self._name + '_total', self._labelnames,
278-
self._labelvalues)
278+
self._labelvalues, self._documentation)
279279
self._created = time.time()
280280

281281
def inc(self, amount: float = 1, exemplar: Optional[Dict[str, str]] = None) -> None:
@@ -377,7 +377,7 @@ def __init__(self,
377377
def _metric_init(self) -> None:
378378
self._value = values.ValueClass(
379379
self._type, self._name, self._name, self._la 8000 belnames, self._labelvalues,
380-
multiprocess_mode=self._multiprocess_mode
380+
self._documentation, multiprocess_mode=self._multiprocess_mode
381381
)
382382

383383
def inc(self, amount: float = 1) -> None:
@@ -469,8 +469,8 @@ def create_response(request):
469469

470470
def _metric_init(self) -> None:
471471
self._count = values.ValueClass(self._type, self._name, self._name + '_count', self._labelnames,
472-
self._labelvalues)
473-
self._sum = values.ValueClass(self._type, self._name, self._name + '_sum', self._labelnames, self._labelvalues)
472+
self._labelvalues, self._documentation)
473+
self._sum = values.ValueClass(self._type, self._name, self._name + '_sum', self._labelnames, self._labelvalues, self._documentation)
474474
self._created = time.time()
475475

476476
def observe(self, amount: float) -> None:
@@ -583,14 +583,15 @@ def _metric_init(self) -> None:
583583
self._buckets: List[values.ValueClass] = []
584584
self._created = time.time()
585585
bucket_labelnames = self._labelnames + ('le',)
586-
self._sum = values.ValueClass(self._type, self._name, self._name + '_sum', self._labelnames, self._labelvalues)
586+
self._sum = values.ValueClass(self._type, self._name, self._name + '_sum', self._labelnames, self._labelvalues, self._documentation)
587587
for b in self._upper_bounds:
588588
self._buckets.append(values.ValueClass(
589589
self._type,
590590
self._name,
591591
self._name + '_bucket',
592592
bucket_labelnames,
593-
self._labelvalues + (floatToGoString(b),))
593+
self._labelvalues + (floatToGoString(b),),
594+
self._documentation)
594595
)
595596

596597
def observe(self, amount: float, exemplar: Optional[Dict[str, str]] = None) -> None:

prometheus_client/mmap_dict.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import mmap
33
import os
44
import struct
5+
from typing import List
56

67
_INITIAL_MMAP_SIZE = 1 << 16
78
_pack_integer_func = struct.Struct(b'i').pack
@@ -137,8 +138,8 @@ def close(self):
137138
self._f = None
138139

139140

140-
def mmap_key(metric_name, name, labelnames, labelvalues):
141+
def mmap_key(metric_name: str, name: str, labelnames: List[str], labelvalues: List[str], help_text: str) -> str:
141142
"""Format a key for use in the mmap file."""
142143
# ensure labels are in consistent order for identity
143144
labels = dict(zip(labelnames, labelvalues))
144-
return json.dumps([metric_name, name, labels], sort_keys=True)
145+
return json.dumps([metric_name, name, labels, help_text], sort_keys=True)

prometheus_client/multiprocess.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
except NameError: # Python >= 2.5
1616
FileNotFoundError = IOError
1717

18-
MP_METRIC_HELP = 'Multiprocess metric'
19-
2018

2119
class MultiProcessCollector:
2220
"""Collector for files for multi-process mode."""
@@ -53,9 +51,9 @@ def _read_metrics(files):
5351
def _parse_key(key):
5452
val = key_cache.get(key)
5553
if not val:
56-
metric_name, name, labels = json.loads(key)
54+
metric_name, name, labels, help_text = json.loads(key)
5755
labels_key = tuple(sorted(labels.items()))
58-
val = key_cache[key] = (metric_name, name, labels, labels_key)
56+
val = key_cache[key] = (metric_name, name, labels, labels_key, help_text)
5957
return val
6058

6159
for f in files:
@@ -71,11 +69,11 @@ def _parse_key(key):
7169
continue
7270
raise
7371
for key, value, _ in file_values:
74-
metric_name, name, labels, labels_key = _parse_key(key)
72+
metric_name, name, labels, labels_key, help_text = _parse_key(key)
7573

7674
metric = metrics.get(metric_name)
7775
if metric is None:
78-
metric = Metric(metric_name, MP_METRIC_HELP, typ)
76+
metric = Metric(metric_name, help_text, typ)
7977
metrics[metric_name] = metric
8078

8179
if typ == 'gauge':

prometheus_client/values.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class MutexValue:
1010

1111
_multiprocess = False
1212

13-
def __init__(self, typ, metric_name, name, labelnames, labelvalues, **kwargs):
13+
def __init__(self, typ, metric_name, name, labelnames, labelvalues, help_text, **kwargs):
1414
self._value = 0.0
1515
self._exemplar = None
1616
self._lock = Lock()
@@ -57,8 +57,8 @@ class MmapedValue:
5757

5858
_multiprocess = True
5959

60-
def __init__(self, typ, metric_name, name, labelnames, labelvalues, multiprocess_mode='', **kwargs):
61-
self._params = typ, metric_name, name, labelnames, labelvalues, multiprocess_mode
60+
def __init__(self, typ, metric_name, name, labelnames, labelvalues, help_text, multiprocess_mode='', **kwargs):
61+
self._params = typ, metric_name, name, labelnames, labelvalues, help_text, multiprocess_mode
6262
# This deprecation warning can go away in a few releases when removing the compatibility
6363
if 'prometheus_multiproc_dir' in os.environ and 'PROMETHEUS_MULTIPROC_DIR' not in os.environ:
6464
os.environ['PROMETHEUS_MULTIPROC_DIR'] = os.environ['prometheus_multiproc_dir']
@@ -69,7 +69,7 @@ def __init__(self, typ, metric_name, name, labelnames, labelvalues, multiprocess
6969
values.append(self)
7070

7171
def __reset(self):
72-
typ, metric_name, name, labelnames, labelvalues, multiprocess_mode = self._params
72+
typ, metric_name, name, labelnames, labelvalues, help_text, multiprocess_mode = self._params
7373
if typ == 'gauge':
7474
file_prefix = typ + '_' + multiprocess_mode
7575
else:
@@ -81,7 +81,7 @@ def __reset(self):
8181

8282
files[file_prefix] = MmapedDict(filename)
8383
self._file = files[file_prefix]
84-
self._key = mmap_key(metric_name, name, labelnames, labelvalues)
84+
self._key = mmap_key(metric_name, name, labelnames, labelvalues, help_text)
8585
self._value = self._file.read_value(self._key)
8686

8787
def __check_for_pid_change(self):

tests/test_multiprocess.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,31 @@ def add_label(key, value):
281281

282282
self.assertEqual(metrics['h'].samples, expected_histogram)
283283

284+
def test_collect_preserves_help(self):
285+
pid = 0
286+
values.ValueClass = MultiProcessValue(lambda: pid)
287+
labels = {i: i for i in 'abcd'}
288+
289+
c = Counter('c', 'c help', labelnames=labels.keys(), registry=None)
290+
g = Gauge('g', 'g help', labelnames=labels.keys(), registry=None)
291+
h = Histogram('h', 'h help', labelnames=labels.keys(), registry=None)
292+
293+
c.labels(**labels).inc(1)
294+
g.labels(**labels).set(1)
295+
h.labels(**labels).observe(1)
296+
297+
pid = 1
298+
299+
c.labels(**labels).inc(1)
300+
g.labels(**labels).set(1)
301+
h.labels(**labels).observe(5)
302+
303+
metrics = {m.name: m for m in self.collector.collect()}
304+
305+
self.assertEqual(metrics['c'].documentation, 'c help')
306+
self.assertEqual(metrics['g'].documentation, 'g help')
307+
self.assertEqual(metrics['h'].documentation, 'h help')
308+
284309
def test_merge_no_accumulate(self):
285310
pid = 0
286311
values.ValueClass = MultiProcessValue(lambda: pid)

0 commit comments

Comments
 (0)
0