Skip to content

Commit ac9ef69

Browse files
umaxbrian-brazil
authored andcommitted
Prevent double reading all values when collect multiprocess metrics (prometheus#262)
1 parent cce9af5 commit ac9ef69

File tree

2 files changed

+5
-4
lines changed

2 files changed

+5
-4
lines changed

prometheus_client/core.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ class _MmapedDict(object):
345345
346346
Not thread safe.
347347
"""
348-
def __init__(self, filename):
348+
def __init__(self, filename, read_mode=False):
349349
self._f = open(filename, 'a+b')
350350
if os.fstat(self._f.fileno()).st_size == 0:
351351
self._f.truncate(_INITIAL_MMAP_SIZE)
@@ -358,8 +358,9 @@ def __init__(self, filename):
358358
self._used = 8
359359
struct.pack_into(b'i', self._m, 0, self._used)
360360
else:
361-
for key, _, pos in self._read_all_values():
362-
self._positions[key] = pos
361+
if not read_mode:
362+
for key, _, pos in self._read_all_values():
363+
self._positions[key] = pos
363364

364365
def _init_value(self, key):
365366
"""Initialize a value. Lock must be held by caller."""

prometheus_client/multiprocess.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def collect(self):
2727
for f in glob.glob(os.path.join(self._path, '*.db')):
2828
parts = os.path.basename(f).split('_')
2929
typ = parts[0]
30-
d = core._MmapedDict(f)
30+
d = core._MmapedDict(f, read_mode=True)
3131
for key, value in d.read_all_values():
3232
metric_name, name, labelnames, labelvalues = json.loads(key)
3333

0 commit comments

Comments
 (0)