使用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沒試過
  • 不錯的知識廣度和代碼能力可以讓你迅速的實現簡單的測試工具
  • 大道至簡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM