1. 程式人生 > >使用curl建立簡單的效能監控工具

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