使用curl创建简单的性能监控工具
cURL,全称Command Line URL viewer,是一种命令行工具,用来发送网络请求,然后得到和提取数据,显示在标准输出(stdout)。
我们可以使用curl来获取网页的源码,显示头信息,显示通讯过程等。
在做基于http的接口测试的时候,curl基本上可以完成postman所具备的大部分功能,如果你习惯于使用命令行,那么curl是一个非常有用且常用的工具。
CURL的基本使用
查看网页源码
curl www.itest.info
查看response的headers
curl -i www.itest.info
显示通讯过程
curl -v www.itest.info
常用参数
使用curl发送GET请求时有一些常用参数。
- -o: output,将输出的结果重定向到一个文件
- -s: slient, 不显示进度信息
- -w: 展示多维度的统计信息
统计请求耗时
使用下面的这条curl命令可以统计出请求的耗时。
curl www.itest.info -o /dev/null -s -w "%{time_total}\n"
其中我们把输出丢弃了(重定向到/dev/null里),并且不显示进度信息,只展示请求的总耗时。
工具化
基于curl的统计请求耗时的能力,我们可以写一个简单的工具调用curl,然后打印出该请求的耗时。
下面是我用python写的一个简单例子。
# curl_tool.py
import subprocess
import sys
url = sys.argv[-1]
def get_cost(url):
cmd_list = ['curl', '-o', '/dev/null', '-s', '-w', '%{time_total}\n']
cmd_list.append(url)
out = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = out.communicate()
cost = float(stdout) * 1000
return cost
print "%s %s\n" %(url, get_cost(url))
使用方式: 在命令行中运行
python curl_tool.py www.itest.info
运行结果
www.itest.info 42.797
这里的单位是毫秒。
改进
我们的工具只支持输入1个url然后拿到耗时的结果,这显然是跟我们日常的需求不符合的。
我们的日常需求是统计n个接口或页面的耗时,然后找出其中耗时最多的m个接口或页面。
下面我们对工具进行改进,使其可以支持多个url/接口的耗时统计。
import subprocess
import sys
# url = sys.argv[-1]
url_list = sys.argv[-1]
def get_cost(url):
cmd_list = ['curl', '-o', '/dev/null', '-s', '-w', '%{time_total}\n']
cmd_list.append(url)
out = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = out.communicate()
cost = float(stdout) * 1000
return cost
with open(url_list) as f:
for url in f.read().split("\n"):
if url:
print "%s %s" %(url, get_cost(url))
这里我们需要定义1个url列表: urls.txt。
http://www.itest.info/
http://www.itest.info/courses/9
http://www.itest.info/courses/7
http://www.itest.info/courses/2
http://www.itest.info/courses/6
http://www.itest.info/newclass
运行
python curl_tool.py urls.txt
结果
http://www.itest.info/ 80.16
http://www.itest.info/courses/9 40.153
http://www.itest.info/courses/7 54.118
http://www.itest.info/courses/2 56.205
http://www.itest.info/courses/6 47.896
http://www.itest.info/newclass 78.962
统计
支持了一次请求多个接口以后,我们需要对耗时进行排序,找出最耗时的那个页面和接口。
python curl_tool.py urls.txt | sort -k 2 -r
我们用sort命令对第2列进行排序,结果如下
http://www.itest.info/courses/2 49.519
http://www.itest.info/newclass 44.716
http://www.itest.info/courses/7 43.408
http://www.itest.info/ 43.052
http://www.itest.info/courses/9 42.869
http://www.itest.info/courses/6 38.722
持续运行
我们希望每天晚上都运行1次统计脚本。
这时候可以使用crontab。
30 2 * * * python curl_tool.py urls.txt | sort -k 2 -r >/res.txt 2>&1
这样每天早上2:30 am的时候我们就会运行统计脚本,把接口存储在res.txt中。
持续统计
为了可以统计一段时间内的请求耗时,我们可以把每天的结果落地到es里。这里就不展开了。
讨论
- 有mac/linux的同学可以亲自尝试一下
- python脚本基于python2,python3没试过
- 不错的知识广度和代码能力可以让你迅速的实现简单的测试工具
- 大道至简
原文地址:https://www.cnblogs.com/nbkhic/p/12021042.html
- HTML/CSS/JavaScript学习笔记【持续更新】
- Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
- 每天一个Linux命令(4)——mkdir
- 每天一个Linux命令(3)——pwd
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- Fiddler抓包7-post请求(json)
- Selenium2+python自动化56-unittest之断言(assert)
- 长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Github Pages同步到Qcloud腾讯云对象存储COS By HKL,
- 独家 | 探索性文本数据分析的新手教程(Amazon案例研究)
- OpenWRT通过3G Modem加asterisk将GSM通话转为SIP By HKL,
- Coding通过Jenkins生成jekyll并发布到腾讯云对象存储Qcloud COS By HKL,
- mybatis 实用技巧:<trim prefix="where" prefixOverrides="and|or">
- OpenWRT配置Webdav(s)共享文件 By HKL,
- OpenWRT配置Apache Webdav By HKL,
- 我向面试官讲解了单例模式,他对我竖起了大拇指
- 47 张图带你 MySQL 进阶!!!
- 新特性解读 | InnoDB-Cluster 扫盲-日常运维
- Laravel 框架实现无限极分类
- 这样设置IDEA,让你爽到飞起!
- 这些年,我写过的BUG(一)
- Selenium处理下拉列表
- 掌握好这几个css属性,少写100行js代码