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没试过
  • 不错的知识广度和代码能力可以让你迅速的实现简单的测试工具
  • 大道至简

使用curl创建简单的性能监控工具的更多相关文章

  1. 你值得拥有:25个Linux性能监控工具

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  2. 25个Linux性能监控工具

    一段时间以来,我们在网上向读者介绍了如何为Linux以及类Linux操作系统配置多种不同的性能监控工具.在这篇文章中我们将罗列一系列使用最频繁的性能监控工具,并对介绍到的每一个工具提供了相应的简介链接 ...

  3. Linux性能监控工具收集(转)

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  4. 五大最佳开源java性能监控工具

    如果你正在寻找性能监控工具,不妨看看以下推荐的这五款开源工具,这些工具目前已经可以替代付费工具了,你可以看看是否是你的最佳选择.本文推荐的五款开源工具目前是开源社区中最受欢迎的. 1. Stagemo ...

  5. Spotlight性能监控工具的配置及使用

    这是我离线整理资料里的内容,大概是2012年时候开始使用此性能监控工具的,直到至今,接触到几个性能监控工具里,还是美国quest公司生产的Spotlight此产品相对比较牛! 我也不知道现在发展到能支 ...

  6. SkyWalking分布式系统应用程序性能监控工具-上

    概述 微服务系统监控三要素 现在系统基本都是微服务架构,对于复杂微服务链路调用如下问题如何解决? 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方? 如何计算每个节点访问流 ...

  7. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

  8. (转载)Java自带的GUI性能监控工具Jconsole以及JisualVM简介

    原文链接:http://blog.csdn.net/chendc201/article/details/22905503 1 Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的 ...

  9. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

随机推荐

  1. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...

  2. Go 基础学习笔记 (5)| 数据类型说明与使用

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  3. PWM呼吸灯

    1.PWM简介       PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技 ...

  4. 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法

    未正常关闭minicom yesaidu@ywf-ubuntu: ~$ ls /var/lock LCK..ttyS0  subsys yesaidu@ywf-ubuntu: ~$ kill 0 ye ...

  5. @Transactional 的回滚

    默认情况下,Exception是不会引起回滚操作的,RuntimeException才会引起回滚操作. 当然如果所有的Exception都要回滚的话,直接@Transactional(rollback ...

  6. java实现两个json的深度对比

    两个json的深度对比 在网上找了好多资料都没有找到想要的,还是自己写个吧! 上代码!!! 1.pom.xml中加入 <dependency> <groupId>com.ali ...

  7. 详解Redis RDB持久化、AOF持久化

    1.持久化 1.1 持久化简介 持久化(Persistence),持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘). 1.2 red ...

  8. ReentreantLock:重入锁

    ReentreantLock:重入锁 参考:https://www.cnblogs.com/nullzx/p/4968674.html 一). ReentrantLock与synchronized的区 ...

  9. 执行yaml.load()出现警告信息:YAMLLoadWarning: callingyaml.load() without Loader=..

    执行yaml.load()出现警告信息:YAMLLoadWarning: callingyaml.load() without Loader=... 原因: yaml5.1版本后弃用了yaml.loa ...

  10. tcpip协议

    几个概念 1.分层(我们使用四层模型更为贴合我们的实际网络) 分层是为什么,其实和公司中职位是一样的,不同职位的人做不同的事情,然后不同职位的人合起来,一起完成了数据传输的事情. 链路层  在这个层面 ...