メインコンテンツまでスキップ

AWS Distro for OpenTelemetry を使用した ECS クラスターでのシステムメトリクスの収集

AWS Distro for OpenTelemetry (ADOT) は、OpenTelemetry プロジェクトの AWS がサポートするセキュアなディストリビューションです。ADOT を使用することで、複数のソースからテレメトリーデータを収集し、関連付けられたメトリクス、トレース、ログを複数のモニタリングソリューションに送信できます。ADOT は Amazon ECS クラスターに 2 つの異なるパターンでデプロイできます。

ADOT Collector のデプロイパターン

  1. サイドカーパターンでは、ADOT Collector がクラスター内の各タスク内で実行され、そのタスク内のアプリケーションコンテナから収集されたテレメトリデータのみを処理します。このデプロイパターンは、Collector が Amazon ECS Task Metadata Endpoint からタスクメタデータを読み取り、CPU、メモリ、ネットワーク、ディスクなどのリソース使用量メトリクスを生成する必要がある場合にのみ必要です。 ADOT architecture

  2. セントラルコレクターパターンでは、ADOT Collector の単一インスタンスがクラスターにデプロイされ、クラスター上で実行されているすべてのタスクからのテレメトリデータを処理します。これは最も一般的に使用されるデプロイパターンです。Collector は REPLICA または DAEMON サービススケジューラー戦略を使用してデプロイされます。 ADOT architecture

ADOT Collector のアーキテクチャにはパイプラインの概念があります。1 つの Collector に複数のパイプラインを含めることができます。各パイプラインは、メトリクス、トレース、ログという 3 種類のテレメトリデータのいずれかを処理することに専念します。各種類のテレメトリデータに対して複数のパイプラインを設定できます。この汎用性のあるアーキテクチャにより、1 つの Collector が、クラスターに個別にデプロイする必要がある複数のオブザーバビリティエージェントの役割を果たすことができます。これにより、クラスター上のオブザーバビリティエージェントのデプロイメントフットプリントが大幅に削減されます。パイプラインを構成する Collector の主要コンポーネントは、Receivers、Processors、Exporters の 3 つのカテゴリーに分類されます。Extensions と呼ばれる二次的なコンポーネントもあり、これらは Collector に追加できる機能を提供しますが、パイプラインの一部ではありません。

備考

Receivers、Processors、Exporters、Extensions の詳細な説明については、OpenTelemetry のドキュメントを参照してください。

ECS タスクメトリクス収集のための ADOT Collector のデプロイ

ECS タスクレベルでリソース使用率メトリクスを収集するには、以下のようなタスク定義を使用して、サイドカーパターンで ADOT Collector をデプロイする必要があります。 Collector に使用されるコンテナイメージには、複数のパイプライン設定が同梱されています。 要件に応じてそれらの中から 1 つを選択し、コンテナ定義の command セクションで設定ファイルのパスを指定できます。 この値を --config=/etc/ecs/container-insights/otel-task-metrics-config.yaml に設定すると、パイプライン設定 が使用され、Collector と同じタスク内で実行されている他のコンテナからリソース使用率メトリクスとトレースを収集し、Amazon CloudWatch と AWS X-Ray に送信します。 具体的には、Collector は AWS ECS Container Metrics Receiver を使用して、Amazon ECS タスクメタデータエンドポイント からタスクメタデータと Docker の統計情報を読み取り、それらから CPU、メモリ、ネットワーク、ディスクなどのリソース使用率メトリクスを生成します。

{
"family":"AdotTask",
"taskRoleArn":"arn:aws:iam::123456789012:role/ECS-ADOT-Task-Role",
"executionRoleArn":"arn:aws:iam::123456789012:role/ECS-Task-Execution-Role",
"networkMode":"awsvpc",
"containerDefinitions":[
{
"name":"application-container",
"image":"..."
},
{
"name":"aws-otel-collector",
"image":"public.ecr.aws/aws-observability/aws-otel-collector:latest",
"cpu":512,
"memory":1024,
"command": [
"--config=/etc/ecs/container-insights/otel-task-metrics-config.yaml"
],
"portMappings":[
{
"containerPort":2000,
"protocol":"udp"
}
],
"essential":true
}
],
"requiresCompatibilities":[
"EC2"
],
"cpu":"1024",
"memory":"2048"
}
備考

Amazon ECS クラスターにデプロイされた ADOT Collector が使用する IAM タスクロールとタスク実行ロールの設定の詳細については、ドキュメント を参照してください。

備考

AWS ECS Container Metrics Receiver は ECS タスクメタデータエンドポイント V4 でのみ動作します。 プラットフォームバージョン 1.4.0 以降を使用する Fargate 上の Amazon ECS タスク、および Amazon ECS コンテナエージェントのバージョン 1.39.0 以降を実行している Amazon EC2 上の Amazon ECS タスクでこのレシーバーを利用できます。 詳細については、Amazon ECS コンテナエージェントのバージョン を参照してください。

