Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 17 additions & 19 deletions prometheus_client/process_collector.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@
from __future__ import unicode_literals

import os
import time
import threading

from . import core
try:
import resource
_PAGESIZE = resource.getpagesize()
import resource
_PAGESIZE = resource.getpagesize()
except ImportError:
# Not Unix
_PAGESIZE = 4096
# Not Unix
_PAGESIZE = 4096


class ProcessCollector(object):
Expand All @@ -38,7 +36,7 @@ def __init__(self, namespace='', pid=lambda: 'self', proc='/proc', registry=core
except IOError:
pass
if registry:
registry.register(self)
registry.register(self)

def _boot_time(self):
with open(os.path.join(self._proc, 'stat')) as stat:
Expand All @@ -50,27 +48,25 @@ def collect(self):
if not self._btime:
return []

try:
pid = os.path.join(self._proc, str(self._pid()).strip())
except:
# File likely didn't exist, fail silently.
raise
return []
pid = os.path.join(self._proc, str(self._pid()).strip())

result = []
try:
with open(os.path.join(pid, 'stat')) as stat:
parts = (stat.read().split(')')[-1].split())
vmem = core.GaugeMetricFamily(self._prefix + 'virtual_memory_bytes',
'Virtual memory size in bytes.', value=float(parts[20]))
rss = core.GaugeMetricFamily(self._prefix + 'resident_memory_bytes', 'Resident memory size in bytes.', value=float(parts[21]) * _PAGESIZE)
'Virtual memory size in bytes.', value=float(parts[20]))
rss = core.GaugeMetricFamily(self._prefix + 'resident_memory_bytes', 'Resident memory size in bytes.',
value=float(parts[21]) * _PAGESIZE)
start_time_secs = float(parts[19]) / self._ticks
start_time = core.GaugeMetricFamily(self._prefix + 'start_time_seconds',
'Start time of the process since unix epoch in seconds.', value=start_time_secs + self._btime)
'Start time of the process since unix epoch in seconds.',
value=start_time_secs + self._btime)
utime = float(parts[11]) / self._ticks
stime = float(parts[12]) / self._ticks
cpu = core.CounterMetricFamily(self._prefix + 'cpu_seconds_total',
'Total user and system CPU time spent in seconds.', value=utime + stime)
'Total user and system CPU time spent in seconds.',
value=utime + stime)
result.extend([vmem, rss, start_time, cpu])
except IOError:
pass
Expand All @@ -80,10 +76,12 @@ def collect(self):
for line in limits:
if line.startswith('Max open file'):
max_fds = core.GaugeMetricFamily(self._prefix + 'max_fds',
'Maximum number of open file descriptors.', value=float(line.split()[3]))
'Maximum number of open file descriptors.',
value=float(line.split()[3]))
break
open_fds = core.GaugeMetricFamily(self._prefix + 'open_fds',
'Number of open file descriptors.', len(os.listdir(os.path.join(pid, 'fd'))))
'Number of open file descriptors.',
len(os.listdir(os.path.join(pid, 'fd'))))
result.extend([open_fds, max_fds])
except IOError:
pass
Expand Down
2 changes: 1 addition & 1 deletion tests/test_process_collector.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
import os
import unittest


from prometheus_client import CollectorRegistry, ProcessCollector


class TestProcessCollector(unittest.TestCase):
def setUp(self):
self.registry = CollectorRegistry()
Expand Down