AWS Distro for OpenTelemetry (ADOT) Collector の運用
ADOT collector は、CNCF による OpenTelemetry Collector のダウンストリームディストリビューションです。
お客様は ADOT Collector を使用して、オンプレミス、AWS、その他のクラウドプロバイダーなど、さまざまな環境からメトリクスやトレースなどのシグナルを収集できます。
実際の環境で ADOT Collector を大規模に運用するためには、オペレーターは Collector の健全性を監視し、必要に応じてスケールする必要があります。このガイドでは、本番環境で ADOT Collector を運用するために取るべきアクションについて学びます。
デプロイメントアーキテクチャ
要件に応じて、検討すべきデプロイメントオプションがいくつかあります。
- コレクターなし
- エージェント
- ゲートウェイ
これらの概念の詳細については、OpenTelemetry のドキュメントを参照してください。
コレクターなし
このオプションは、コレクターを完全に除外します。ご存知かもしれませんが、OTEL SDK から宛先サービスに直接 API 呼び出しを行い、シグナルを送信することが可能です。 例えば、ADOT Collector のようなプロセス外エージェントにス パンを送信する代わりに、アプリケーションプロセスから直接 AWS X-Ray の PutTraceSegments API を呼び出すことを考えてみてください。
このアプローチに関するガイダンスは AWS 固有の側面がないため、より詳細な情報については、アップストリームのドキュメントのセクションを参照することを強くお勧めします。

エージェント
このアプローチでは、コレクターを分散方式で実行し、シグナルを各送信先に収集します。No Collector オプションとは異なり、ここでは関心を分離し、アプリケーションがリモート API コールにリソースを使用する必要性を切り離し、代わりにローカルでアクセス可能なエージェントと通信します。
基本的に、Amazon EKS 環境では、以下のように コレクターを Kubernetes のサイドカーとして実行します:

上記のアーキテクチャでは、コレクターがアプリケーションコンテナと同じ Pod で実行されているため、localhost からターゲットをスクレイピングすることになり、サービスディスカバリーメカニズムを使用する必要はありません。
同じアーキテクチャはトレースの収集にも適用されます。ここに示すように、OTEL パイプラインを作成するだけです。
メリットとデメリット
-
この設計を支持する 1 つの論点は、ターゲットが localhost のソースに限定されているため、Collector が処理を行うために特別な量のリソース (CPU、メモリ) を割り当てる必要がないことです。
-
このアプローチを使用する際のデメリットは、Collector Pod の設定のバリエーション数が、クラスター上で実行しているアプリケーションの数に比例することです。 つまり、Pod の予想されるワークロードに応じて、CPU、メモリ、その他のリソース割り当てを Pod ごとに個別に管理する必要があります。 これを慎重に行わないと、Collector Pod に対するリソースの過剰割り当てや過少割り当てが発生し、パフォーマンスの低下や、他の Pod が使用できるはずの CPU サイクルとメモリの占有につながる可能性があります。
また、ニーズに応じて Deployments、Daemonset、Statefulset などの他のモデルで Collector をデプロイすることもできます。
Amazon EKS での Daemonset としてのコレクターの実行
コレクターの負荷(メトリクスのスクレイピングと Amazon Managed Service for Prometheus ワークスペースへの送信)を EKS ノード全体に均等に分散させたい場合は、コレクターを Daemonset として実行することができます。

コレクターが自身のホスト/ノードからのみターゲットをスクレイプするように、keep アクションが設定されていることを確認してください。
参考として、以下にサンプルを示します。より詳細な設定についてはこちらをご覧ください。
scrape_configs:
- job_name: kubernetes-apiservers
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: $K8S_NODE_NAME
source_labels: [__meta_kubernetes_endpoint_node_name]
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
同じアーキテクチャはトレースの収集にも使用できます。この場合、コレクターが Prometheus メトリクスをスクレイプするためにエンドポイントにアクセスする代わりに、トレースのスパンはアプリケーション Pod からコレクターに送信されます。
メリットとデメリット
利点
- スケーリングの懸念が最小限
- 高可用性の設定が課題
- 使用される Collector のコピーが多すぎる
- ログのサポートが容易
欠点
- リソース使用の観点から最適ではない
- リソース割り当てが不均衡
Amazon EC2 でのコレクターの実行
EC2 でコレクターを実行する場合、サイドカーアプローチはないため、EC2 インスタンス上でエージェントとしてコレクターを実行することになります。以下のような静的なスクレイプ設定を行うことで、インスタンス内のメトリクスを収集するターゲットを検出できます。
以下の設定は、localhost 上のポート 9090 と 8081 のエンドポイントをスクレイプします。
One Observability Workshop の EC2 に焦点を当てたモジュール で、このトピックについてのハンズオンの詳細な体験ができます。
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090', 'localhost:8081']
Amazon EKS でコレクターを Deployment として実行する
コレクターを Deployment として実行することは、コレクターの高可用性を確保したい場合に特に有用です。 ターゲットの数、スクレイプ可能なメトリクスなどに応じて、コレクタ ーのリソースを適切に調整する必要があります。 これにより、コレクターのリソース不足を防ぎ、シグナル収集の問題を回避できます。
このトピックの詳細については、こちらのガイドをご覧ください。
以下のアーキテクチャは、メトリクスとトレースを収集するために、ワークロードノードとは別のノードにコレクターをデプロイする方法を示しています。

メトリクス収集の高可用性を設定するには、詳細な手順を提供するドキュメントをご覧ください
Amazon ECS でメトリクス収集のためにコレクターを中央タスクとして実行する
ECS Observer 拡 張機能 を使用して、ECS クラスター内または複数のクラスター間で異なるタスクの Prometheus メトリクスを収集できます。

拡張機能のサンプルコレクター設定:
extensions:
ecs_observer:
refresh_interval: 60s # format is https://golang.org/pkg/time/#ParseDuration
cluster_name: 'Cluster-1' # cluster name need manual config
cluster_region: 'us-west-2' # region can be configured directly or use AWS_REGION env var
result_file: '/etc/ecs_sd_targets.yaml' # the directory for file must already exists
services:
- name_pattern: '^retail-.*$'
docker_labels:
- port_label: 'ECS_PROMETHEUS_EXPORTER_PORT'
task_definitions:
- job_name: 'task_def_1'
metrics_path: '/metrics'
metrics_ports:
- 9113
- 9090
arn_pattern: '.*:task-definition/nginx:[0-9]+'
メリットとデメリット
- このモデルの利点は、自身で管理するコレクターと設定が少なくて済むことです。
- クラスターが大規模で、スクレイピング対象が数千に及ぶ場合、負荷がコレクター間で均等に分散されるようにアーキテクチャを慎重に設計する必要があります。高可用性のために同じコレクターのクローンを実行する必要があることも考慮すると、運用上の問題を避けるために慎重な検討が必要です。