目录
三、jmeter的可视化—— +influxdb+grafana
2、jmeter通过Backend Listener连接influxdb
官网: Apache JMeter - Download Apache JMeter
一、jmeter实际模拟一个http请求
以后就可以用jmeter来压测接口了,而且是从前端http接口层面的压测。
1、背景
背景很简单就是想用jmeter模拟一个实际业务中用到的http请求,对应功能点如下。
其对应的接口,请求时候所带的cookie、参数、payload等都可以通过开发者工具中看到。
注:网上请求百度的case很多了,没什么可说的。我们贴合实际业务场景,直接去请求saas软件的一个实际业务接口。这种情况需要考虑登录态(cookie)等问题也更贴合实际,为此有必要专门演示一把。
2、具体步骤
打开浏览器调试工具,打开jmeter。
(1)利用jmeter的 import from cURL进行导入。
①调试工具中选中目标接口→右键→copy→copy as cURL
注:其copy下来的其实是如下一串结果。按理来说应该是包括所有的必要信息了才是。
curl 'https://testgateway.qidian.qq.com/v1/interface/inner/cloudcc_303213' \
-H 'authority: testgateway.qidian.qq.com' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'content-type: application/json' \
-H 'cookie: login_url=https%3A%2F%2Foaconsole.qidian.qq.com%2Flogin%2F%3Fshow_type%3Dqa%26source%3Dworkbench; d2=Tcxl6Jtcmi8MwUIZvsayrx7yxmoeO0z6CGTBYhD59zvH1JjuFqQBzAzSLoG50Z0W93RXa1giPvYP14sswnxOMGCYLgR0SygSguzlcjr14zu8pEnRkRQ3D3Cna19tOi0ooGy0RZeBvn3mrBjaKGFewVadcAnb2xu6lx18ZBN8Z4YM0l8XeBecL+E1W2NOnNQud44gYmp6nLzJg/nQbq0WGoAZ31YcIF4zkS3XFQ+Ip3OhDsTSJvT78g==; corp_uin=2852199388; aid=3007442117; aid_skey=belsR+0zPsl3noSHqgbQUEcY2xngQtQ+yrunvtMpyDtEhJnCOJ3oVymCaaWPnUvZsJpG42neuoazR48ylhQFwPrerrlH2OoL19oEADpcGL6xGGVXQj1XUvnjlNyjWbovPHqfPXzY+De61sTHYYJTvdl3jVoo2FmIkUc6zriSQ3Q=; login_type=workbench; source=workbench; logout_type=workbench; qd_admin_is_web=yes; qd_aid_encode=bfbf632e80afd3bb63602fe46a812976; qdui_loginaccount=fy@2852199388.qidian; _qddaz=QD.801755194539948; __qidianid=e90872176fae3c53cec8df003802269745d3f01d; XSRF-TOKEN=31215d2f6c088e58e22172ff18efa52a09516396; _bqqcsrf=31215d2f6c088e58e22172ff18efa52a09516396; _bqq_csrf=31215d2f6c088e58e22172ff18efa52a09516396' \
-H 'origin: https://oaadmin.qidian.qq.com' \
-H 'referer: https://oaadmin.qidian.qq.com/' \
-H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-site' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36' \
-H 'x-gseq: 1655199907746' \
-H 'x-requested-with: XMLHttpRequest' \
-H 'x-xsrf-token: 31215d2f6c088e58e22172ff18efa52a09516396' \
--data-raw '{"label_data":{"rpt_label_item":[],"bool_is_solved":false,"str_summary":"shuozhuosummery"},"session_head":{"uint32_channel_type":4,"uint64_kfuin":2852199388,"uint64_kfextuin":3007442117,"str_visitid":"894554834464981"},"_bqq_csrf":"31215d2f6c088e58e22172ff18efa52a09516396","_t":"1655199907746"}' \
--compressed
②利用jmeter的导入工具直接导入cURL
将前面复制的结果直接粘贴到方框中→Create Test Plan
注:这个导入后其实就把大部分信息都导入进去了。例如header里面的大部分信息、协议/域名ip、http请求方式、路径等;另外payload参数其实也被导入进去了。如下:
③添加cookie
浏览器中右键copy as value复制cookie至剪切板→ jmeter中 选中HTTP HeaderManager → 点击右侧下方的“从剪贴板添加”→之后就可以在上面的<名称,值>中看到对应的添加项了。
注:之所以有这个问题是因为下图中确实没有cookie,按理来说上面复制的cURL是包括cookie信息的,但是这里确实没有被解析出来,所以我们需要额外添加一把。 感觉应该是jmeter有bug。
值得注意的是:默认的解析可能是有问题的。例如我这里就被解析成如下形式了。注:再一次感觉jmeter有bug。
其实很简单就是开发者工具里面看到的<key,value>保持一致就好了。
④执行
点击如下run按钮→按照提示保存对应的.jmx文件。
⑤查看具体请求的结果
然后我们就可以在结果树(View Result Tree)中看到执行结果了。如下选中一个具体的请求,然后就可以查看取样器结果、请求、相应数据。
注:如下图所示的相应数据其实就是后台业务服务返回的信息了。至此说明访问完全是通的了。
⑥查看统计报告/聚合报告
如下添加对应的汇总报告、聚合报告即可。
相关知识点:
jmeter添加cookie:这里
jmeter配置payload参数:这里
注意点:
(1)点击执行后jmeter默认是挨个执行每个线程组,不需要执行的就右键"禁止"比较好。
二、jmeter发送wss(websocket)请求
因为jmeter不支持socket请求,所以如果需要这么用的话就要安装几个插件。网上搜一下也有很多教程,这个也没什么可说的。例如 这里
如果什么都不做的话是打不开含有websocket的测试计划文件的(.jmx文件),如下:
安装方法也很简单,下载插件文件然后放到jmeter的/lib/ext路径下,然后在重启jmeter就好了。
链接: https://pan.baidu.com/s/143eZLHZDYkBfyrr7Af9eDA 提取码: dcko
注:jmeter文字报告看起来还是不够直观,结合grafana可以实现更炫酷的展示。
三、jmeter的可视化—— +influxdb+grafana
tantan_ecs配置的这些。
总的来讲配置这东西还是很简单的,如果docker顺利的话会更快;不过即使不用docker问题也不大。随便找一个公网能够访问的云服务器,分别安装influxdb和grafana,按照网上搜到的配置方法进行配置即可。
搞可视化的原因。Jmeter自身提供的数据分析面板太过粗糙,并且只能在压测任务执行结束才可以看到结果。关于这个问题其实可以额外再借助influxdb和grafana实现更生动、形象的实时监控。接下来介绍JMeter+InfluxDB+Grafana打造可视化实时监控。
其实可以参照的文章也不少,网上一搜有很多。
JMeter+InfluxDB+Grafana实现可视化实时监控_luq89的博客-CSDN博客_jmeter+grafana+influxdb
用docker可能更省事,但是我得配置influx的时候有点问题。晚点换台机器再研究。测试开发实战 | Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台 - 云+社区 - 腾讯云
0、准备
这里没有直接使用docker,而是分别进行安装。
准备一台公网能够访问的云服务器,我这次选用的是一台普通的腾讯云服务器tantan_ecs(公网ip为xxx.xxx.193.69)。值得注意的是后面如果需要访问对应的网页需要在安全组层面进行相应端口的放行。
1、安装influxdb
关于influxdb的安装就参照这篇文章: linux安装influxdb_焱齿的博客-CSDN博客
这里要做的就是创建对应的库表就好了
show databases # 查看所有数据库
create database "jmeter" #创建数据库
use jmeter #切换数据库
2、jmeter通过Backend Listener连接influxdb
(1)线程组中添加 后端监听器
如下简单的配置成如下形式就好。
主要配置说明:
- implementation 选择 influxdb 所对应的,就是截图所示的这个即可。
- influxdbUrl:需要改为自己influxdb的部署ip和映射端口,我这里是部署在本地,所以就是localhost,端口是容器启动时映射的8086端口,db后面跟的是刚才创建的数据库名称
- application:可根据需要自由定义,只是注意后面在 grafana 中选对即可
- measurement:表名,默认是 jmeter ,也可以自定义
- summaryOnly:选择true的话就只有总体的数据,false会将每个transaction都分别记录
(2)运行jmeter脚本,查询influxdb数据库
运行对应的脚本后执行查询命令查询jmeter库的jmeter表中是否有数据。如下即有数据了。
2、安装grafana
以docker的形式安装Grafana。
(1)首先下载grafana镜像
docker pull grafana/grafana
(2)启动一个grafana容器,将3000端口映射出来
docker run -d --name grafana -p 3000:3000 grafana/grafana
(3)网页端访问ip:3000验证部署是否成功
如下能访问就说明部署成功了。
注:有时候可能出现访问不了的情况,这个时候尝试换个浏览器或许就行了。这里
(4)添加数据源
Home→Add your first data source
选择influxdb
如下图为成功的提示
(5)导入模板(创建仪表盘)
这里其实就是确定可视化报告的样式,可以导入json文件或者使用模板id都行。有三种方式:
- 直接上传模板json文件
- 直接输入模板json内容
- 直接输入模板id号
下面演示直接上传模板json文件的方式:
①链接: https://pan.baidu.com/s/1kxnxE4k2v187e5nlTioiww 提取码: 5fv0 下载对应的json文件
②上传上去,然后就能看到如下仪表盘了
如果觉得仪表盘样式不好的话可以到官网下载或提取模板id:Dashboards | Grafana Labs
搜索jmeter→选择 “Apache JMeter Dashboard using Core InfluxdbBackendListenerClient”。
3、查看执行效果
执行jmeter脚本,然后刷新grafana页面就可以看到对应的效果了
四、jmeter安装常用插件
jmeter本身有很多协议是支持不了的,例如websocket、udp等的测试。如果需要的话也很简单安装对应的第三方插件就可以了。就像前面说的支持ws一样把对应的插件放到/lib/ext中即可。除此之外还有另外一种方式那就是下载一个插件管理器,里面有各种插件供你下载使用。
1、安装插件管理器
插件管理器下载链接: 这里 按照提示进行操作即可。
然后重启Jmeter,然后 Options→Plugins Manager,就打开了插件管理器页面。这里可以看到
重启之后,就可以在采样器里面看到对应的选项了。
Documentation :: JMeter-Plugins.org
可以看到udp sampler相关的介绍 Documentation :: JMeter-Plugins.org
2、配置udp请求
如下图所示。首先是目标ip:port;然后就是选择 “”Encode/Decode Class“;最后就是要发送的数据。对于发送16进制数据的情况,我们通过tcpdump抓包把获得的“Hex Stream”直接贴过来即可。如:
5b0004a0be0001062b0000000000000114f28b94018e021801220d64625f6d73675f7265636f72642a06636f6c6c5f3732f2017b2266696c746572223a207b226368616e223a20342c20226b6579223a2022333030373434323131375f383934353534383334343634393831222c202274696d65223a207b2224677465223a20313635343834353836323030303030307d7d2c2022736f7274223a207b2274696d65223a20317d2c20226c696d6974223a2032302c202270726f6a656374696f6e223a207b227479706573223a20312c2022636f6e74223a20312c2022736571223a20312c20226b6579223a20312c202274696d65223a20312c20226d7367223a20312c202265787473223a20312c20226368616e223a20312c2022646972223a20317d7d5d
注意:这里是选中上面的Data所在行→右键→复制;而不是选中下面的16进制数据块中的data域右键→复制。因为下面即便选中的是data域实际复制下来依然是包含各层协议头部的。
Data Encode/Decode class说明如下:
- kg.apc.jmeter.samplers.HexStringUDPDecoder:直接发送16进制数据,HEX-encoded;
- kg.apc.jmeter.samplers.UDPSampler:直接发送字符串
- kg.apc.jmeter.samplers.DNSJavaDecoder : dns解析填写格式如: www.baidu. A IN
- kg.apc.jmeter.samplers.UDPTrafficDecoder : 你可以通过实现这个接口,来自定义编解码方法。
对于我们压测inner协议的情况使用“kg.apc.jmeter.samplers.HexStringUDPDecoder”就好了;这个也是最经常使用的。
效果如下。另外目标机器部署的服务也是收到相对应的请求了的。
对着一坨反解其实就是实际返回的东西了。
5b0004a0be0000e6ef000000000000006e0a67088d01126266696e64206572726f7221676574206d6f6e676f20636c69656e74206661696c65643a2070696e67206d6f6e676f206661696c65643a20636f6e7465787420646561646c696e652065786365656465642c20636f73743a3939392e37383330356d73f28b9401005d
注:proxy_svr部署在外网,其尝试访问内网的腾讯云cmongo,实际上是访问不通的。但是这并不影响,我们压测inner协议已经通了的事实。
注:区分网络通不通的方法很简单在云服务器上ping 云数据库的ip,能ping同就说明网络是通的。
不过这个问题也难不倒我们,按小时购买一个和云服务器同地域的mongodb副本集。然后人为的插入两条数据,然后执行查询效果如下。
记录一把压测结果!!!!!!
五、Linux下的非GUI模式压测
Mac/Linux下安装jmeter_焱齿的博客-CSDN博客_jmeter mac安装
六、Jmeter分布式压测
参见如下文章,还是有很多值得注意的点的。
七、常用工具收藏
百度云网盘搜jmeter:
里面的 apache-jmeter-5.4.3.zip是支持websocket的jmeter安装包。
里面的 私有化压测计划.jmx 是qd私有化业务的一个压测计划文件。
里面的 303213View Results Tree.jmx 是我对一个接口的压测计划文件。
另外关于jmeter还有很多东西值得研究。例如:
(1)自定义tcp/udp协议的压测(例如想压某个inner协议) —— done
上述已经演示!
(2)压测机应该也可以配置成远端机器,这样才能实现海量压测 —— done