上的 Prometheus 指标故障排除 Amazon ECS - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

上的 Prometheus 指标故障排除 Amazon ECS

本节提供了有关在 Amazon ECS 集群上对 Prometheus 指标设置进行故障排除的帮助。

我未看到 Prometheus 指标发送到 CloudWatch 日志

Prometheus 指标应作为日志组 /aws/ecs/containerinsights/cluster-name/Prometheus中的日志事件提取。如果未创建日志组或未将 Prometheus 指标发送到日志组,则您需要先检查 CloudWatch 代理是否已成功发现 Prometheus 目标。接下来,检查 CloudWatch 代理的安全组和权限设置。以下步骤将指导您执行调试。

步骤 1:启用CloudWatch代理调试模式

首先,通过将以下粗体行添加到CloudWatch模板文件AWS CloudFormation( 或 )来将 cwagent-ecs-prometheus-metric-for-bridge-host.yaml 代理更改为调试模式cwagent-ecs-prometheus-metric-for-awsvpc.yaml。 然后保存该文件。

cwagentconfig.json: | { "agent": { "debug": true }, "logs": { "metrics_collected": {

针对现有堆栈创建新的AWS CloudFormation更改集。将更改集中的其他参数设置为与现有AWS CloudFormation堆栈中相同的值。以下示例适用于使用 EC2 启动类型和桥接网络模式安装在 CloudWatch 集群中的Amazon ECS代理。

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 任务定义在以下部分中启用日志。这些日志将发送到日志组 CloudWatch/ecs/ecs-cwagent-prometheus 中的 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 服务发现周期的每个指标的含义如下所示:

  • DescribeContainerInstances – 发出的 ECS::DescribeContainerInstances API 调用数。

  • DescribeInstancesRequest 发出的 – API ECS::DescribeInstancesRequest 调用数。

  • DescribeTaskDefinition – 发出的 ECS::DescribeTaskDefinition API 调用的数量。

  • DescribeTasks – 发出的 ECS::DescribeTasks API 调用的数量。

  • ListTasks – 发出的 ECS::ListTasks API 调用的数量。

  • ExporterDiscoveredTargetCount – 在容器中发现并成功导出到目标结果文件的 Prometheus 目标的数量。

  • LRUCache EC2MetaData 从缓存中检索容器实例元数据–的次数。

  • LRUCache TaskDefinition 从缓存中检索 ECS 任务定义元数据–的次数。

  • LRUCache ContainerInstance – 在内存中缓存的唯一容器实例的元数据数量。

  • LRUCache TaskDefinition – 内存中缓存的唯一 ECS 任务定义数。

  • 延迟 – 服务发现周期所需的时间。

检查 的值ExporterDiscoveredTargetCount以查看发现的 Prometheus 目标是否与您的预期匹配。否则,可能的原因如下所示:

  • ECS 服务发现的配置可能与您的应用程序的 设置不匹配。对于基于 docker 标签的服务发现,您的目标容器可能没有在CloudWatch代理中配置必要的 docker 标签来自动发现它们。对于 ECS 任务定义 ARN 基于正则表达式的服务发现CloudWatch,代理中的正则表达式设置可能与您的应用程序的任务定义不匹配。

  • CloudWatch 代理的 ECS 任务角色可能无权检索 ECS 任务的元数据。检查CloudWatch代理是否已被授予以下只读权限:

    • ec2:DescribeInstances

    • ecs:ListTasks

    • ecs:DescribeContainerInstances

    • ecs:DescribeTasks

    • ecs:DescribeTaskDefinition

步骤 3:检查网络连接和 ECS 任务角色策略

如果即使 的值CloudWatch Logs指示已发现 Prometheus 目标, 仍不会向目标Exporter_DiscoveredTargetCount日志组发送日志事件,这可能是由以下原因之一导致的:

  • 代理CloudWatch可能无法连接到 Prometheus 目标端口。检查CloudWatch代理背后的安全组设置。私有 IP 应该允许CloudWatch代理连接到 Prometheus 导出器端口。

  • CloudWatch 代理的 ECS 任务角色可能没有 CloudWatchAgentServerPolicy 托管策略。CloudWatch 代理的 ECS 任务角色需要具有此策略才能将 Prometheus 指标作为日志事件发送。如果您使用示例AWS CloudFormation模板自动创建IAM角色,则同时授予 ECS 任务角色和 ECS 执行角色以最小权限执行 Prometheus 监控。