負荷試験ツールVegetaを試してみた


HTTP負荷テストツール[Vegeta](https://github.com/tsenart/vegeta)を試してみた。


## Vegeta とは
HTTPの負荷テストツール

```
Vegeta is a versatile HTTP load testing tool built out of a need to drill HTTP services with a constant request rate.
```

[README](https://github.com/tsenart/vegeta#vegeta------)に惚れたw

CLIとしても使えるし、ライブラリとしても利用することができる。
レポートは、テキスト、JSON、ヒストグラムやグラフで見れたりするみたい。

## インストール
READMEの[Install参照](https://github.com/tsenart/vegeta#install)

## くらえ!!ドドドドッ
(負荷ツールだから、攻撃対象には十分気をつけてね)
以下のコマンドで、`http://localhost:8080/zarbon`に向けて
`秒間10リクエスト`で`5秒間`攻撃し、結果をresult.binに保存する。

```
$ echo "GET http://localhost:8080/zarbon" | vegeta attack -rate=10 -duration=5s | tee result.bin | vegeta report
```

結果

```
Requests      [total, rate, throughput]  50, 10.21, 10.21
Duration      [total, attack, wait]      4.89908005s, 4.898346546s, 733.504µs
Latencies     [mean, 50, 95, 99, max]    1.122139ms, 744.796µs, 2.160273ms, 17.197485ms, 17.197485ms
Bytes In      [total, mean]              300, 6.00
Bytes Out     [total, mean]              0, 0.00
Success       [ratio]                    100.00%
Status Codes  [code:count]               200:50 
```

## レポート
以下を実行した結果を見てみる。

```
$ echo "GET http://localhost:8080/cell" | vegeta attack -rate=50 -duration=30s -keepalive=false | tee result.bin | vegeta report
```
エラー発生させたかったのでコマンド実行して10秒後にサーバ落として、15秒間落とした後に再起動させた。

### text形式で表示する
```bash

$ vegeta report -type=text result.bin
Requests      [total, rate, throughput]  1500, 50.03, 21.65
Duration      [total, attack, wait]      29.983470356s, 29.981709248s, 1.761108ms
Latencies     [mean, 50, 95, 99, max]    1.779667ms, 1.743878ms, 2.243263ms, 3.08067ms, 35.335262ms
Bytes In      [total, mean]              684247, 456.16
Bytes Out     [total, mean]              0, 0.00
Success       [ratio]                    43.27%
Status Codes  [code:count]               200:649  403:851  
Error Set:
403 Forbidden
```

### json形式で表示する

```bash

$ vegeta report -type=json result.bin | jq .
{
  "latencies": {
    "total": 2669501705,
    "mean": 1779667,
    "50th": 1743878,
    "95th": 2243263,
    "99th": 3080670,
    "max": 35335262
  },
  "bytes_in": {
    "total": 684247,
    "mean": 456.1646666666667
  },
  "bytes_out": {
    "total": 0,
    "mean": 0
  },
  "earliest": "2019-12-15T13:08:30.48583379+09:00",
  "latest": "2019-12-15T13:09:00.467543038+09:00",
  "end": "2019-12-15T13:09:00.469304146+09:00",
  "duration": 29981709248,
  "wait": 1761108,
  "requests": 1500,
  "rate": 50.03050318420591,
  "throughput": 21.645259614523855,
  "success": 0.43266666666666664,
  "status_codes": {
    "200": 649,
    "403": 851
  },
  "errors": [
    "403 Forbidden"
  ]
}

```
jqと一緒に使うと見やすい。

### ヒストグラム形式で表示する

```bash

$ vegeta report -type='hist[0,1ms,2ms,3ms,4ms,5ms]' result.bin
Bucket         #     %       Histogram
[0s,    1ms]   28    1.87%   #
[1ms,   2ms]   1231  82.07%  #############################################################
[2ms,   3ms]   224   14.93%  ###########
[3ms,   4ms]   6     0.40%   
[4ms,   5ms]   3     0.20%   
[5ms,   +Inf]  8     0.53% 
```

### グラフをplotしてhtml出力する

```bash

$ cat result.bin | vegeta plot > plot.html
```
ブラウザで開くと png画像のダウンロードができる。
![vegeta-plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241942/f23ce259-7464-24bb-5664-dff32031d51d.png)

## リアルタイムで負荷試験中の状態が見たい!!
iTermを使っている場合、[jaggr](https://github.com/rs/jaggr)を使って[jplot](https://github.com/rs/jplot)と連携することでリアルタイムで負荷状況が見れる!


```bash

$ echo 'GET http://localhost:8080/cell' | \
    vegeta attack -rate 50 -duration 60s -keepalive=false | vegeta encode | \
    jaggr @count=rps \
          hist\[100,200,300,400,500\]:code \
          p25,p50,p95:latency \
          sum:bytes_in \
          sum:bytes_out | \
    jplot rps+code.hist.100+code.hist.200+code.hist.300+code.hist.400+code.hist.500 \
          latency.p95+latency.p50+latency.p25 \
          bytes_in.sum+bytes_out.sum
```

エラー発生させたかったので実行して10秒後にサーバ落として、5秒間落とした後に再起動させた。
![realTimeReport.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241942/59779a70-adf6-e1c8-8d68-9a9d3b998670.gif)


## まとめ
シンプルな実行方法だったりグラフが出力できたり、なかなか使いやすいと思う。