Go 每日一庫之 vegeta — http 壓力測試工具庫
今天給大家推薦的是一個對 HTTP 接口做壓力測試的工具:vegeta。
項目地址:https://github.com/tsenart/vegeta
一、特點
-
命令行和 Go 第三方庫都可以使用
-
命令行使用 UNIX 風格設計
-
可擴展多種壓測報告形式
-
對於分佈式測試也非常簡單易用
-
易安裝、易使用
二、安裝
2.1 MacOS 下安裝
macos 下使用 brew 即可安裝,如下:
brew update && brew install vegeta
2.2 Arch Linux 下安裝
pacman -S vegeta
2.3 FreeBSD 下安裝
pkg install vegeta
2.4 自行編譯
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
mv vegeta ~/bin # Or elsewhere, up to you.
三、使用教程
vegeta 工具主要有 4 個子命令組成,分別是 attack、encode、report、plot。
-
attack 子命令:該子命令主要設置和要壓測的接口請求有關。比如要壓測的接口地址、接口的 body 參數、接口的 header 頭、併發的請求數量、壓測的時間、壓測的速率等等。
-
**encode 子命令:**該子命令主要是指定壓測結果輸出的位置以及輸出的格式。比如以 csv 格式輸出還是以 json 格式輸出,輸出到哪個文件。
-
**report 子命令:**該子命令主要是針對壓測結果生成統計報告。
-
plot 子命令: 該子命令的功能主要是將測試結果以圖表的形式進行展示。
3.1 指定壓測的接口地址
在指定壓測地址時有兩種方式:通過標準的 stdin 和指定具體的文件。
- 通過 stdin 指定壓測地址
echo "GET https://www.baidu.com" | vegeta attack -duration=5s
如上所示,通過管道的方式將要壓測的接口地址輸出給 vegeta 的 attack 命令。這裏需要注意,在指定壓測接口時,一定要指定請求的方法,同時請求方法必須都是大寫。例如 GET、POST。而 Get 或 Post 則是無效的方法。
- 通過 targets 參數指定文件
通過文件可以指定一個或多個要壓測的 url 地址。指定格式如下:
GET https://foo.bar/a/b/c
Header-X: 123
Header-Y: 321
POST https://foo.bar/b/c/a
Header-X: 123
@/path/to/body/file
在文件中,通過空行來區分兩個 url 的部分。每個 url 部分以方法名和 url 地址開頭,後續可以跟着對應的 Header 頭信息。在 POST 請求中,可以通過 @指定具體的 body 體內容的文件。
3.2 指定 body 體內容
要指定 body 體,只能通過文件的方式來指定。vegeta attack 有兩種方式來指定 body 的文件名。第一種是剛纔上面提到,在 targets 的文件中,可以通過 “@” 符號來指定對應的 body 體。第二種是通過命令行參數-body
指定一個文件名:
vegeta attack -body
3.3 指定接口返回內容爲止
通過 vegeta encode 子命令來指定接口自身輸出的內容(即接口的響應值)被保存的位置以及輸出內容的格式(csv、json 等) 這裏主要有兩個參數項:
-
-output string:指定接口響應被存儲的位置
-
-to string:指定內容輸出的格式。例如 csv、json、gob。默認爲 json。
3.4 生成測試報告
vegeta 的測試報告是通過report
子命令來生成的。該命令的輸入數據是 encode 子命令產生的輸出。如下示例所示:
sh-3.2# echo "GET https://www.baidu.com" | vegeta attack -duration=5s | vegeta report
Requests [total, rate, throughput] 250, 50.21, 49.11
Duration [total, attack, wait] 5.09s, 4.979s, 111.653ms
Latencies [min, mean, 50, 90, 95, 99, max] 18.132ms, 32.41ms, 21.998ms, 55.54ms, 106.41ms, 171.889ms, 276.545ms
Bytes In [total, mean] 56750, 227.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:250
可以看到,在報表中輸出的信息有:
-
請求相關的統計:請求總數、速率以及吞吐量。
-
持續時間:壓測的總時長、實際發送請求的時長以及等待的時間。
-
響應延遲:最小、最大延遲。50 分位、90 分位、95 分位響應延遲。
-
輸入、輸出的字節
-
響應成功率。
-
狀態碼統計。
通過 - type 參數可以按響應時間區間統計,如下:
sh-3.2# echo "GET https://www.baidu.com" | vegeta attack -duration=5s | vegeta report -type="hist[0,100ms,200ms,300ms]"
Bucket # % Histogram
[0s, 100ms] 247 98.80% ##########################################################################
[100ms, 200ms] 3 1.20%
[200ms, 300ms] 0 0.00%
[300ms, +Inf] 0 0.00%
按不同的響應時間的區間統計響應的結果量。
四、總結
vegeta 是一個命令行的工具。一個壓測工具最基本的功能就是輸入 url 及參數、啓動指定量的協程來進行壓力測試,同時把響應結果保存下來,並以報表的形式進行統計輸出。同時,該開源包也是大家學習使用 golang 進行命令行開發較好的參考。建議有興趣的朋友可以閱讀下源碼。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/am9dfFLnRE51ETwEnsOu2w