EKSではじめるOpenTelemetry Operator
はじめに
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から構成されます。
- Receivers
- テレメトリデータを受信します。
- 様々なプラットフォーム向けの実装が提供されています。
- Processor
- テレメトリデータを加工します。
- 様々なProcessorの実装が提供されています。
- Expoeters
- テレメトリデータをバックエンドプラットフォームへ転送します。
- 様々なプラットフォーム向けの実装が提供されています。
ADOT Operatorとは?
AWS Distro for OpenTelemetry (以下、ADOT))は、OpenTelemetryプロジェクトのディストリビューションです。
ADOT Collector
ADOT Collectorは、EKSを含むAWSコンピューティングプラットフォームと完全な互換性を持っています。
ADOT Collectorを利用することで、ユーザはテレメトリデータをAmazon CloudWatchやAWA X-RayなどのAWSマネージドサービスに送信できます。
ADOT Operator
ADOT Operatorは、OpenTelemetryCollectorと呼ばれるCustom Resourceを利用してADOT Collectorを管理します。
また、Instrumentationsと呼ばれるCustom Resourceを利用することでアプリケーションコードを変更せずにトレースを自動計測することが可能になります。
前述したように、ADOT OperatorはEKSアドオンとして管理することができます。
このADOT Operatorの実態は、opentelemetry-operatorになります。
このopentelemetry-operatorをAWSで利用できるようカスタマイズしたのがADOT Operatorです。
ちなみに、ADOT Operatorを利用せずにADOT Collectorをそのまま管理することも可能です。
ADOT Operatorを使ってみる
実際に、ADOT Operatorを使ってCollectorをデプロイしてみます。
ADOT OperatorのInstall手順についてはこちらをご覧ください。
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を指定することができます。
これらのモードについてこちらをご覧ください。
Receiversには、OTLPを指定しています。
OTLPとは、OpenTelemetry Protocolの略称でテレメトリーデータのエンコーディングと、クライアントとサーバー間のデータ交換に使用されるプロトコルを定義しています。
そして、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形式でデータを送信します。
利用するアプリケーションはこちらの手順に従ってデプロイします。
手順の中にある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
まとめ
今回は、OpenTelemetryに入門すべくADOT Operatorを触ってみました。
今回紹介したCollectorの生成以外にも、Instrumentation Custom Resourceを利用した自動計測などもとても便利なので興味がある方は使ってみて下さい。
参考文献
OpenTelemetryについて
- https://opentelemetry.io/docs/concepts/what-is-opentelemetry/
- https://newrelic.com/jp/blog/best-practices/opentelemetry-concepts
- https://www.splunk.com/ja_jp/data-insider/what-is-opentelemetry.html
ADOTについて
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/deploy-collector.html
- https://aws-otel.github.io/docs/getting-started/operator#step-2-install-adot-collector-as-kubernetes-custom-resource-to-your-eks-cluster
- https://aws-otel.github.io/docs/getting-started/adot-eks-add-on
その他
Discussion