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

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

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._labelnames, 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