【Datadog】OpenTelemetryを活用したk6のメトリクス収集
はじめに
Datadog Advent Calendar 2024の11日目を担当させていただきました
本記事では、Datadogとk6の統合について解説し、特にOpenTelemetryを活用してk6のメトリクスを収集・可視化する方法に焦点を当てます
StatsDからOpenTelemetryへの移行
k6のバージョン0.47.0以降、組み込みのStatsD出力は非推奨となり、11月にバージョン0.55.0で完全削除されました
StatsD output removed #3849
The StatsD output was deprecated in k6 v0.47.0 and is now removed. You could still output results to StatsD using the community xk6 extension LeonAdato/xk6-output-statsd. Thanks, @LeonAdato for taking over the extension!
その代替として、以下の2つの方法が推奨されています
- xk6-output-statsd拡張機能を使用する
- OpenTelemetry出力を使用する
今回はOpenTelemetryを活用したメトリクス収集を解説します。
OpenTelemetry出力の設定
オプションとして--out experimental-opentelemetry
を使用することでOTEL形式でメトリクスを出力できます
内部的にはk6独自のメトリクスタイプをOTELに対応するメトリクスタイプに変換し、タグをOTEL属性として渡します
また、可能な限り単位もメトリクスと共に渡されます
k6のメトリクス | OpenTelemetryのメトリクス |
---|---|
カウンター (Counter) | Float64CounterOption |
ゲージ (Gauge) | Float64ObservableGauge |
レート (Rate) | 2つの Int64Counter に分割:metric_name.occurred (非ゼロの発生回数をカウント)とmetric_name.total (正と負の発生回数を合計) |
トレンド (Trend) | Float64Histogram |
実行例
K6_OTEL_GRPC_EXPORTER_INSECURE=true K6_OTEL_METRIC_PREFIX=k6_ k6 run --tag test-id=123 -o experimental-opentelemetry examples/script.js
-
K6_OTEL_GRPC_EXPORTER_INSECURE
はgRPCエクスポートのクライアントトランスポートセキュリティを無効化 -
K6_OTEL_METRIC_PREFIX
はメトリクスに接頭辞を設定
そのほかにも様々なオプションが用意されております
詳しくは以下を参照してください
実際に試してみる
以下の手順に従って、Datadog Agentとk6を使用したOpenTelemetry出力の統合を試してみましょう
1. プロジェクトセットアップ
├── docker-compose.yml
├── script.js
2. docker-compose.yml
このファイルは、Datadog Agentとk6コンテナを管理するためのDocker Compose設定ファイルです
services:
datadog-agent:
image: datadog/agent:latest
container_name: datadog-agent
environment:
- DD_API_KEY=<Datadog_API_Key> # DatadogのAPIキーを設定
- DD_SITE=ap1.datadoghq.com # Datadogのサイトを指定 (地域によって異なる)
- DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT=0.0.0.0:4317
- DD_HOSTNAME=k6 # Datadog上で識別できるホスト名
- DD_REMOTE_CONFIGURATION_ENABLED=false
ports:
- "4317:4317" # OpenTelemetry gRPCのポート
healthcheck:
test: ["CMD", "agent", "health"]
interval: 10s
timeout: 5s
retries: 5
k6:
image: grafana/k6:latest
container_name: k6
depends_on:
datadog-agent:
condition: service_healthy
environment:
- K6_OTEL_EXPORTER_TYPE=grpc
- K6_OTEL_GRPC_EXPORTER_ENDPOINT=datadog-agent:4317
- K6_OTEL_SERVICE_NAME=k6_test
- K6_OTEL_METRIC_PREFIX=k6_
- K6_OTEL_GRPC_EXPORTER_INSECURE=true
command: ["run", "--out", "experimental-opentelemetry", "/script.js"]
volumes:
- ./script.js:/script.js # script.jsをk6コンテナにマウント
-
datadog-agent
: Datadogのエージェントコンテナで、k6から送られるメトリクスを受信します -
k6
: 負荷試験を実行するためのコンテナ。Datadog Agentにメトリクスを送信します -
DD_API_KEY
: DatadogのAPIキーを必ず設定してください -
ports
:4317
はOpenTelemetry gRPCの通信に使用します
※ otlpはhttpも使用することができます
Configures the type of exporter to use. Valid options are http and grpc. Default is grpc.
3. script.js
このファイルは、k6で実行する負荷試験のスクリプトです
import http from 'k6/http';
export const options = {
duration: '5m', // テストを5分間続ける
vus: 1, // 仮想ユーザー数を1に設定
iterations: null // durationを優先するため、iterationsを省略
};
export default function () {
const response = http.get('https://test-api.k6.io/public/crocodiles/');
}
-
options
:-
duration
: テストの実行時間を指定 -
vus
: 仮想ユーザー数(同時接続数)を設定
-
-
http.get
: テスト対象API (https://test-api.k6.io/public/crocodiles/
) にGETリクエストを送信します
このシンプルなスクリプトは、最小限の設定で負荷試験の動作を確認するためのものです
4. 必要な環境変数を設定
docker-compose.yml
内で DD_API_KEY
に Datadog の API キーを設定してください。Datadog アカウントがない場合は、Datadogの公式サイトからアカウントを作成して取得できます
5. Dockerコンテナを起動
プロジェクトディレクトリに移動し、以下のコマンドを実行します:
docker-compose up
これにより、Datadog Agent と k6 コンテナが起動します
k6 |
k6 | /\ Grafana /‾‾/
k6 | /\ / \ |\ __ / /
k6 | / \/ \ | |/ / / ‾‾\
k6 | / \ | ( | (‾) |
k6 | / __________ \ |_|\_\ \_____/
k6 |
k6 | execution: local
k6 | script: /script.js
k6 | output: opentelemetry (grpc (insecure), datadog-agent:4317)
k6 |
k6 | scenarios: (100.00%) 1 scenario, 1 max VUs, 5m30s max duration (incl. graceful stop):
k6 | * default: 1 looping VUs for 5m0s (gracefulStop: 30s)
k6 |
- Datadog Agent: OpenTelemetry形式でメトリクスを受信する準備が整います
-
k6: 指定された
script.js
を実行し、Datadog Agent にメトリクスを送信します
6. Datadogコンソールでメトリクスを確認
DatadogのMetrics Explorerで以下の手順を試します:
k6_
プレフィックス: k6_
で始まるメトリクスを検索
トラブルシューティング
-
Datadog Agentが起動しない場合:
-
docker-compose logs -f datadog-agent
を確認してエラーの内容を特定
-
-
メトリクスがDatadogに表示されない場合:
-
docker-compose logs -f k6
を確認して gRPC の接続エラーがないか確認 - Datadog APIキーや
DD_SITE
の設定を再確認
-
まとめ
これで、Datadogとk6の統合を通じたOpenTelemetry出力の活用方法が学べました。負荷試験の結果を効率的に可視化・分析する基盤としてぜひお試しください!
Discussion