本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
上的 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 监控。