エクスポーター

OpenTelemetryコレクターにテレメトリーを送信し、正しくエクスポートされることを確認してください。 本番環境でコレクターを使用することはベストプラクティスです。 テレメトリーを可視化するために、JaegerZipkinPrometheus、またはベンダー固有のようなバックエンドにエクスポートしてください。

使用可能なエクスポーター

レジストリには、Erlang/Elixir 用のエクスポーターのリストが含まれています。

エクスポーターの中でも、OpenTelemetry Protocol (OTLP)エクスポーターは、OpenTelemetryのデータモデルを考慮して設計されており、OTelデータを情報の損失なく出力します。 さらに、多くのテレメトリーデータを扱うツールがOTLPに対応しており(たとえば、PrometheusJaegerやほとんどのベンダー)、必要なときに高い柔軟性を提供します。 OTLPについて詳細に学習したい場合は、OTLP仕様を参照してください。

このページでは、主要なOpenTelemetry Erlang/Elixir エクスポーターとその設定方法について説明します。

OpenTelemetry Collector へのエクスポート

Collector はテレメトリーデータを受信、処理、エクスポートするためのベンダー非依存の手段を提供します。 opentelemetry_exporter パッケージは、HTTP(デフォルト)と gRPC の両方を使用した Collector へのエクスポートをサポートしています。 Collector はスパンを Zipkin や Jaeger などのセルフホストサービスや、商用サービスにエクスポートできます。 利用可能なエクスポーターの一覧は、レジストリを参照してください。

Collector のセットアップ

テスト目的であれば、以下の Collector 設定をプロジェクトのルートに配置して利用できます。

# otel-collector-config.yaml

# OTLP を受信して Jaeger にエクスポートする OpenTelemetry Collector の設定
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: '0.0.0.0:4317'
      http:
        endpoint: '0.0.0.0:4318'
exporters:
  debug:
  otlp/jaeger:
    endpoint: jaeger-all-in-one:4317
    tls:
      insecure: true
    sending_queue:
      batch:
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug, otlp/jaeger]

より詳細な例として、opentelemetry-erlang がテストに使用している設定ファイルを確認できます。

このチュートリアルでは、アプリと並行して Collector を Docker イメージとして起動します。 このチュートリアルでは、はじめにガイドの Dice Roll のサンプルを引き続き使用します。

以下の docker-compose ファイルをアプリのルートに追加してください。

# docker-compose.yml
version: '3'
services:
  otel:
    image: otel/opentelemetry-collector-contrib:0.98.0
    command: ['--config=/conf/otel-collector-config.yaml']
    ports:
      - 4317:4317
      - 4318:4318
    volumes:
      - ./otel-collector-config.yaml:/conf/otel-collector-config.yaml
    links:
      - jaeger-all-in-one

  jaeger-all-in-one:
    image: jaegertracing/jaeger:latest
    ports:
      - '16686:16686'

この設定は、docker-compose.yml で HTTP と gRPC の両方のレシーバーを持つ Collector を起動し、docker-compose で同時に実行される Zipkin にエクスポートするために使用されます。

実行中の Collector にエクスポートするには、opentelemetry_exporter パッケージを他の opentelemetry 依存関係よりも前にプロジェクトの依存関係に追加する必要があります。

{deps, [{opentelemetry_exporter, "~> 1.8"},
        {opentelemetry_api, "~> 1.4"},
        {opentelemetry, "~> 1.5"}]}.
def deps do
  [
    {:opentelemetry_exporter, "~> 1.8"},
    {:opentelemetry_api, "~> 1.4"},
    {:opentelemetry, "~> 1.5"}
  ]
end

次に、SDK アプリケーションの設定より前に Release の設定に追加し、SDK がエクスポーターを初期化して使用する前にエクスポーターの依存関係が起動されるようにします。

rebar.config での Release 設定と mix の Release タスクの例を示します。

%% rebar.config
{relx, [{release, {my_instrumented_release, "0.1.0"},
         [opentelemetry_exporter,
	      {opentelemetry, temporary},
          my_instrumented_app]},

       ...]}.
# mix.exs
def project do
  [
    releases: [
      my_instrumented_release: [
        applications: [opentelemetry_exporter: :permanent, opentelemetry: :temporary]
      ],

      ...
    ]
  ]
end

最後に、opentelemetryopentelemetry_exporter アプリケーションのランタイム設定を Collector にエクスポートするように設定します。 以下の設定は、何も設定されていない場合に使用されるデフォルト値を示しています。 デフォルトは HTTP プロトコルで、エンドポイントは localhost のポート 4318 です。 注意点:

  • otlp_protocolgrpc を使用する場合、エンドポイントを http://localhost:4317 に変更する必要があります。
  • 上記の docker compose ファイルを使用している場合、localhostotel に置き換える必要があります。
%% config/sys.config.src
[
 {opentelemetry,
  [{span_processor, batch},
   {traces_exporter, otlp}]},

 {opentelemetry_exporter,
  [{otlp_protocol, http_protobuf},
   {otlp_endpoint, "http://localhost:4318"}]}]}
].
# config/config.exs
config :opentelemetry,
  resource: %{service: %{name: "roll_dice_app"}},
  span_processor: :batch,
  traces_exporter: :otlp

config :opentelemetry_exporter,
  otlp_protocol: :http_protobuf,
  otlp_endpoint: "http://localhost:4318"
  # docker compose ファイルを使用している場合は otlp_endpoint: "http://otel:4318"

一方のターミナルで docker compose up を実行し、別のターミナルで mix phx.server を実行すると、トレースを確認できます。 アプリにいくつかリクエストを送信した後、http://localhost:16686 にアクセスし、Service ドロップダウンから roll_dice_app を選択して、「Find Traces」をクリックしてください。

注意点

一部の環境では、コンテナを root ユーザーとして実行できません。 そのような環境で作業する場合、このチュートリアルで使用する docker-compose.yml ファイルの otel サービスにトップレベルのキーバリューとして user: "1001" を追加できます。