K6
K6 は API およびシステムの負荷テストに使用するコマンドラインツールです。このインテグレーションでは、K6 の experimental-prometheus-rw 出力を使用して負荷テストメトリクスを DataKit の Prometheus Remote Write エンドポイントに書き込み、Guance に送信します。K6 は常駐サービスを必要とせず、負荷生成マシンから DataKit にアクセスできれば利用できます。
設定¶
前提条件¶
- K6 をインストールし、
k6 versionが正常に実行できることを確認します。 - DataKit をインストールし、負荷生成マシンから DataKit のポート
9529にアクセスできることを確認します。 - DataKit で
prom_remote_writeコレクターを有効にします。 - 実行ごとに一意の
benchmark_idとtestidを設定し、異なる負荷テストのデータが混在しないようにします。
DataKit の設定¶
DataKit のインストールディレクトリにある conf.d/prom 配下に prom_remote_write.conf を作成します。例:
[[inputs.prom_remote_write]]
path = "/prom_remote_write"
methods = ["PUT", "POST"]
# K6 メトリクスは k6_ で始まります。k6 measurement に書き込み、元のメトリクス名を保持します。
job_as_measurement = false
measurement_name = "k6"
keep_exist_metric_name = true
設定が完了したら、DataKit を再起動して変更を反映します。
K6 の設定¶
Remote Write の URL を DataKit に向け、experimental-prometheus-rw 出力を使用します:
export K6_PROMETHEUS_RW_SERVER_URL="http://<datakit-ip>:9529/prom_remote_write"
export K6_PROMETHEUS_RW_PUSH_INTERVAL="5s"
export K6_PROMETHEUS_RW_TREND_STATS="p(95),p(99),min,max"
k6 run \
-o experimental-prometheus-rw \
--tag benchmark_id="k6-demo-20260917" \
--tag testid="baseline-r300-rep1" \
script.js
DataKit エンドポイントで HTTP Basic Authentication が有効な場合は、K6_PROMETHEUS_RW_USERNAME と K6_PROMETHEUS_RW_PASSWORD も設定します。認証情報はシークレット管理システムから注入し、実際のパスワードをスクリプトやコマンド履歴に保存しないでください。
K6 スクリプトの例¶
次のスクリプトは一定の到着率で 10 分間実行されます。ターゲット URL を実際のテストエンドポイントに置き換え、サービスの処理能力に応じて VU 数を調整してください:
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
steady_load: {
executor: 'constant-arrival-rate',
rate: 300,
timeUnit: '1s',
duration: '10m',
preAllocatedVUs: 100,
maxVUs: 300,
},
},
};
export default function () {
const response = http.get(`${__ENV.TARGET_URL}/health`);
check(response, {
'HTTP status is 200': (res) => res.status === 200,
});
}
データの検証¶
- K6 コンソールを確認し、テスト中に HTTP エラーおよび Remote Write 出力エラーが発生していないことを確認します。
- Guance でメトリクスクエリを開き、
k6measurement を選択して、benchmark_idとtestidで絞り込みます。 - テスト中に、総リクエスト数、失敗率、平均所要時間、P95、P99、最大 VU が継続して送信されることを確認します。
- リクエストレートは累積リクエスト数から計算し、累積値をそのまま RPS として使用しないでください。クエリウィンドウは
K6_PROMETHEUS_RW_PUSH_INTERVALより長くする必要があります。短い場合、レートグラフに欠損が生じることがあります。
メトリクス¶
K6 measurement の名前は k6 です。次の表に、一般的な K6 負荷テストメトリクス、単位、および意味を示します。所要時間はミリ秒で表示されます。比率メトリクスの生値は 0~1 で、パーセント表示では 100 倍されます。
| メトリクス | 単位 | 説明 |
|---|---|---|
k6_checks_rate |
%(生値 0-1) |
check の成功率。パーセント表示では 100 倍します。 |
k6_data_received_total |
bytes |
K6 が受信したデータ量の累積値。 |
k6_data_sent_total |
bytes |
K6 が送信したデータ量の累積値。 |
k6_http_req_blocked_avg |
ms |
リクエストのブロック時間の平均値。 |
k6_http_req_blocked_max |
ms |
リクエストのブロック時間の最大値。 |
k6_http_req_blocked_p90 |
ms |
リクエストのブロック時間の 90。 |
k6_http_req_blocked_p95 |
ms |
リクエストのブロック時間の 95。 |
k6_http_req_blocked_p99 |
ms |
リクエストのブロック時間の 99。 |
k6_http_req_connecting_avg |
ms |
TCP 接続時間の平均値。 |
k6_http_req_connecting_max |
ms |
TCP 接続時間の最大値。 |
k6_http_req_connecting_p90 |
ms |
TCP 接続時間の 90。 |
k6_http_req_connecting_p95 |
ms |
TCP 接続時間の 95。 |
k6_http_req_connecting_p99 |
ms |
TCP 接続時間の 99。 |
k6_http_req_duration_avg |
ms |
HTTP リクエストのエンドツーエンド時間の平均値。 |
k6_http_req_duration_max |
ms |
HTTP リクエストのエンドツーエンド時間の最大値。 |
k6_http_req_duration_p90 |
ms |
HTTP リクエストのエンドツーエンド時間の 90。 |
k6_http_req_duration_p95 |
ms |
HTTP リクエストのエンドツーエンド時間の 95。 |
k6_http_req_duration_p99 |
ms |
HTTP リクエストのエンドツーエンド時間の 99。 |
k6_http_req_failed_rate |
%(生値 0-1) |
HTTP リクエストの失敗率。パーセント表示では 100 倍します。 |
k6_http_req_receiving_avg |
ms |
レスポンスデータの受信時間の平均値。 |
k6_http_req_receiving_max |
ms |
レスポンスデータの受信時間の最大値。 |
k6_http_req_receiving_p90 |
ms |
レスポンスデータの受信時間の 90。 |
k6_http_req_receiving_p95 |
ms |
レスポンスデータの受信時間の 95。 |
k6_http_req_receiving_p99 |
ms |
レスポンスデータの受信時間の 99。 |
k6_http_req_sending_avg |
ms |
リクエストデータの送信時間の平均値。 |
k6_http_req_sending_max |
ms |
リクエストデータの送信時間の最大値。 |
k6_http_req_sending_p90 |
ms |
リクエストデータの送信時間の 90。 |
k6_http_req_sending_p95 |
ms |
リクエストデータの送信時間の 95。 |
k6_http_req_sending_p99 |
ms |
リクエストデータの送信時間の 99。 |
k6_http_req_tls_handshaking_avg |
ms |
TLS ハンドシェイク時間の平均値。 |
k6_http_req_tls_handshaking_max |
ms |
TLS ハンドシェイク時間の最大値。 |
k6_http_req_tls_handshaking_p90 |
ms |
TLS ハンドシェイク時間の 90。 |
k6_http_req_tls_handshaking_p95 |
ms |
TLS ハンドシェイク時間の 95。 |
k6_http_req_tls_handshaking_p99 |
ms |
TLS ハンドシェイク時間の 99。 |
k6_http_req_waiting_avg |
ms |
サーバーレスポンスの待機時間の平均値。 |
k6_http_req_waiting_max |
ms |
サーバーレスポンスの待機時間の最大値。 |
k6_http_req_waiting_p90 |
ms |
サーバーレスポンスの待機時間の 90。 |
k6_http_req_waiting_p95 |
ms |
サーバーレスポンスの待機時間の 95。 |
k6_http_req_waiting_p99 |
ms |
サーバーレスポンスの待機時間の 99。 |
k6_http_reqs_total |
requests |
HTTP リクエスト数の累積値。リクエストレートの計算には、このメトリクスの RATE を使用します。 |
k6_iteration_duration_avg |
ms |
シナリオのイテレーション時間の平均値。 |
k6_iteration_duration_max |
ms |
シナリオのイテレーション時間の最大値。 |
k6_iteration_duration_p90 |
ms |
シナリオのイテレーション時間の 90。 |
k6_iteration_duration_p95 |
ms |
シナリオのイテレーション時間の 95。 |
k6_iteration_duration_p99 |
ms |
シナリオのイテレーション時間の 99。 |
k6_iterations_total |
iterations |
シナリオのイテレーション回数の累積値。 |
k6_vus |
VUs |
現在の VU 数。 |
k6_vus_max |
VUs |
テスト中の最大 VU 数。 |
すべての HTTP メトリクスには、scenario、testid、benchmark_id などのタグが含まれます。リクエストレベルのメトリクスには、method、url、name、status、error、expected_response が含まれる場合もあります。異なる負荷テストのデータが集約されないように、クエリでは少なくとも benchmark_id と testid で絞り込んでください。
K6_PROMETHEUS_RW_TREND_STATS に設定されていないパーセンタイルメトリクスは書き込まれません。P90、P95、P99 が必要な場合は、K6 を起動する前に明示的に設定してください。例:K6_PROMETHEUS_RW_TREND_STATS="p(90),p(95),p(99),min,max"。