一、前言
性能场景中的业务模型建设是性能测试工作中十分重要的一部分。而在咱们实在的我的项目中,业务模型跟线上的业务模型不一样的状况切实是太多了。起因可能多种多样,这些起因大大降低了性能测试的价值。
明天的文章中,我想写的是最简略的逻辑。那就是从基于网关 access 日志统计分析转化到具体的场景中的通用业务模型。
具体的介绍请参考《性能测试实战 30 讲》中的【14 丨性能测试场景:如何了解业务模型?】
通用业务场景模型。就是将这一天的所有业务数加在一起,再将各业务终日的交易量加在一起,计算各业务量的比例。
二、前置工作
首先咱们从顶峰日取出一天的网关 access 日志,这里示例大略有 1400+ 万的记录
[root@k8s-worker-4 ~]# wc -l access.log
14106419 access.log
至于网关 access 日志如何配置,能够参看之前的文章 SpringCloud 日志在压测中的二三事
咱们失去的 access 日志内容个别如下:
/Feb/2021:13:52:14 +0800] “POST /mall-order/order/generateOrder HTTP/1.1” 500 133 8201 52 ms
对应的字段如下:
address, user, zonedDateTime, method, uri, protocol, status, contentLength, port, duration.
那么,咱们的需要来了,如何通过剖析 access 日志,获取每个接口网关解决工夫最大值、最小值、平均值及访问量。这里我扩大了获取每个接口网关解决工夫的统计分析,不便咱们对接口的性能评估。
三、编写 Python 脚本实现数据分析
咱们晓得在数据分析、机器学习畛域个别举荐应用到 Python,因为这是 Python 所善于的。而在 Python 数据分析工作中,Pandas 的应用频率是很高的,如果咱们日常的数据处理工作不是很简单的话,你通常用几句 Pandas 代码就能够对数据进行规整。
那么这里咱们只须要将日志中 duration 字段寄存到 pandas 的根底数据结构 DataFrame 中,而后通过分组、数据统计性能就能够实现。
整个工程一共包含 4 个局部:
第一个局部为数据加载,首先咱们通过 open 文件读数据加载到内存中。留神日志文件比拟大的状况下读取不要用 readlines()、readline(), 会将日志全副读到内存,导致内存占满。因而在此应用 for line in fo 迭代的形式,根本不占内存实现懒加载;
第二步为数据预处理。读取日志文件,能够应用 pd.read_table(log_file, sep=’‘, iterator=True), 然而此处咱们设置的 sep 无奈失常匹配宰割,因而先将日志用 split 宰割,而后再存入 pandas;
第三步为数据分析,Pandas 提供了 IO 工具能够将大文件分块读取,应用不同分块大小来读取再调用 pandas.concat 连贯 DataFrame,而后应用 Pandas 罕用的统计函数剖析;
最初一步为数据装载,把统计分析后果保留到 Excel 文件中。
下载依赖库:
#pip3 install 包名 -i 源的 url 长期换源
#清华大学源:https://pypi.tuna.tsinghua.ed…
# 弱小的数据结构库,用于数据分析,工夫序列和统计等
pip3 install pandas -i
https://pypi.tuna.tsinghua.ed…
# 解决 URL 的包
pip3 install urllib -i
https://pypi.tuna.tsinghua.ed…
# 装置生成 execl 表格的相干模块
pip3 install xlwt -i
https://pypi.tuna.tsinghua.edu.cn/simple/
具体的代码如下:
# 统计每个接口的解决工夫
#请提前创立 log 并设置 logdir
import sys
import os
import pandas as pd
from urllib.parse import urlparse
import re
”’
全局参数
”’
mulu=os.path.dirname(__file__)
#日志文件寄存门路
logdir=”D:\log”
#寄存统计所需的日志相干字段
logfile_format=os.path.join(mulu,”access.log”)
print (“read from logfile \n”)
”’
数据加载及预处理
”’
for eachfile in os.listdir(logdir):
logfile=os.path.join(logdir,eachfile)
with open(logfile, ‘r’) as fo:
for line in fo:
spline=line.split()
#过滤字段中异样局部
if spline[6]=="-":
pass
elif spline[6]=="GET":
pass
elif spline[-1]=="-":
pass
else:
# 解析成 url 地址
parsed = urlparse(spline[6])
# print(‘path :’, parsed.path)
#排除数值参数
interface = ''.join([i for i in parsed.path if not i.isdigit()])
# print(interface)
#从新写入文件
with open(logfile_format, 'a') as fw:
fw.write(interface)
fw.write('\t')
fw.write(spline[-2])
fw.write('\n')
print ("output panda")
'''数据分析'''
# 将统计的字段读入到 dataframe 中
reader=pd.read_table(logfile_format,sep=’\t’,engine=’python’,names=[“interface”,”duration(ms)”] ,header=None,iterator=True)
loop=True
chunksize=10000000
chunks=[]
while loop:
try:
chunk=reader.get_chunk(chunksize)
chunks.append(chunk)
except StopIteration:
loop=False
print ("Iteration is stopped.")
df=pd.concat(chunks)
#df=df.set_index(“interface”)
#df=df.drop([“GET”,”-“])
df_groupd=df.groupby(‘interface’)
df_groupd_max=df_groupd.max()
df_groupd_min= df_groupd.min()
df_groupd_mean= df_groupd.mean()
df_groupd_size= df_groupd.size()
”’
数据装载
”’
df_ana=pd.concat([df_groupd_max,df_groupd_min,df_groupd_mean,df_groupd_size],axis=1,keys=[“max”,”min”,”average”,”count”])
print (“output excel”)
df_ana.to_excel(“result.xls”)
运行后果:image.png
这样咱们轻松失去了顶峰日各业务量统计以及接口解决工夫等数据。
四、小结
通过明天的例子咱们应该能看到采纳 Python 对于性能工程师来说升高了数据分析的技术门槛。置信在当今的 DT 时代,任何岗位都须要用到数据分析的思维和能力。
本文源码:
https://github.com/zuozewei/b…
参考资料:
[1]:《性能测试实战 30 讲》