测试数据的可视化-通用化
前言
如果测试数据是很大量的数据,并且是基于时间变化的,需要做成一个横轴为时间,纵轴为数值的可视化,这个有很多方法
比如用excel做成图表形式的
或者用powerbi或者其它软件做成波形图
但是找了几个软件都没有想要的效果,grafana那种又太重了,需要配置很多东西,所以这里自己实现了一个简单但是实用的数据分析网页
架构
首先是原始数据,这里需要对原始数据进行处理,把数据处理成时间,数值的csv文件格式的,数量可以很多也没关系
支持通过网页导入,因为测试可能是多轮的,或者多个数据的,所以为了方便,是支持网页直接倒入的
网页是通过命令行启动的,不需要第三方的web服务器,所有的东西都维护在一个目录内,我们看下我们的效果
使用过程
以ceph.log为例,我们拿到的是原始打包好的数据
[root@lab101 data]# ll
总用量 27228
-rw------- 1 root root 1230784 1月 18 18:28 ceph.log-20210115.gz
-rw------- 1 root root 1253789 1月 18 18:28 ceph.log-20210116.gz
-rw------- 1 root root 6857295 1月 18 18:28 ceph.log-20210117.gz
-rw------- 1 root root 7443114 1月 18 18:28 ceph.log-20210118.gz
解压数据
[root@lab101 data]# gunzip -d *.gz
[root@lab101 data]# ll
总用量 270016
-rw------- 1 root root 12583407 1月 18 18:28 ceph.log-20210115
-rw------- 1 root root 12672226 1月 18 18:28 ceph.log-20210116
-rw------- 1 root root 58620471 1月 18 18:28 ceph.log-20210117
-rw------- 1 root root 68756398 1月 18 18:28 ceph.log-20210118
汇总数据
[root@lab101 data]# cat ceph.log-20210115 > ceph.log
[root@lab101 data]# cat ceph.log-20210116 >> ceph.log
[root@lab101 data]# cat ceph.log-20210117 >> ceph.log
[root@lab101 data]# cat ceph.log-20210118 >> ceph.log
处理数据
我们之前的文章有篇awk的有处理数据的方法
cat ceph.log |awk '{for(i=1;i<=NF;i++){if($i~/op\/s/){$3=$i;print $1,$2,$3}}}'|awk '{gsub("op/s","",$3); print $1,$2,$3}'|awk '{if($3~/k/) {gsub("k","",$3); print $1,$2","$3*1000} else {print $1,$2","$3}}' > ceph.log.ops
转换成平台可读文件
转换的时候根据数据的长度决定的,我取了四天的数据大概有17万行,这个数据量还是比较大的
[root@lab101 datadisplay]# cat chuli.sh
cat ceph.log.ops | while read line
do
mytime=`echo $line|cut -d , -f 1`
value=`echo $line|cut -d , -f 2`
newtime=$[$(date -d "$mytime" +%s%N)/1000000]
echo $newtime,$value >> ceph.log.ops-chulihou
done
然后通过web上传上面的ceph.log.ops-chulihou文件即可
效果如下
上传部分的代码
index.html内部的
server.py代码
#! /bin/python
# -*- coding: UTF-8 -*-
# @Time :2020-01-18 18:03
# @Author: zphj1987
import os
from bottle import route, request, static_file, run,template
@route('/')
def root():
return static_file('index.html', root='.')
@route('/')
def server_static(filename):
return static_file(filename, root='.')
@route('/upload', method='POST')
def do_upload():
try:
upload = request.files.get('upload')
name, ext = os.path.splitext(upload.filename)
#if ext not in ('.csv', '.jpg', '.jpeg'):
# return "File extension not allowed."
file_path = "./data.csv"
os.remove("./data.csv")
upload.save(file_path)
except:
pass
#return "File successfully saved to '{0}'.".format(file_path)
return static_file('index.html', root='.')
if __name__ == '__main__':
run(host='0.0.0.0', port=8080)
这部分通过bottle进行实现的,只用目录里面放一个py文件就可以了比较简单