🐈

【Datadog】OpenTelemetryを活用したk6のメトリクス収集

2024/12/11に公開

はじめに

Datadog Advent Calendar 2024の11日目を担当させていただきました
https://qiita.com/advent-calendar/2024/datadog

本記事では、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!

https://github.com/grafana/k6/releases/tag/v0.55.0

その代替として、以下の2つの方法が推奨されています

  1. xk6-output-statsd拡張機能を使用する
  2. 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はメトリクスに接頭辞を設定

そのほかにも様々なオプションが用意されております
詳しくは以下を参照してください
https://grafana.com/docs/k6/latest/results-output/real-time/opentelemetry/

実際に試してみる

以下の手順に従って、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_ で始まるメトリクスを検索

トラブルシューティング

  1. Datadog Agentが起動しない場合:

    • docker-compose logs -f datadog-agent を確認してエラーの内容を特定
  2. メトリクスがDatadogに表示されない場合:

    • docker-compose logs -f k6 を確認して gRPC の接続エラーがないか確認
    • Datadog APIキーや DD_SITE の設定を再確認

まとめ

これで、Datadogとk6の統合を通じたOpenTelemetry出力の活用方法が学べました。負荷試験の結果を効率的に可視化・分析する基盤としてぜひお試しください!

Reference

Discussion