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/utils/metric_handler.py
import sys,os,time

sys.path.append(os.getcwd()+"/../comm/")
import cutils
from collect_vm_msg import CollectVmMesg

class MetricHandler(object):
    def __init__(self):
        self.metrics = []
        self.namespace = None
        self.dimensions = []
        self.VmBaseColl = CollectVmMesg()
        
    def add_metric(self, statistic = None, unit = None, **args):
        metric = { }
        metric['namespace'] = self.namespace
        metric['name'] = args['name']
        dms = {}
        if not args.has_key('dimensions'):
            dimensions = self.dimensions
        else:
            dimensions = args['dimensions']
            
        if isinstance(dimensions, list):
            dms = self.generate_dimension(dimensions)
        elif isinstance(dimensions, dict):
            dms = dimensions
        else:
            dms = {}
            
        if cutils.is_metal():
            dms['sn'] = self.VmBaseColl.get_sn()
            
        metric['dimension'] = dms
        if unit is not None:
            metric['unit'] = unit
        else:
            metric['unit'] = ''
        

 
        valid_flag = True

        if args.has_key('svalue'):
            metric['svalue'] = args['svalue']

        elif statistic is not None:
            metric['statistic'] = statistic
            for s in statistic:
                if statistic[s] is None:
                    valid_flag = False
                    break
        else:
            metric['value'] = args['value']
            if metric['value'] is None:
                valid_flag = False


        

        if not args.has_key('timestamp'):
            metric['timestamp'] = int(time.time())
        else:
            metric['timestamp'] = args['timestamp']

        ntp_time_offset = self.VmBaseColl.get_ntptime_offset()
        metric['timestamp'] -= ntp_time_offset

        if valid_flag:
            self.metrics.append(metric)

    def add_batch_metric(self, **args):
        metric = { }
        valid_flag = True

        metric['namespace'] = self.namespace
        if not args.has_key('dimensions'):
            dimensions = self.dimensions
        else:
            dimensions = args['dimensions']

        if isinstance(dimensions, list):
            dms = self.generate_dimension(dimensions)
        elif isinstance(dimensions, dict):
            dms = dimensions
        else:
            dms = {}

        if cutils.is_metal():
            dms['sn'] = self.VmBaseColl.get_sn()
        metric['dimension'] = dms
        if not args.has_key('timestamp'):
            metric['timestamp'] = int(time.time())
        else:
            metric['timestamp'] = args['timestamp']

        ntp_time_offset = self.VmBaseColl.get_ntptime_offset()
        metric['timestamp'] -= ntp_time_offset

        if args.has_key('batch') and args['batch']:
            if isinstance(args['batch'], list):
                metric['batch'] = args['batch']
            elif isinstance(args['batch'], dict):
                metric['batch'] = [args['batch']]
            else:
                valid_flag = False
        else:
            valid_flag = False

        """check batch metric fields"""
        if metric['namespace'] and metric['dimension'] and valid_flag:
            self.metrics.append(metric)

    def generate_dimension(self, dimension_list):
        dimensions =  { }
        for dimension_name in dimension_list:
            method_name = 'get_' + dimension_name
            if hasattr(VmBaseCollector, method_name):
                method = getattr(VmBaseCollector, method_name)
                dimensions[dimension_name] = method()
        return dimensions
    
    def get_metrics(self):
        return self.metrics
    
    def clean_metrics(self):
        self.metrics = []
    
    def pop_metrics(self):
        metrics = self.metrics
        self.metrics = []
        return metrics