JMeterのjtlファイルからCSVのサマリーを出力するコマンドを作る

ちょっと訳ありで、老舗な負荷試験ツール「JMeter」を動かして負荷試験をする必要がありました。
パフォーマンスは計れたものの、jtlファイルからサマリーを出力したくて調べたのですが、ちょっと大変でした。JMeterの歴史が古い分、過去のバージョンの話もたくさんあり、情報が散乱していてなかなか正しい情報が見つからないので苦労したのですよ。つらたん。

なので同じように困るかもしれない人向けのメモを残します。
（最近だとあまりニーズはないかもしれませんが...:sweat_smile:）

## 概要

CLI版を使っての話です。
Linux環境での実行を想定しています。

通常、JMeterを使ってパフォーマンステストをする場合、そのログをjtlファイルに出力されるよう実行します。

```bash:JMeter実行例
# ローカルのjmeterディレクトリ下にまとめています
$ ./jmeter/bin/jmeter -n -t シナリオファイル.jmx -l ログファイル.jtl
```

このログは実際はCSV形式の内容なのですが、それぞれの通信の細かいログですのでそのままでは使いにくいです。
全体をサマライズしたレポート（これもこれでCSV形式）を作成するようにします。

プラグインを導入して解決します。


## プラグインの導入

[JMeter](https://jmeter.apache.org/) はApache謹製ですが、そのプラグインをまとめているサイトがあります。

:point_right: [jmeter-plugins.org](https://jmeter-plugins.org/)

導入は大きくこんな流れです。

1. プラグイン・マネージャーをインストールする
2. プラグイン・マネージャーをつかってコマンドライン・ツールをインストールする

### プラグイン・マネージャーをインストールする

CLIでプラグインを実行するためのツールをインストールするには、そのマネージャーをインストールします。
[こちらのドキュメントに手順が載っている](https://jmeter-plugins.org/wiki/PluginsManagerAutomated/)ので、参考にしながらやります。
ツールのバージョンが異なるのでそこは注意です。

#### 1. cmdrunner-2.2.jar をの入手

ドキュメントの方は2.0になっていますですが、最新版は2.2（2021/7/1現在）のようですので、よしなに置き換えてダウンロードします。
これはlibディレクトリに置いて、実行権限をつけておきます。

```bash:コマンド実行例
$ cd 自分のディレクトリ/jmeter/lib
$ wget http://search.maven.org/remotecontent?filepath=kg/apc/cmdrunner/2.2/cmdrunner-2.2.jar -O cmdrunner-2.2.jar
$ chmod 0775 cmdrunner-2.2.jar
```


#### 2. plugin-manager.jar の入手

[こちらのドキュメント](https://jmeter-plugins.org/install/Install/)にあるプラグイン・マネージャー用のjarファイルを入手します。（現時点での最新版は1.6でした。）
これはlib/extディレクトリに置いて、実行権限をつけておきます。

```bash:コマンド実行例
$ cd 自分のディレクトリ/jmeter/lib/ext
$ wget --trust-server-names https://jmeter-plugins.org/get/
$ chmod 0755 jmeter-plugins-manager-1.6.jar
```


#### 3. PluginsManagerCMD.sh の導入

jmeter-plugins-managerからPluginsManagerCMD.shを導入します。
binディレクトリ下で、次のようにコマンドを実行します。

```bash:コマンド実行例
$ cd 自分のディレクトリ/jmeter/bin
$ java -cp 自分のディレクトリ/jmeter/lib/ext/jmeter-plugins-manager-1.6.jar org.jmeterplugins.repository.PluginManagerCMDInstaller
```


#### 4. コマンドライン・ツールの導入

導入した PluginsManagerCMD.sh を使って必要なツールを導入します。

- jpgc-cmd
- jpgc-synthesis  （これがないとエラーになった。GUIツールではない場合に必要なようだ）

binディレクトリ下で実行します。

```bash:コマンド実行例
$ cd 自分のディレクトリ/jmeter/bin
$ ./PluginsManagerCMD.sh install jpgc-cmd,jpgc-synthesis
```

実行すると,`JMeterPluginsCMD.sh`がbinディレクトリ下に作成されています。
これを使ってサマリーを出力させられます。

以上で必要なものは揃いました。


## レポートを出してみよう

次のようにログファイル、サマリを出力するファイル、を指定してコマンドを実行します。
（途中経過が出力されますが無視で！）

```bash:コマンド実行例
$ cd 自分のディレクトリ/jmeter/bin
$ ./JMeterPluginsCMD.sh --generate-csv report.csv  --input-jtl ログファイル.jtl --plugin-type AggregateReport
```


```bash:結果
$ cat report.csv 
Label,# Samples,Average,Median,90% Line,95% Line,99% Line,Min,Max,Error %,Throughput,Received KB/sec,Std. Dev.
Home,3274,658,489,623,722,1145,344,60014,0.24%,5.3,32.7,2940.11
Point,3268,870,513,657,750,1516,375,60011,0.55%,5.0,1.6,4403.17
payment_code,1636,824,592,759,873,1419,424,60010,0.31%,2.7,1.0,3329.37
TOTAL,8178,776,520,684,770,1432,344,60014,0.38%,12.6,33.6,3665.42
```

`report.csv` は任意のファイル名ですので適宜変えてOK.

## おまけ

### その１

ターミナル上でわかりやすくしたいのであれば、`column` コマンドが便利です。

```bash
$ cat report.csv | column -s, -t
Label         # Samples  Average  Median  90% Line  95% Line  99% Line  Min  Max    Error %  Throughput  Received KB/sec  Std. Dev.
Home          3274       658      489     623       722       1145      344  60014  0.24%    5.3         32.7             2940.11
Point         3268       870      513     657       750       1516      375  60011  0.55%    5.0         1.6              4403.17
payment_code  1636       824      592     759       873       1419      424  60010  0.31%    2.7         1.0              3329.37
TOTAL         8178       776      520     684       770       1432      344  60014  0.38%    12.6        33.6             3665.42
```

### その２

ちょっとしたラッパスクリプトを作ってみました。

```sh:実行例
$ ./mk_csv.sh ログファイル.jtl
<<RAW CSV>>
Label,# Samples,Average,Median,90% Line,95% Line,99% Line,Min,Max,Error %,Throughput,Received KB/sec,Std. Dev.
Home,3274,658,489,623,722,1145,344,60014,0.24%,5.3,32.7,2940.11
Point,3268,870,513,657,750,1516,375,60011,0.55%,5.0,1.6,4403.17
payment_code,1636,824,592,759,873,1419,424,60010,0.31%,2.7,1.0,3329.37
TOTAL,8178,776,520,684,770,1432,344,60014,0.38%,12.6,33.6,3665.42

<<COLUMNED>>
Label         # Samples  Average  Median  90% Line  95% Line  99% Line  Min  Max    Error %  Throughput  Received KB/sec  Std. Dev.
Home          3274       658      489     623       722       1145      344  60014  0.24%    5.3         32.7             2940.11
Point         3268       870      513     657       750       1516      375  60011  0.55%    5.0         1.6              4403.17
payment_code  1636       824      592     759       873       1419      424  60010  0.31%    2.7         1.0              3329.37
TOTAL         8178       776      520     684       770       1432      344  60014  0.38%    12.6        33.6             3665.42
```

ソースはこちら。

https://gist.github.com/ping414ms/e112b4ede204d643c2054a003b49ae89