k6に入門する

いつも業務では Locust を使っていて、最近 Twitterはてブk6 をよく見るので n 番煎じですが勉強がてら入門してみます。

k6.io

grafana.com

k6 のインストール

ふだん macOS を利用しているので brew でインストールします。すんなりインストールできました。k6 は Go で書かれているのでバイナリでのインストールも可能です。

brew install k6

github.com

スクリプトの作成

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 などのプラットフォームにも送信できるようです。

grafana.com

github.com

ダッシュボードの利用

みんな大好きダッシュボードを試してみます。環境変数 K6_WEB_DASHBOARDtrue を指定するとダッシュボードが確認できます。

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 のファイル名を指定することで自動で出力することも可能です。

grafana.com

コード補完の有効化

僕はふだん VSCode を利用しているのですが、初期状態だとコード補完が効きません。htttp. まで入力しても get のサジェストがないことが分かります。

これは k6 の型定義をインストールすることで解決できました。

npm init --yes
npm install --save-dev @types/k6

バッチリですね。型定義へのジャンプも問題なくできました。

grafana.com

おわりに

ただただドキュメントをなぞっただけの浅い記事になってしまいましたが、k6 を試してみました。まだスクリプトはがっつり書いていないのですが、CloudWatch や Datadog へのデータ連携ができることが魅力的でした。Locust だと CSV と HTML のみの出力なので、CSV をごにょごにょしたり HTML を見返したりするのが面倒なんですよね。これが外部サービスに連携できると見返す時にとても役立ちそうですね。

あと業務ではフロントエンドや CDK で TypeScript を書いているので、次は TypeScript 化してみようかなと思います。気が向いたらブログ書きます。

grafana.com

github.com