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