コンテンツにスキップ

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_idtestid を設定し、異なる負荷テストのデータが混在しないようにします。

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_USERNAMEK6_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,
  });
}

データの検証

  1. K6 コンソールを確認し、テスト中に HTTP エラーおよび Remote Write 出力エラーが発生していないことを確認します。
  2. Guance でメトリクスクエリを開き、k6 measurement を選択して、benchmark_idtestid で絞り込みます。
  3. テスト中に、総リクエスト数、失敗率、平均所要時間、P95、P99、最大 VU が継続して送信されることを確認します。
  4. リクエストレートは累積リクエスト数から計算し、累積値をそのまま 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 メトリクスには、scenariotestidbenchmark_id などのタグが含まれます。リクエストレベルのメトリクスには、methodurlnamestatuserrorexpected_response が含まれる場合もあります。異なる負荷テストのデータが集約されないように、クエリでは少なくとも benchmark_idtestid で絞り込んでください。

K6_PROMETHEUS_RW_TREND_STATS に設定されていないパーセンタイルメトリクスは書き込まれません。P90、P95、P99 が必要な場合は、K6 を起動する前に明示的に設定してください。例:K6_PROMETHEUS_RW_TREND_STATS="p(90),p(95),p(99),min,max"

参考資料

フィードバック

このページは役に立ちましたか?