测试数据的可视化-通用化

前言

如果测试数据是很大量的数据,并且是基于时间变化的,需要做成一个横轴为时间,纵轴为数值的可视化,这个有很多方法
比如用excel做成图表形式的
或者用powerbi或者其它软件做成波形图
但是找了几个软件都没有想要的效果,grafana那种又太重了,需要配置很多东西,所以这里自己实现了一个简单但是实用的数据分析网页

架构

首先是原始数据,这里需要对原始数据进行处理,把数据处理成时间,数值的csv文件格式的,数量可以很多也没关系
支持通过网页导入,因为测试可能是多轮的,或者多个数据的,所以为了方便,是支持网页直接倒入的
网页是通过命令行启动的,不需要第三方的web服务器,所有的东西都维护在一个目录内,我们看下我们的效果

使用过程

以ceph.log为例,我们拿到的是原始打包好的数据

1
2
3
4
5
6
[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

解压数据

1
2
3
4
5
6
7
[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

汇总数据

1
2
3
4
[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的有处理数据的方法

1
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万行,这个数据量还是比较大的

1
2
3
4
5
6
7
8
9
[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内部的

1
2
3
4
5
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload" />
<input type="submit" value="上传" />
<a href="./help.html">查看帮助</a>
</form>

server.py代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#! /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('/<filename>')
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文件就可以了比较简单