👌

EKSではじめるOpenTelemetry Operator

2022/12/19に公開

はじめに

EKSでは多くのアドオンが提供されています。
アドオンを利用することで、インストール、設定および更新に必要となる作業量を削減できます。
今回はその中の1つである、AWS Distro for OpenTelemetry Operatorを使ってみます。

OpenTelemetryとは?

まずは、ざっくりとOpenTelemetryについて説明します。
OpenTelemetryは、テレメトリデータ (ログ、メトリクス、トレースなど)を取り込み、変換、送信するための標準化されたSDK、API、ツールのセットを提供します。
OpenTelemetry登場以前では、テレメトリデータをバックエンドプラットフォーム(Datadog、New Relic、Amazon CloudWatchなど)へ送信するために独自のInstrumentationライブラリを実装していました。
そのため、バックエンドプラットフォームを変更する度にコードを変更し、新しいエージェントをインストールする必要がありました。
OpenTelemetryを利用することでベンダーに依存せずテレメトリデータを扱うことが可能になります。

OpenTelemetryはいくつかのコンポーネントで構成されます。

OpenTelemetry API

アプリケーションコードを計測して、テレメトリデータを生成するために使用します。
プログラミング言語ごとにAPIを用意しています。

OpenTelemetry SDK

OpenTelemetry APIの実装です。
API同様にプログラミング言語ごとにSDKを用意しています。

OpenTelemetry Collector

テレメトリデータを受信、処理し、バックエンドプラットフォームへ送信します。

Collectorは、Receivers、Processor、Exportersから構成されます。

ADOT Operatorとは?

AWS Distro for OpenTelemetry (以下、ADOT))は、OpenTelemetryプロジェクトのディストリビューションです。

https://aws-otel.github.io/docs/introduction

ADOT Collector

ADOT Collectorは、EKSを含むAWSコンピューティングプラットフォームと完全な互換性を持っています。
ADOT Collectorを利用することで、ユーザはテレメトリデータをAmazon CloudWatchやAWA X-RayなどのAWSマネージドサービスに送信できます。
https://github.com/aws-observability/aws-otel-collector

ADOT Operator

ADOT Operatorは、OpenTelemetryCollectorと呼ばれるCustom Resourceを利用してADOT Collectorを管理します。
また、Instrumentationsと呼ばれるCustom Resourceを利用することでアプリケーションコードを変更せずにトレースを自動計測することが可能になります。
前述したように、ADOT OperatorはEKSアドオンとして管理することができます。
このADOT Operatorの実態は、opentelemetry-operatorになります。
https://github.com/open-telemetry/opentelemetry-operator
このopentelemetry-operatorをAWSで利用できるようカスタマイズしたのがADOT Operatorです。

ちなみに、ADOT Operatorを利用せずにADOT Collectorをそのまま管理することも可能です。

ADOT Operatorを使ってみる

実際に、ADOT Operatorを使ってCollectorをデプロイしてみます。

ADOT OperatorのInstall手順についてはこちらをご覧ください。
https://aws-otel.github.io/docs/getting-started/adot-eks-add-on

OpenTelemetryCollectorを定義します。

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: my-collector-xray
spec:
  mode: deployment
  serviceAccount: adot-collector
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318
    processors:

    exporters:
      awsxray:
        region: ap-northeast-1

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: []
          exporters: [awsxray]

modeにはdeploymentを指定しています。
CollectorはDeploymentの他に、SidecarやDaemonset、Statefulsetを指定することができます。

これらのモードについてこちらをご覧ください。
https://aws-otel.github.io/docs/getting-started/operator#step-2-install-adot-collector-as-kubernetes-custom-resource-to-your-eks-cluster

Receiversには、OTLPを指定しています。
OTLPとは、OpenTelemetry Protocolの略称でテレメトリーデータのエンコーディングと、クライアントとサーバー間のデータ交換に使用されるプロトコルを定義しています。
https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md
そして、Exportersにawsxrayを指定しています。
つまり、このCusotm ResourceからはOTLP形式のデータをAWS X-Rayに送信するようなCollectorが生成されます。

上記をデプロイすることでDeploymentやServiceなどがデプロイされます。

> kubectl get deploy my-collector-xray-collector
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
my-collector-xray-collector   1/1     1            1           46m

> kubectl get svc my-collector-xray-collector
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
my-collector-xray-collector   ClusterIP   10.100.93.182   <none>        4317/TCP,4318/TCP   46ms

続いて、上記のCollectorにテレメトリデータを送信します。
ExporterにはOTLP形式でデータを送信します。
利用するアプリケーションはこちらの手順に従ってデプロイします。
https://docs.aws.amazon.com/eks/latest/userguide/sample-app.html
手順の中にあるOTEL_EXPORTER_OTLP_ENDPOINTを上記で作成したServiceのエンドポイントmy-collector-xray-collector:4317に設定して下さい。

実際に取得されたTraceがこちらになります。

このようにOTLP形式のトレースをAWS X-Rayに送信することができました。

また、アプリケーションコードを変更せずにExporterを変更するだけでDatadogなどのOTLP形式に対応したバックエンドアプリケーションにトレースを送信できます。

exporters:
  datadog/api:
    hostname: i-0e123a456a123456a

    host_metadata:
      tags:
        - geo.country:fr

    api:
      key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      site: datadoghq.eu

https://aws-otel.github.io/docs/partners/datadog

まとめ

今回は、OpenTelemetryに入門すべくADOT Operatorを触ってみました。
今回紹介したCollectorの生成以外にも、Instrumentation Custom Resourceを利用した自動計測などもとても便利なので興味がある方は使ってみて下さい。
https://github.com/open-telemetry/opentelemetry-operator#opentelemetry-auto-instrumentation-injection

参考文献

OpenTelemetryについて

ADOTについて

その他

Discussion