From 67a631a4fbb7b9925719bbad41ae0064fb234710 Mon Sep 17 00:00:00 2001 From: morskoyzmey Date: Thu, 29 Aug 2013 22:06:09 +0600 Subject: [PATCH 1/5] Add CPU percent and threads number metrics --- checks.d/process.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/checks.d/process.py b/checks.d/process.py index 184761f370..b35a987f5a 100644 --- a/checks.d/process.py +++ b/checks.d/process.py @@ -44,20 +44,25 @@ def find_pids(self, search_string, psutil, exact_match=True): def get_process_memory_size(self, pids, psutil, extended_metrics=False): rss = 0 vms = 0 + cpu = 0 + thr = 0 if extended_metrics: real = 0 else: real = None for pid in set(pids): try: + p = psutil.Process(pid) if extended_metrics: - mem = psutil.Process(pid).get_ext_memory_info() + mem = p.get_ext_memory_info() real += mem.rss - mem.shared else: - mem = psutil.Process(pid).get_memory_info() + mem = p.get_memory_info() rss += mem.rss vms += mem.vms + thr += p.get_num_threads() + cpu += p.get_cpu_percent() # Skip processes dead in the meantime except psutil.NoSuchProcess: @@ -65,7 +70,7 @@ def get_process_memory_size(self, pids, psutil, extended_metrics=False): pass #Return value in Byte - return (rss, vms, real) + return (thr, cpu, rss, vms, real) def psutil_older_than_0_6_0(self, psutil): return psutil.version_info[1] >= 6 @@ -89,9 +94,11 @@ def check(self, instance): pids = self.find_pids(search_string, psutil, exact_match=exact_match) self.gauge('system.processes.number', len(pids), tags=[name]) - rss, vms, real = self.get_process_memory_size(pids, psutil, + thr, cpu, rss, vms, real = self.get_process_memory_size(pids, psutil, extended_metrics=self.psutil_older_than_0_6_0(psutil)) self.gauge('system.processes.mem.rss', rss, tags=[name]) self.gauge('system.processes.mem.vms', vms, tags=[name]) + self.gauge('system.processes.cpu.pct', cpu, tags=[name]) + self.gauge('system.processes.threads', thr, tags=[name]) if real is not None: self.gauge('system.processes.mem.real', real, tags=[name]) From 9cc3da775ea05dd54cf80e78527a7ec7bacc6ad1 Mon Sep 17 00:00:00 2001 From: morskoyzmey Date: Thu, 29 Aug 2013 22:38:49 +0600 Subject: [PATCH 2/5] More precise cpu persentage --- checks.d/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checks.d/process.py b/checks.d/process.py index b35a987f5a..50ac40a954 100644 --- a/checks.d/process.py +++ b/checks.d/process.py @@ -62,7 +62,7 @@ def get_process_memory_size(self, pids, psutil, extended_metrics=False): rss += mem.rss vms += mem.vms thr += p.get_num_threads() - cpu += p.get_cpu_percent() + cpu += p.get_cpu_percent(0.4) # Skip processes dead in the meantime except psutil.NoSuchProcess: From f7a6942090b35e62c3a23e7d73448b7f7e916284 Mon Sep 17 00:00:00 2001 From: morskoyzmey Date: Thu, 29 Aug 2013 22:51:38 +0600 Subject: [PATCH 3/5] x2 more precise cpu persentage --- checks.d/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checks.d/process.py b/checks.d/process.py index 50ac40a954..9a8a7574d8 100644 --- a/checks.d/process.py +++ b/checks.d/process.py @@ -62,7 +62,7 @@ def get_process_memory_size(self, pids, psutil, extended_metrics=False): rss += mem.rss vms += mem.vms thr += p.get_num_threads() - cpu += p.get_cpu_percent(0.4) + cpu += p.get_cpu_percent(0.8) #not sure about this value # Skip processes dead in the meantime except psutil.NoSuchProcess: From 2da860d200196e4f45171d6805804f0874803aca Mon Sep 17 00:00:00 2001 From: morskoyzmey Date: Thu, 29 Aug 2013 23:48:45 +0600 Subject: [PATCH 4/5] Configurable CPU check interval --- checks.d/process.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/checks.d/process.py b/checks.d/process.py index 9a8a7574d8..799317cf94 100644 --- a/checks.d/process.py +++ b/checks.d/process.py @@ -6,7 +6,7 @@ class ProcessCheck(AgentCheck): def find_pids(self, search_string, psutil, exact_match=True): """ Create a set of pids of selected processes. - Search for search_string + Search for search_string """ found_process_list = [] for proc in psutil.process_iter(): @@ -35,13 +35,13 @@ def find_pids(self, search_string, psutil, exact_match=True): self.log.error('Access denied to %s process' % string) self.log.error('Error: %s' % e) raise - + if found or string == 'All': found_process_list.append(proc.pid) - + return set(found_process_list) - - def get_process_memory_size(self, pids, psutil, extended_metrics=False): + + def get_process_memory_size(self, pids, psutil, cpu_check_interval, extended_metrics=False): rss = 0 vms = 0 cpu = 0 @@ -62,8 +62,8 @@ def get_process_memory_size(self, pids, psutil, extended_metrics=False): rss += mem.rss vms += mem.vms thr += p.get_num_threads() - cpu += p.get_cpu_percent(0.8) #not sure about this value - + cpu += p.get_cpu_percent(cpu_check_interval) + # Skip processes dead in the meantime except psutil.NoSuchProcess: self.warning('Process %s disappeared while scanning' % pid) @@ -74,7 +74,7 @@ def get_process_memory_size(self, pids, psutil, extended_metrics=False): def psutil_older_than_0_6_0(self, psutil): return psutil.version_info[1] >= 6 - + def check(self, instance): try: import psutil @@ -84,17 +84,19 @@ def check(self, instance): name = instance.get('name', None) exact_match = instance.get('exact_match', True) search_string = instance.get('search_string', None) + cpu_check_interval = instance.get('cpu_check_interval',0.1) if name is None: raise KeyError('The "name" of process groups is mandatory') if search_string is None: raise KeyError('The "search_string" is mandatory') - + pids = self.find_pids(search_string, psutil, exact_match=exact_match) + self.log.debug('ProcessCheck: process %s analysed' % name) self.gauge('system.processes.number', len(pids), tags=[name]) - thr, cpu, rss, vms, real = self.get_process_memory_size(pids, psutil, + thr, cpu, rss, vms, real = self.get_process_memory_size(pids, psutil, cpu_check_interval, extended_metrics=self.psutil_older_than_0_6_0(psutil)) self.gauge('system.processes.mem.rss', rss, tags=[name]) self.gauge('system.processes.mem.vms', vms, tags=[name]) From f9d8806b2cfc87be196afb62b757180942bb8a11 Mon Sep 17 00:00:00 2001 From: morskoyzmey Date: Thu, 29 Aug 2013 23:51:40 +0600 Subject: [PATCH 5/5] Add cpu_check_interval for CPU percent usage --- conf.d/process.yaml.example | 1 + 1 file changed, 1 insertion(+) diff --git a/conf.d/process.yaml.example b/conf.d/process.yaml.example index 79aa8cd359..645f5dbba5 100644 --- a/conf.d/process.yaml.example +++ b/conf.d/process.yaml.example @@ -6,6 +6,7 @@ instances: # return the counter of all the processes that contain the string # exact_match: (optional) True/False, default to False, if you want to look for an arbitrary # string, use exact_match: False, unless use the exact base name of the process +# cpu_check_interval: (optional) CPU percent check interval: 0.1 - 1.0 sec. More time - more precise # # Examples: #