OpenTelemetryのバックエンドにElastic APMを利用する


はじめに

以下の投稿でOpenTelemetry+Zipkinの組み合わせを試してみました。

今回はOpenTelemetryのバックエンドをElastic APMとした場合の設定方法を確認してみます。

前回のOpenTelemetry+Zipkinでは以下の構成でした。
Open Telemetry Agentに同梱されているZipkin Exporterを使用して、トレースデータをZipkin Serverへ送信しています。

OpenTelemetry+Elastic APMでは以下の構成になります。OpenTelemetry AgentにElastic Exporterがないので、一旦OpenTelemetry Collectorを経由してElastic APMへ送信しています。

今回の構成での設定は以下のElastic公式サイトを参考にしました。

設定は以下の手順になります。

  1. OpenTelemetry Collectorの構築
  2. OpenTelemetry Agentの設定
  3. APMサーバーの構築

このうち、APMサーバーの構築は以前に投稿した以下の環境を利用しています。

OpenTelemetry Collectorの構築

まず、OpenTelemetry Collectorを構築します。
以下のサイトを参考にして実施していきます。

以下からモジュールをダウンロードします。
今回はJavaアプリケーションはローカルのWindowsから実行しているのでotelcol_windows_amd64.exeをダウンロードしました。

次にCollectorの設定ファイル(config.yaml)を作成します。今回は以下のように設定。

config.yaml
exporters:
  elastic:
    apm_server_url: "http://[APMサーバのIPアドレス]:8200"
    secret_token: "ESS_TOKEN"
receivers:
  otlp:
    protocols:
        grpc:
  otlp/withendpoint:
    protocols:
        grpc:
            endpoint: 127.0.0.1:55680
processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [elastic]

最後に作成した設定ファイルを指定してCollectorを起動します。

>otelcontribcol_windows_amd64.exe --config config.yaml

OpenTelemetry Agentの設定

以下を参考にOpenTelemetry Agentを設定します。

アプリケーションのVM引数には以下のようにCollectorのエンドポイントを設定します。

-javaagent:opentelemetry-javaagent-all.jar -Dota.exporter=otlp  -Dotel.otlp.endpoint=127.0.0.1:55680 

また、サービス名を表示するためOTEL_RESOURCE_ATTRIBUTE環境変数にサービス名を設定しています。
※ただし、これだとサービス名が表示されませんでした。原因不明。
 →OTEL_RESOURCE_ATTRIBUTEではなくOTEL_RESOURCE_ATTRIBUTESが正しいみたい。修正したらサービス名が表示できました。

OTEL_RESOURCE_ATTRIBUTES=service.name=myservice

設定が終わったら、アプリケーションを起動。

Kibanaでトレースを表示

最後にトレースデータをKibanaで表示すると、Agent側がElasticだったときとほぼ同様のトレースが表示されます。