Skip to content

Commit ef30c5f

Browse files
committed
Merge pull request prometheus#22 from brian-brazil/pidfile
Add support to allow for using pids from pidfiles.
2 parents 0fffb49 + 746e6f1 commit ef30c5f

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ The Python Client automatically exports metrics about process CPU usage, RAM,
139139
file descriptors and start time. These all have the prefix `process_`, and
140140
are only currently available on Linux.
141141

142+
The namespace and pid constructor arguments allows for exporting metrics about
143+
other processes, for example:
144+
```
145+
ProcessCollector(namespace='mydaemon', pid=lambda: open('/var/run/daemon.pid').read())
146+
```
147+
142148
## Exporting
143149

144150
There are several options for exporting metrics.

prometheus_client/__init__.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -452,9 +452,9 @@ def write_to_textfile(path, registry):
452452

453453
class ProcessCollector(object):
454454
"""Collector for Standard Exports such as cpu and memory."""
455-
def __init__(self, namespace='', pid='self', proc='/proc', registry=REGISTRY):
455+
def __init__(self, namespace='', pid=lambda: 'self', proc='/proc', registry=REGISTRY):
456456
self._namespace = namespace
457-
self._pid = os.path.join(proc, str(pid))
457+
self._pid = pid
458458
self._proc = proc
459459
self._pagesize = resource.getpagesize()
460460
if namespace:
@@ -486,9 +486,16 @@ def collect(self):
486486
if not self._btime:
487487
return []
488488

489+
try:
490+
pid = os.path.join(self._proc, str(self._pid()).strip())
491+
except:
492+
# File likely didn't exist, fail silently.
493+
raise
494+
return []
495+
489496
result = []
490497
try:
491-
with open(os.path.join(self._pid, 'stat')) as stat:
498+
with open(os.path.join(pid, 'stat')) as stat:
492499
parts = (stat.read().split(')')[-1].split())
493500
vmem = Metric(self._prefix + 'virtual_memory_bytes', 'Virtual memory size in bytes', 'gauge')
494501
vmem.add_sample(self._prefix + 'virtual_memory_bytes', {}, float(parts[20]))
@@ -509,13 +516,13 @@ def collect(self):
509516

510517
try:
511518
max_fds = Metric(self._prefix + 'max_fds', 'Maximum number of open file descriptors.', 'gauge')
512-
with open(os.path.join(self._pid, 'limits')) as limits:
519+
with open(os.path.join(pid, 'limits')) as limits:
513520
for line in limits:
514521
if line.startswith('Max open file'):
515522
max_fds.add_sample(self._prefix + 'max_fds', {}, float(line.split()[3]))
516523
break
517524
open_fds = Metric(self._prefix + 'open_fds', 'Number of open file descriptors.', 'gauge')
518-
open_fds.add_sample(self._prefix + 'open_fds', {}, len(os.listdir(os.path.join(self._pid, 'fd'))))
525+
open_fds.add_sample(self._prefix + 'open_fds', {}, len(os.listdir(os.path.join(pid, 'fd'))))
519526
result.extend([open_fds, max_fds])
520527
except IOError:
521528
pass

tests/test_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ def setUp(self):
286286
self.test_proc = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'proc')
287287

288288
def test_working(self):
289-
collector = ProcessCollector(proc=self.test_proc, pid=26231, registry=self.registry)
289+
collector = ProcessCollector(proc=self.test_proc, pid=lambda: 26231, registry=self.registry)
290290
collector._pagesize = 4096
291291
collector._ticks = 100
292292

@@ -299,7 +299,7 @@ def test_working(self):
299299
self.assertEqual(None, self.registry.get_sample_value('process_fake_namespace'))
300300

301301
def test_namespace(self):
302-
collector = ProcessCollector(proc=self.test_proc, pid=26231, registry=self.registry, namespace='n')
302+
collector = ProcessCollector(proc=self.test_proc, pid=lambda: 26231, registry=self.registry, namespace='n')
303303
collector._pagesize = 4096
304304
collector._ticks = 100
305305

@@ -312,7 +312,7 @@ def test_namespace(self):
312312
self.assertEqual(None, self.registry.get_sample_value('process_cpu_seconds_total'))
313313

314314
def test_working_584(self):
315-
collector = ProcessCollector(proc=self.test_proc, pid=584, registry=self.registry)
315+
collector = ProcessCollector(proc=self.test_proc, pid=lambda: "584\n", registry=self.registry)
316316
collector._pagesize = 4096
317317
collector._ticks = 100
318318

@@ -324,7 +324,7 @@ def test_working_584(self):
324324
self.assertEqual(None, self.registry.get_sample_value('process_open_fds'))
325325

326326
def test_working_fake_pid(self):
327-
collector = ProcessCollector(proc=self.test_proc, pid=123, registry=self.registry)
327+
collector = ProcessCollector(proc=self.test_proc, pid=lambda: 123, registry=self.registry)
328328
collector._pagesize = 4096
329329
collector._ticks = 100
330330

0 commit comments

Comments
 (0)