このセクションでは、クラスターの Amazon ECS での Prometheus メトリクス設定のトラブルシューティングに役立つ情報を提供します。
CloudWatch Logs に送信された Prometheus メトリクスが表示されません
Prometheus メトリクスをロググループ /aws/ecs/containerinsights/cluster-name/Prometheus にログイベントとして取り込む必要があります。ロググループが作成されていない場合、または Prometheus メトリクスがロググループに送信されない場合は、Prometheus ターゲットが CloudWatch エージェントによって正常に検出されているかどうかを確認する必要があります。次に、CloudWatch エージェントのセキュリティグループとアクセス許可設定を確認します。次のステップは、デバッグを実行するためのガイドです。
ステップ 1: CloudWatch エージェントのデバッグモードを有効にする
最初に、AWS CloudFormation テンプレートファイル、cwagent-ecs-prometheus-metric-for-bridge-host.yaml
または cwagent-ecs-prometheus-metric-for-awsvpc.yaml
に次の太字行を追加して、CloudWatch エージェントをデバッグモードに変更します。その後、ファイルを保存します。
cwagentconfig.json: | { "agent": { "debug": true }, "logs": { "metrics_collected": {
既存のスタックに対して新しい AWS CloudFormation 変更セットを作成します。変更セットの他のパラメータを、既存の AWS CloudFormation スタックと同じ値に設定します。次の例は、EC2 起動タイプとブリッジネットワークモードを使用して Amazon ECS クラスターにインストールされた CloudWatch エージェントです。
ECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=
your_selected_ecs_task_role_name
ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
NEW_CHANGESET_NAME=your_selected_ecs_execution_role_name
aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \ --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \ ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \ ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region $AWS_REGION \ --change-set-name $NEW_CHANGESET_NAME
AWS CloudFormation コンソールに移動して、新しい変更セット、$NEW_CHANGESET_NAME
を確認します。CWAgentConfigSSMParameter リソースには、1 つの変更が適用されている必要があります。次のコマンドを入力して、変更セットを実行し、CloudWatch エージェントタスクを再起動します。
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service
your_service_name_here
\ --region $AWS_REGION
10 秒ほど待ってから、次のコマンドを入力します。
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service
your_service_name_here
\ --region $AWS_REGION
ステップ 2: ECS サービス検出ログを確認する
CloudWatch エージェントの ECS タスク定義では、以下のセクションのログがデフォルトで有効になります。ログは、ロググループ /ecs/ecs-cwagent-prometheus の CloudWatch Logs に送信されます。
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-create-group: 'True'
awslogs-group: "/ecs/ecs-cwagent-prometheus"
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Sub 'ecs-${ECSLaunchType}-awsvpc'
次の例に示すように、文字列 ECS_SD_Stats
でログをフィルタリングして、ECS サービスの検出に関連するメトリクスを取得します。
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeContainerInstances: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeInstancesRequest: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_ListTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: Exporter_DiscoveredTargetCount: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_EC2MetaData: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_ContainerInstance: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: Latency: 43.399783ms
特定の ECS サービス検出サイクルの各メトリクスの意味は次のとおりです。
-
AWSCLI_DescribeContainerInstances – 実行された
ECS::DescribeContainerInstances
API 呼び出しの数。 -
AWSCLI_DescribeInstancesRequest – 実行された
ECS::DescribeInstancesRequest
API 呼び出しの数。 -
AWSCLI_DescribeTaskDefinition – 実行された
ECS::DescribeTaskDefinition
API 呼び出しの数。 -
AWSCLI_DescribeTasks – 実行された
ECS::DescribeTasks
API 呼び出しの数。 -
AWSCLI_ListTasks – 実行された
ECS::ListTasks
API 呼び出しの数。 -
ExporterDiscoveredTargetCount – 検出され、コンテナ内のターゲット結果ファイルに正常にエクスポートされた Prometheus ターゲットの数。
-
LRUCache_Get_EC2MetaData – コンテナインスタンスのメタデータがキャッシュから取得された回数。
-
LRUCache_Get_TaskDefinition – ECS タスク定義メタデータがキャッシュから取得された回数。
-
LRUCache_Size_ContainerInstance – メモリにキャッシュされた一意のコンテナインスタンスのメタデータの数。
-
LRUCache_Size_TaskDefinition – メモリにキャッシュされた一意の ECS タスク定義の数。
-
レイテンシー – サービス検出サイクルに要する待ち時間。
ExporterDiscoveredTargetCount
の値をチェックして、検出された Prometheus のターゲットが期待と一致しているかどうかを確認します。そうでない場合、考えられる理由は次のとおりです。
-
ECS サービス検出の設定が、アプリケーションの設定と一致していない可能性があります。Docker ラベルベースのサービス検出では、ターゲットコンテナに自動検出するために必要な Docker ラベルが CloudWatch エージェントで構成されていない可能性があります。ECS タスク定義 ARN 正規表現ベースのサービス検出の場合、CloudWatch エージェントの regex 設定がアプリケーションのタスク定義と一致していないことがあります。
-
CloudWatch エージェントの ECS タスクロールに、ECS タスクのメタデータを取得するアクセス許可がない可能性があります。CloudWatch エージェントに次の読み取り専用アクセス許可が付与されていることを確認します。
-
ec2:DescribeInstances
-
ecs:ListTasks
-
ecs:DescribeContainerInstances
-
ecs:DescribeTasks
-
ecs:DescribeTaskDefinition
-
ステップ 3: ネットワーク接続と ECS タスクのロールポリシーを確認する
Exporter_DiscoveredTargetCount
の値が Prometheus ターゲットが検出されたことを示しているにもかかわらず、ターゲット CloudWatch Logs ロググループに送信されるログイベントがない場合は、次のいずれかが原因で発生している可能性があります。
-
CloudWatch エージェントが Prometheus ターゲットポートに接続できない可能性があります。CloudWatch エージェントの背後にあるセキュリティグループ設定を確認します。プライベート IP は、CloudWatch エージェントが Prometheus エクスポーターポートに接続できるようにする必要があります。
-
CloudWatch エージェントの ECS タスクロールに CloudWatchAgentServerPolicy マネージドポリシーがない可能性があります。Prometheus メトリクスをログイベントとして送信できるようにするには、CloudWatch エージェントの ECS タスクロールにこのポリシーが必要です。サンプル AWS CloudFormation テンプレートを使用して IAM ロールを自動的に作成した場合、ECS タスクロールと ECS 実行ロールの両方に、Prometheus モニターリングを実行するための最小権限が付与されます。