いつも業務では Locust を使っていて、最近 Twitter やはてブで k6 をよく見るので n 番煎じですが勉強がてら入門してみます。
k6 のインストール
ふだん macOS を利用しているので brew でインストールします。すんなりインストールできました。k6 は Go で書かれているのでバイナリでのインストールも可能です。
brew install k6
スクリプトの作成
Get started に沿って進めていきます。k6 new
すると script.js
が生成されました。コメントが含まれていましたが省略しています。
import http from 'k6/http'; import { sleep } from 'k6'; export const options = { vus: 10, duration: '30s', }; export default function() { http.get('https://test.k6.io'); sleep(1); }
スクリプトの実行
k6 run script.js
でスクリプトを実行します。duration
で指定した秒数(30 秒) test.k6.io にリクエストされます。スクリーンショットからは分かりづらいのですが、最初から 10 VU でリクエストしているようです。
徐々に VU を増やしていきたい場合は以下のように options.stages
を指定することで段階的にユーザの増減ができます。
export const options = { stages: [ { duration: '30s', target: 20 }, { duration: '1m30s', target: 10 }, { duration: '20s', target: 0 }, ], };
こちらもスクリーンショットからは分かりづらいのですが、表にするとこのようなイメージです。
時間 | 内容 |
---|---|
最初の 30 秒 | 0 VU から徐々に 20 VU まで増えていく |
次の 1 分 30 秒 | 20 VU から徐々に 10 VU まで減っていく |
次の 20 秒 | 10 VU から徐々に 0 VU まで減っていく |
結果の出力
コマンドライン引数に --out json=test.json
を足すことでファイルへの出力が可能のようです。試してみます。
k6 run script.js --out json=test.json
test.json
に結果が出力されました。tail -f test.json
するとリクエストする度に書き込まれていく様子が確認できます。
{"type":"Metric","data":{"name":"http_reqs","type":"counter","contains":"default","thresholds":[],"submetrics":null},"metric":"http_reqs"} {"metric":"http_reqs","type":"Point","data":{"time":"2024-10-09T22:48:08.630712+09:00","value":1,"tags":{"expected_response":"true","group":"","method":"GET","name":"https://test.k6.io","proto":"HTTP/1.1","scenario":"default","status":"200","tls_version":"tls1.3","url":"https://test.k6.io"}}} {"type":"Metric","data":{"name":"http_req_duration","type":"trend","contains":"time","thresholds":[],"submetrics":[{"name":"http_req_duration{expected_response:true}","suffix":"expected_response:true","tags":{"expected_response":"true"}}]},"metric":"http_req_duration"} {"metric":"http_req_duration","type":"Point","data":{"time":"2024-10-09T22:48:08.630712+09:00","value":166.047,"tags":{"expected_response":"true","group":"","method":"GET","name":"https://test.k6.io","proto":"HTTP/1.1","scenario":"default","status":"200","tls_version":"tls1.3","url":"https://test.k6.io"}}}
JSON の他にも、Extention を利用することで Amazon CloudWatch、Datadog、New Relic などのプラットフォームにも送信できるようです。
ダッシュボードの利用
みんな大好きダッシュボードを試してみます。環境変数 K6_WEB_DASHBOARD
に true
を指定するとダッシュボードが確認できます。
K6_WEB_DASHBOARD=true k6 run script.js
さすが Grafana Labs。イイ感じですね。デフォルトだと 10 秒おきにグラフが更新されますが、環境変数 K6_WEB_DASHBOARD_PERIOD
で指定可能なようです。先ほど記載した VU 数の推移も分かりやすいです。
画面右上の "REPORT" をクリックすることで Overview、Timings、Summary を含めた HTML が表示できます。環境変数 K6_WEB_DASHBOARD_EXPORT
に出力する HTML のファイル名を指定することで自動で出力することも可能です。
コード補完の有効化
僕はふだん VSCode を利用しているのですが、初期状態だとコード補完が効きません。htttp.
まで入力しても get
のサジェストがないことが分かります。
これは k6 の型定義をインストールすることで解決できました。
npm init --yes npm install --save-dev @types/k6
バッチリですね。型定義へのジャンプも問題なくできました。
おわりに
ただただドキュメントをなぞっただけの浅い記事になってしまいましたが、k6 を試してみました。まだスクリプトはがっつり書いていないのですが、CloudWatch や Datadog へのデータ連携ができることが魅力的でした。Locust だと CSV と HTML のみの出力なので、CSV をごにょごにょしたり HTML を見返したりするのが面倒なんですよね。これが外部サービスに連携できると見返す時にとても役立ちそうですね。
あと業務ではフロントエンドや CDK で TypeScript を書いているので、次は TypeScript 化してみようかなと思います。気が向いたらブログ書きます。