コンテンツにスキップ

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

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

ADOT Collector のデプロイメントパターン

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

ADOT アーキテクチャ

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

ADOT アーキテクチャ

ADOT Collector アーキテクチャにはパイプラインの概念があります。1 つのコレクターに複数のパイプラインを含めることができます。各パイプラインは、メトリクス、トレース、ログの 3 つの種類のテレメトリデータのいずれか 1 つを処理することに専念しています。各種類のテレメトリデータに対して複数のパイプラインを構成できます。この汎用性の高いアーキテクチャにより、1 つのコレクターが、そうでなければクラスタにデプロイする必要があるであろう複数の可観測性エージェントの役割を果たすことができます。これにより、クラスター上の可観測性エージェントのデプロイメントフットプリントが大幅に削減されます。パイプラインを構成するコレクターの主要コンポーネントは、Receiver、Processor、Exporter の 3 つのカテゴリにグループ化されます。Extensions と呼ばれる二次コンポーネントは、パイプラインの一部ではありませんが、コレクターに追加できる機能を提供します。

Info

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

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

ECS タスクレベルでリソース利用メトリクスを収集するには、以下に示すタスク定義を使用して、サイドカーパターンで ADOT Collector をデプロイする必要があります。Collector に使用されるコンテナイメージには、いくつかのパイプライン構成がバンドルされています。要件に基づいてそれらのいずれかを選択し、コンテナ定義の command セクションで構成ファイルパスを指定できます。この値を --config=/etc/ecs/container-insights/otel-task-metrics-config.yaml に設定すると、Collector と同じタスク内の他のコンテナからリソース利用メトリクスとトレースを収集し、それらを Amazon CloudWatch と AWS X-Ray に送信するパイプライン構成が使用されます。具体的には、Collector は Amazon ECS Task Metadata Endpoint からタスクメタデータと docker stats を読み取り、それらからリソース使用メトリクス(CPU、メモリ、ネットワーク、ディスクなど)を生成する AWS ECS Container Metrics Receiver を使用します。

{
    "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"
 }

Info

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

Info

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

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

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

Info

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

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

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

Important

SSM パラメータストアパラメータの名前は、環境変数 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 エージェントをデプロイすることと同等です。

Info

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"
 }