使用Echarts来实现数据可视化
自动化运维中,脚本化,工具化,平台化的过程中,有一个环节不可缺少,那就是可视化。
可视化这方面的开源产品还是相当的多,总体的方向都是借助于丰富的前端方案来联动,如今很大的特点是不光让数据显示出来,还让数据动起来。
Echarts这个方案从我接触到做出一个还算不错的图,也就不过几个小时的时间,其中至少60%的时间是花在数据的提取和嵌套环节。
Echarts的口碑很不错,听到一个中肯但是有比较损的话:Echarts是百度推出的最有良心的产品。总之Echarts的可视化效果做得很不错,能让数据可视化很快接入,立马高大上起来。
如果看Echarts的官网会发现现在是区分了2个版本,新的版本是2.0的,有了较大的变化。效果做了更多的处理。
假设每天存在着大量的备份任务,每天备份了多少,产生了多大备份集,备份花了多少时间,在这个基础上我又提了一个并行备份的概念,比如40个数据库从1:00开始备份,不管中间是如何调度的,如果是在5:00结束,那么就算并行备份时间是4个小时,而如果串行来算,可能备份的时间有10个小时,类似这样的道理。
如果有了这些数据和参考,那么我们做优化的时候方向就会更加明确。是接入更多的业务,减少备份的存储容量,还是降低并行备份的时长。有了数据,有了概览,这些都会了然于胸。
如何显示呢,我们在html中需要一个div来衬托。比如下面的div,我们可以根据id来在JS中绑定Echarts的代码。
<div class="panel-body">
<div id="morris-area-chart" style="width:100%;height:400px"></div>
</div>
如何和div关联起来,我们通过JS里面的document对象来定位。然后使用echarts的对象在这个基础上初始化,我们可以伪造一些数据。
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('morris-area-chart'));
//alert(myChart)
var xAxisData = ['18-01-10','18-01-11','18-01-12','18-01-13','18-01-14','18-01-15','18-01-16'];
var data1 = [4030, 4020, 3600, 3750, 3900, 3740, 3760];
var data2 = [795,804,648,658,656,661,665];
option = {
title: {
text: '近期备份数据量统计'
},
legend: {
data: ['日备份容量', '备份集个数'],
align: 'left'
},
toolbox: {
// y: 'bottom',
feature: {
magicType: {
type: ['stack', 'tiled']
},
dataView: {},
saveAsImage: {
pixelRatio: 2
}
}
},
tooltip: {},
xAxis: {
data: xAxisData,
silent: false,
splitLine: {
show: false
}
},
yAxis: {
},
series: [{
name: '日备份容量',
type: 'bar',
data: data1,
animationDelay: function (idx) {
return idx * 10;
}
}, {
name: '备份集个数',
type: 'bar',
data: data2,
animationDelay: function (idx) {
return idx * 10 + 100;
}
}],
animationEasing: 'elasticOut',
animationDelayUpdate: function (idx) {
return idx * 5;
}
};
myChart.setOption(option);
</scripts>
整体来看这个过程还好啊,也没多少代码,那是因为Echarts都帮我们做好了。我们来看看后端和前端是如何衔接的,也是做Echarts出图的难点吧。
从后端来说,我们通过Django API或者raw SQL来得到数据结果。
如果通过raw SQL方式来定制,则类似下面的步骤。
cursor.execute(" xxxxxx")
backup_size_all = dictfetchall(cursor)
cursor.close()
其中cursor处理的结果默认是truple的,我们需要转换为字典,处理起来会更加方便,所以用了dictfecthall的方法。
def dictfetchall(cursor):
desc = cursor.description
return [
dict(zip([col[0] for col in desc], row))
for row in cursor.fetchall()
]
然后让response对象来返回到页面即可。
前端怎么去处理这个数据呢。这里面有个难点就是对于数据的方式。
比如查询结果有两列,比如为backup_date,backup_size,简单模拟一些数据。
backup_date backup_size
18-01-15 200
18-01-16 300
18-01-17 350
查询出来的结果转换成字典之后,就是类似这样的形式:
(backup_date:18-01-15,backup_size:200),(backup_date:18-01-16,backup_size:300),(backup_date:18-01-17,backup_size:350)
如果在前端初始化的时候,结果就类似:
18-01-15,200,18-01-16,300,18-01-17,350这样的方式,简单来说就是数据是在一起的,在一个循环中统一处理的。怎么区别开来呢,在这个场景中,我们可以按照2位基数做奇偶校验。
但是问题来了,前端的标签不支持看起来简单的逻辑校验和检查。怎么在前端做奇偶校验呢。
有一个特殊的标签,forloop.counter|divisibleby:2,明白了这点之后,我们就可以选择性的初始化,按照我们的预期来把数据放到不同的地方。所以Echarts中需要的几个数组都可以通过这种方式来初始化。
var xAxisData=[
{% for ds in backup_pieces_all %}
{% for k,v in ds.items %}
{% if forloop.counter|divisibleby:2 == 1 %}
'{{ v }}',
{% endif %}
{% endfor %}
{% endfor %}
];
所以对于其他的数组也是如法炮制。很快就能够搞定了。
看到原来冷冰冰的数据在这种分析中有了新的含义,心里面是亮堂的。
- python 对矩阵进行复制操作 np.repeat 与 np.tile区别
- python标准异常:中英文对比
- 激活windows10转到电脑设置的水印消失3种方法总结
- Android 运行时权限及APP适配
- python如何保存矩阵,保存matrix,保存numpy.ndarray
- SDP(12): MongoDB-Engine - Streaming
- .NET Core开源API网关 – Ocelot中文文档
- Selenium的使用方法简介
- 爬虫代理哪家强?十大付费代理详细对比评测出炉!
- HTML5中类jQuery选择器querySelector的使用
- Ceph 集群整体迁移方案
- CSS3矩阵变换
- 可直接运行
- Ryu:网络时延探测应用
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- Linux seq命令的使用详解
- Linux运维工具Supervisor的安装使用(进程管理工具)
- Linux whatis命令的使用方法
- Linux tr命令的使用方法
- Linux man命令的具体使用
- Linux locate命令的使用方法
- 解决linux系统中运行node进程却无法杀死进程的问题
- 5分钟搭建一个WebRTC视频聊天
- redis妙用-应用场景
- 详解Linux中几个获取硬件详细信息的命令
- Linux系统用户管理命令小结
- Linux用if判断目录是否存在实例方法
- CentOS 8.1下搭建LEMP(Linux+Nginx+MySQL+PHP)环境(教程详解)
- Linux echo文本处理命令的使用及示例
- redis妙用-string类型