File: //usr/local/qcloud/monitor/barad/plugin/collector/vm/process.py
import sys
import os,time
sys.path.append(os.getcwd() + '/../../../comm/')
import constant
from plugin_base import VmBaseCollector
from utils.collect_tool import ProcessCollect
from utils.metric_handler import MetricHandler
from cutils import CommUtils, generate_config
PROC_CONF = '../../config/proc_conf.ini'
PROC_NUMBER_CONF = '../etc/plugin.ini'
class ProcessCollector(VmBaseCollector):
def init(self):
self.set_frequency(60)
self.collector = ProcessCollect()
self.handler = MetricHandler()
self.handler.namespace = 'qce/cvm'
self.handler.dimensions = [ 'vm_uuid', 'vmip']
def do_collect(self):
vm_uuid = self.get_vm_uuid()
vmip = self.get_vmip()
vm_instance_id = self.get_vm_instance_id()
app_id = self.get_vm_app_id()
(proc_num, zombie_num, running_num) = self.collector.get_proc_num()
batch_metric = [
{'name':'process_num', 'value':proc_num, 'unit':'count'},
{'name':'zombie_num', 'value':zombie_num, 'unit':'count'},
{'name':'activeproc_num', 'value':running_num, 'unit':'count'}
]
# get max process pid
max_proc_num = self.collector.get_max_proc_pid()
metric = {'name':'maxproc_num', 'value':max_proc_num, 'unit':'count'}
batch_metric.append(metric)
dimensions = {'vm_uuid': vm_uuid, 'vmip': vmip}
self.handler.add_batch_metric(batch = batch_metric,dimensions = dimensions)
#get process name list from config file
item_dict = generate_config(PROC_CONF, 'process')
top_process_num = 0
try:
top_process_num = (int)(generate_config(PROC_NUMBER_CONF, 'procConf')['top_process_number'])
except Exception,e:
import traceback
print(traceback.format_exc().replace('\n','\\n'))
#get top process num config from file's existance:/etc/barad.d/barad.conf
conf_file_path = "/etc/barad.d/barad.conf"
if os.path.exists(conf_file_path):
top_process_num = 5
set_top_process_pid = set()
if (top_process_num == 5) or (top_process_num == 10):
set_top_process_pid = self.get_top_number_process_pid(top_process_num)
if item_dict.has_key('proclist') and item_dict['proclist'] is not None:
proc_list = item_dict['proclist'].split(',')
for proc_name in proc_list:
proc_name = proc_name.strip()
if not proc_name:
continue
cmd = "pgrep -f %s" % (proc_name)
result = CommUtils.ExecuteTimeoutCommand(cmd, 3)
try:
for item in result.splitlines():
proc_pid = (int)(item.split()[0])
set_top_process_pid.add(proc_pid)
except Exception,e:
import traceback
print(traceback.format_exc().replace('\n','\\n'))
if len(set_top_process_pid) > 0:
process_info_dict = self.collector.get_proc_info_by_pid(set_top_process_pid)
for item in process_info_dict.keys():
#proc_info_list:[name, pid, username, cmdline, cpu_percent, num_fds, memory_info, status, running time]
proc_info_list = process_info_dict[item]
dimensions = {'vm_uuid': vm_uuid, 'vmip': vmip, 'instanceId': vm_instance_id,'appId': app_id,'procName': proc_info_list[0], 'procPid': proc_info_list[1], 'procUser': proc_info_list[2], 'procCmd': proc_info_list[3]}
batch_metric = [
{'name':'proc_cpuRate', 'value':proc_info_list[4]},
{'name':'proc_mem', 'value':proc_info_list[6], 'unit':'mib'},
{'name':'proc_time', 'value':proc_info_list[8], 'unit':'second'},
{'name':'proc_handle', 'value':proc_info_list[5], 'unit':'count'},
{'name':'proc_status', 'value':proc_info_list[7]}
]
self.handler.add_batch_metric(dimensions = dimensions, batch = batch_metric)
if (len(self.handler.get_metrics()) > 0) :
data = {'sender':'nws_sender', 'datas': self.handler.pop_metrics()}
self.put_data(data)
def get_top_number_process_pid(self, top_process_number = 5):
set_top_process_pid = set()
cmd = "ps aux | sort -k3nr |head -n %s" % (top_process_number)
result = CommUtils.ExecuteTimeoutCommand(cmd, 3)
for line in result.splitlines():
try:
list_line_item = line.split()
set_top_process_pid.add((int)(list_line_item[1]))
except Exception,e:
import traceback
print(traceback.format_exc().replace('\n','\\n'))
return set_top_process_pid
def main():
collector = ProcessCollector()
collector.init()
collector.collect()
collector.dump_data()
if __name__ == '__main__':
main()