本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 上的 Prometheus 指標故障診斷
本節提供對 Amazon ECS 叢集上的 Prometheus 指標設定進行故障診斷的說明。
我看不到傳送至 CloudWatch Logs 的 Prometheus 指標
Prometheus 指標應在日誌群組 /aws/ecs/containerinsights/cluster-name/Prometheus 中擷取為日誌事件。如果未建立日誌群組,或者 Prometheus 指標未傳送至日誌群組,您必須先檢查 CloudWatch 代理程式是否已成功搜索到 Prometheus 目標。接下來檢查 CloudWatch 代理程式的安全群組和許可設定。下列步驟會引導您執行偵錯。
步驟 1:啟用 CloudWatch 代理程式偵錯模式
首先,將下列粗體行新增至 AWS CloudFormation 範本檔案 cwagent-ecs-prometheus-metric-for-bridge-host.yaml
或 ,將 CloudWatch 代理程式變更為偵錯模式cwagent-ecs-prometheus-metric-for-awsvpc.yaml
。接著儲存檔案。
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 資源的變更。輸入下列命令,以執行變更集並重新執行 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 任務定義數目。
-
Latency (延遲) – 服務探索週期所需的時間。
檢查 ExporterDiscoveredTargetCount
的數值,查看已搜索到 Prometheus 目標是否符合您的期望。如果沒有,可能的原因如下:
-
ECS 服務探索的組態可能不符合應用程式的設定。對於 Docker 型標籤服務探索,您的目標容器可能沒有在 CloudWatch 代理程式中設定必要的 Docker 標籤來自動發現它們。對於 ECS 任務定義 ARN 規則表達式型服務探索,CloudWatch 代理程式中的 regex 設定可能與應用程式的任務定義不相符。
-
CloudWatch 代理程式的 ECS 任務角色可能沒有擷取 ECS 任務中繼資料的許可。檢查 CloudWatch 代理程式是否已授與下列唯讀許可:
-
ec2:DescribeInstances
-
ecs:ListTasks
-
ecs:DescribeContainerInstances
-
ecs:DescribeTasks
-
ecs:DescribeTaskDefinition
-
步驟 3:檢查網路連線和 ECS 任務角色政策
如果仍然沒有任何日誌事件傳送至目標 CloudWatch Logs 日誌群組,即使 Exporter_DiscoveredTargetCount
的數值表示有已搜索到 Prometheus 目標,而這可能由以下其中一項造成的:
-
CloudWatch 代理程式可能無法連接至 Prometheus 目標連接埠。檢查 CloudWatch 代理程式背後的安全群組設定。私有 IP 應該允許 CloudWatch 代理程式連線至 Prometheus 匯出工具連接埠。
-
CloudWatch 代理程式的 ECS 任務角色可能沒有 CloudWatchAgentServerPolicy 受管政策。CloudWatch 代理程式的 ECS 任務角色必須具備此政策,才能將 Prometheus 指標作為日誌事件進行傳送。如果您使用範例 AWS CloudFormation 範本自動建立 IAM 角色,則會授予 ECS 任務角色和 ECS 執行角色執行 Prometheus 監控的最低權限。