デフォルトの パイプライン設定 に示されているように、Collector のパイプラインはまず Filter Processor を使用して、CPU、メモリ、ネットワーク、ディスク使用率に関する メトリクスのサブセット をフィルタリングします。 次に、Metrics Transform Processor を使用して、一連の 変換 を実行し、これらのメトリクスの名前を変更し、属性を更新します。 最後に、Amazon CloudWatch EMF Exporter を使用してパフォーマンスログイベントとして CloudWatch にメトリクスを送信します。 このデフォルト設定を使用すると、CloudWatch 名前空間 ECS/ContainerInsights で以下のリソース使用率メトリクスが収集されます。

  • MemoryUtilized
  • MemoryReserved
  • CpuUtilized
  • CpuReserved
  • NetworkRxBytes
  • NetworkTxBytes
  • StorageReadBytes
  • StorageWriteBytes
備考

これらは Container Insights for Amazon ECS で収集されるメトリクス と同じであり、クラスターまたはアカウントレベルで Container Insights を有効にすると CloudWatch ですぐに利用できることに注意してください。 したがって、CloudWatch で ECS リソース使用率メトリクスを収集するには、Container Insights を有効にすることが推奨されるアプローチです。

AWS ECS Container Metrics Receiver は、Amazon ECS タスクメタデータエンドポイントから読み取る 52 の固有のメトリクスを出力します。 レシーバーが収集するメトリクスの完全なリストは こちらにドキュメント化 されています。 これらすべてを希望の送信先に送信したくない場合があります。 ECS リソース使用率メトリクスをより明示的に制御したい場合は、カスタムパイプライン設定を作成し、選択したプロセッサー/トランスフォーマーで利用可能なメトリクスをフィルタリングおよび変換し、選択したエクスポーターに基づいて送信先に送信できます。 ECS タスクレベルのメトリクスを取得するためのパイプライン設定の 追加の例 については、ドキュメントを参照してください。

カスタムパイプライン設定を使用する場合は、以下のタスク定義を使用して、サイドカーパターンで Collector をデプロイできます。 ここでは、Collector パイプラインの設定は AWS SSM Parameter Store の otel-collector-config という名前のパラメータから読み込まれます。

注記

SSM Parameter Store のパラメータ名は、AOT_CONFIG_CONTENT という環境変数を使用して Collector に公開する必要があります。

{
"family":"AdotTask",
"taskRoleArn":"arn:aws:iam::123456789012:role/ECS-ADOT-Task-Role",
"executionRoleArn":"arn:aws:iam::123456789012:role/ECS-Task-Execution-Role",
"networkMode":"awsvpc",
"containerDefinitions":[
{
"name":"application-container",
"image":"..."
},
{
"name":"aws-otel-collector",
"image":"public.ecr.aws/aws-observability/aws-otel-collector:latest",
"cpu":512,
"memory":1024,
"secrets":[
{
"name":"AOT_CONFIG_CONTENT",
"valueFrom":"arn:aws:ssm:us-east-1:123456789012:parameter/otel-collector-config"
}
],
"portMappings":[
{
"containerPort":2000,
"protocol":"udp"
}
],
"essential":true
}
],
"requiresCompatibilities":[
"EC2"
],
"cpu":"1024",
"memory":"2048"
}

ECS コンテナインスタンスのメトリクス収集のための ADOT Collector のデプロイ

ECS クラスターから EC2 インスタンスレベルのメトリクスを収集するために、ADOT Collector は以下のようなタスク定義を使用してデプロイできます。デーモンサービススケジューラー戦略を使用してデプロイする必要があります。コンテナイメージにバンドルされているパイプライン設定を選択できます。コンテナ定義の command セクションの設定ファイルパスは --config=/etc/ecs/otel-instance-metrics-config.yaml に設定する必要があります。Collector は AWS Container Insights Receiver を使用して、CPU、メモリ、ディスク、ネットワークなどの多くのリソースの EC2 インスタンスレベルのインフラストラクチャメトリクスを収集します。メトリクスは Amazon CloudWatch EMF Exporter を使用してパフォーマンスログイベントとして CloudWatch に送信されます。この設定での Collector の機能は、EC2 上でホストされている Amazon ECS クラスターに CloudWatch エージェントをデプロイする場合と同等です。

備考

EC2 インスタンスレベルのメトリクスを収集するための ADOT Collector のデプロイは、AWS Fargate 上で実行される ECS クラスターではサポートされていません。

{
"family":"AdotTask",
"taskRoleArn":"arn:aws:iam::123456789012:role/ECS-ADOT-Task-Role",
"executionRoleArn":"arn:aws:iam::123456789012:role/ECS-Task-Execution-Role",
"networkMode":"awsvpc",
"containerDefinitions":[
{
"name":"application-container",
"image":"..."
},
{
"name":"aws-otel-collector",
"image":"public.ecr.aws/aws-observability/aws-otel-collector:latest",
"cpu":512,
"memory":1024,
"command": [
"--config=/etc/ecs/otel-instance-metrics-config.yaml"
],
"portMappings":[
{
"containerPort":2000,
"protocol":"udp"
}
],
"essential":true
}
],
"requiresCompatibilities":[
"EC2"
],
"cpu":"1024",
"memory":"2048"
}