HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux WebLive 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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()