分布式监控系统开发【day38】:监控数据如何画图(九)
一、画图代码
1、收集处理数据
class GraphGenerator(object): ''' generate graphs ''' def __init__(self,request,redis_obj): self.request = request self.host_id = self.request.GET.get('host_id') self.service_name = self.request.GET.get('service_key') self.index_key = self.request.GET.get('index_key') self.time_range = self.request.GET.get('time_range') self.sub_service_name = self.request.GET.get('sub_service_key') self.redis = redis_obj print("sub service key:", self.sub_service_name) def get_graph_data(self): #data_store_key = "StatusData_%s_%s_latest" %(self.host_id,self.service_name) data_store_key = "StatusData_%s_%s_%s" %(self.host_id,self.service_name,self.time_range) data_set = self.redis.lrange(data_store_key,0,-1) print("data store key:", data_store_key) print("data point nums:", len(data_set)) #print("data points:", data_set) service_obj = models.Service.objects.get(name=self.service_name) data_dic = {} #store graph data later for item in service_obj.items.select_related(): data_dic[item.key] = [] if data_set: #make sure data set not empty print("service data for graph:", data_dic) if self.sub_service_name == None or self.sub_service_name == 'undefined': for data_point in data_set: #data_point sample data:('-->', {u'status': 0, u'iowait': u'0.00', u'system': u'1.01', u'idle': u'96.98', u'user': u'2.01', u'steal': u'0.00', u'nice': u'0.00'}, 1461840915.038072) val,timestamp = json.loads(data_point) if val: for k,v in val.items(): if k in data_dic: '''if len(data_dic[k]) > 0: #不是第一次存值 last_point_save_time = data_dic[k][-1][0] #microseconds data_point_interval =settings.STATUS_DATA_OPTIMIZATION[self.time_range][0] if timestamp*1000 - last_point_save_time > data_point_interval: #这里出现中断了 data_dic[k].append([last_point_save_time + data_point_interval,0]) else:#没有中断过,什么都 不用做哈哈 pass ''' if type(v) is not list: data_dic[k].append([timestamp*1000,float(v)]) else: #v = [avg,max,min,mid] data_dic[k].append([timestamp*1000,float(v[0])]) #暂时只往前台 返回 average数据 else: #has sub service print("\033[44;1m------------subservice key: %s, %s\033[0m" %(self.sub_service_name,self.service_name)) for data_point in data_set: #data_point sample data:('-->', {u'status': 0, u'iowait': u'0.00', u'system': u'1.01', u'idle': u'96.98', u'user': u'2.01', u'steal': u'0.00', u'nice': u'0.00'}, 1461840915.038072) val,timestamp = json.loads(data_point) if val: if val.get('data'): for sub_service_key,v_dic in val['data'].items(): for k,v in v_dic.items(): if k in data_dic: if type(v) is not list: data_dic[k].append([timestamp*1000,float(v)]) else: #v = [avg,max,min,mid] data_dic[k].append([timestamp*1000,float(v[0])]) #暂时只往前台 返回 average数据 for k,v in data_dic.items(): print(k,v) return data_dic
2、生成流量图
from monitor import models import json from CrazyMonitor import settings class GraphGenerator2(object): ''' 产生流量图 ''' def __init__(self,request,redis_obj): self.request = request self.redis = redis_obj self.host_id = self.request.GET.get('host_id') self.time_range = self.request.GET.get('time_range') def get_host_graph(self): ''' 生成此主机关联的所有图 :return: ''' host_obj = models.Host.objects.get(id=self.host_id) service_data_dic = {} template_list = list(host_obj.templates.select_related()) for g in host_obj.host_groups.select_related(): template_list.extend(list(g.templates.select_related())) template_list = set(template_list) for template in template_list: for service in template.services.select_related(): service_data_dic[service.id] = { 'name':service.name, 'index_data':{}, 'has_sub_service': service.has_sub_service, 'raw_data':[], 'items': [item.key for item in service.items.select_related() ] } '''if not service.has_sub_service: for index in service.items.select_related(): service_data_dic[service.id]['index_data'][index.key] = { 'id': index.id, 'name':index.name, 'data':[] } #else: #like nic service ''' print(service_data_dic) #service_data_dic #开始取数据 for service_id,val_dic in service_data_dic.items(): #if val_dic['has_sub_service'] == False: service_redis_key = "StatusData_%s_%s_%s" %(self.host_id,val_dic['name'],self.time_range) print('service_redis_key',service_redis_key) service_raw_data = self.redis.lrange(service_redis_key,0,-1) service_raw_data = [item.decode() for item in service_raw_data] service_data_dic[service_id]['raw_data'] = service_raw_data return service_data_dic
3、画图展示
二、国外画图软件hcharts
1、官方网址
www.hcharts.cn
2、静态图讲解
3、动态图片讲解
动态看红框
4、API使用
1、数据格式
2、api文档
https://api.hcharts.cn/6/highcharts/index.html
截图
3、文档教程
https://www.hcharts.cn/docs
截图
三、国内百度echarts
1、官方网址
http://echarts.baidu.com/index.html
2、地图展示
3、3D图展示
4、文档
1、地址
http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts
2、截图
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。