zoukankan      html  css  js  c++  java
  • 使用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}
    "
    

    其中我们把输出丢弃了(重定向到/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}
    ']
        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
    " %(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}
    ']
        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("
    "):
            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没试过
    • 不错的知识广度和代码能力可以让你迅速的实现简单的测试工具
    • 大道至简
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/nbkhic/p/12021042.html
Copyright © 2011-2022 走看看