# ucpr.dev

telemetrygenで行うOpenTelemetry Collectorの負荷試験

2024-08-25

ObservabilityOpenTelemetry

はじめに

OpenTelemetry は Observability において広く採用されており、アプリケーションやインフラの監視には欠かせないツールです。OpenTelemetry を導入する際テレメトリデータを収集・処理・転送するために、OpenTelemetry Collector を利用することがあります。

OpenTelemetry Collector を運用していく際には、Collector がどの程度の負荷に耐えられるかを事前に検証しておくことが重要です。本記事では、telemetrygen を利用して OpenTelemetry Collector の負荷試験を簡易的に行う方法について紹介します。

前提

本記事において利用しているツールのバージョンは以下の通りです。

また、利用した設定ファイルは以下のリポジトリに格納しています。

ucpr/tlgen-loadtest-example favicon
ucpr/tlgen-loadtest-example

telemetrygen

telemetrygen は、トレース、メトリクス、ログを生成するクライアントをシミュレートできるツールです。 例えば、以下のようなコマンドを実行することでメトリクスデータを生成することができます。


$ telemetrygen metrics --duration 1s --otlp-insecure

その他のオプションについては、telemetrygen --help で確認することができます。

$ telemetrygen --help

Telemetrygen simulates a client generating traces, metrics, and logs

Usage:
  telemetrygen [command]

Examples:
telemetrygen traces
telemetrygen metrics
telemetrygen logs

Available Commands:
  help        Help about any command
  logs        Simulates a client generating logs. (Stability level: Development)
  metrics     Simulates a client generating metrics. (Stability level: Development)
  traces      Simulates a client generating traces. (Stability level: Alpha)

Flags:
  -h, --help   help for telemetrygen

Use "telemetrygen [command] --help" for more information about a command.

それぞれのサブコマンドには、--duration--rate, --workers などのオプションがあり、これを用いて負荷試験を行います。 また、Attributes などのカスタム属性を追加することも可能なため、実際のアプリケーションに寄せた形で負荷試験を行うこともできます。

検証環境の構築

OpenTelemetry Collector のパイプラインは、以下のように設定しています。

# config.yaml

# ...

service:
  telemetry:
    metrics:
      address: ":8888"
  pipelines:
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [debug]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [debug]
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [debug]

OpenTelemetry Collector とモニタリング用のツールとして Prometheus、Grafana を利用するため、Docker Compose を利用して実行環境を構築します。

# compose.yaml
services:
  otelcol:
    image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.107.0
    ports:
      - "4317:4317"
      - "4318:4318"
      - "8888:8888"
      - "30001:30001"
    volumes:
      - ./config.yaml:/etc/otelcol-contrib/config.yaml
    deploy:
      resources:
        limits:
          cpus: '0.25'
          memory: '256M'
        reservations:
          cpus: '0.1'
          memory: '256M'

  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yaml:/etc/prometheus/prometheus.yaml
    command: "--config.file=/etc/prometheus/prometheus.yaml"
    restart: always

  grafana:
    image: grafana/grafana
    depends_on:
      - prometheus
    volumes:
      - ./dashboards:/var/lib/grafana/dashboards
      - ./dashboard.yaml:/etc/grafana/provisioning/dashboards/dashboard.yaml
      - ./datasource.yaml:/etc/grafana/provisioning/datasources/datasource.yaml
    ports:
      - "3000:3000"
    restart: always

上記の Docker Compose ファイルを利用して、OpenTelemetry Collector、Prometheus、Grafana のコンテナを起動します。


$ docker-compose up

OpenTelemetry Collector の負荷試験

構築した検証環境において、telemetrygen を利用して OpenTelemetry Collector の負荷試験を行います。 ここでは traces を送りつける負荷試験を行う場合を例に進めますが、metrics や logs についても同様の手順で負荷試験を行うことができます。

まずは、OpenTelemetry Collector のリソースを CPU: 0.25, メモリ: 256M に制限した状態で実行してみます。


$ telemetrygen traces --otlp-insecure --duration 10s --rate 500 --workers 10

上記のコマンドを実行することで、10 秒間に 500 spans/sec のトレースデータを 10 worker で送信します。

コマンド実行後にGrafana から OpenTelemetry Collector のメトリクスを確認すると、Trace データを受け取り徐々に Refused と Dropped が増加していることが確認できます。

telemetrygen のログを確認すると、メモリ使用率が高くなりデータが refused されていることがわかりました。


traces export: context deadline exceeded: rpc error: code = Unavailable desc = data refused due to high memory usage

OpenTelemetry Collector の設定で memory_limiter を利用しているため、メモリ使用量が高くなるとデータを拒否するようになっておりそれが原因であると考えられます。 ここに関しては、本来は実行環境のメトリクスも合わせて確認したほうが良いですが、今回は省略しています。

次は、CPU: 1, メモリ: 1G のリソースに制限した OpenTelemetry Collector に対してトレースデータを送信します。

コマンド実行後、Grafana から OpenTelemetry Collector のメトリクスを確認すると、Refused や Dropped が増加せず、正常にデータを受け取っていることが確認できました。

おわりに

本記事では、telemetrygen を利用して OpenTelemetry Collector の負荷試験を行う方法について紹介しました。OpenTelemetry Collector の負荷試験を行う際には、telemetrygen を利用することで簡単に負荷試験を行うことができます。

今回は Attributes の追加などのカスタマイズは行っていませんが、実際のアプリケーションが出力するテレメトリデータに近い形で負荷試験を行うことをおすすめします。

本記事において、異なっている説明や表現がありましたらご連絡ください。

参考