• 使用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没试过
    • 不错的知识广度和代码能力可以让你迅速的实现简单的测试工具
    • 大道至简
  • 相关阅读:
    latex
    anaconda
    git stash
    YOLO训练Pedestrain
    OpenCL C
    OpenCL
    OpenVX
    caffe源码阅读
    居住证积分查询地址
    jdk 1.8内存逐步增大的一个bug
  • 原文地址:https://www.cnblogs.com/nbkhic/p/12021042.html
Copyright © 2020-2023  润新知