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

エージェント
このアプローチでは、コレクターを分散方式で実行し、シグナルを宛先に収集します。 No Collector オプションでは、懸念事項を分離し、リモート API 呼び出しを行うためにリソースを使用する必要性からアプリケーションを切り離し、代わりにローカルにアクセス可能なエージェントと通信します。
基本的に、Amazon EKS 環境では、コレクターを Kubernetes サイドカーとして実行する場合、以下のようになります。

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

次のものがあることを確認してください keep コレクターが自身のホスト/Node からのみターゲットをスクレイピングするようにするアクション。
参考として以下のサンプルを参照してください。このような設定の詳細については、こちらを参照してください。
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
同じアーキテクチャは、トレースの収集にも使用できます。この場合、Collector がエンドポイントに到達して Prometheus メ トリクスをスクレイピングする代わりに、トレーススパンがアプリケーション Pod によって Collector に送信されます。
メリットとデメリット
利点
- スケーリングの懸念が最小限
- 高可用性の設定が課題
- 使用中の Collector のコピーが多すぎる
- ログサポートが容易になる可能性がある
デメリット
- リソース使用率の観点から最適ではない
- 不均衡なリソース割り当て
Amazon EC2 でコレクターを実行する
EC2 で Collector を実行する際にサイドカーアプローチがないため、EC2 インスタンス上でエージェントとして Collector を実行することになります。以下のような静的スクレイプ設定を設定して、インスタンス内のターゲットを検出し、メトリクスをスクレイプできます。
以下の設定は、ポートでエンドポイントをスクレイピングします 9090 および 8081 localhost 上で実行されます。
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]+'