亚马逊云服务器上的 Prometheus 指标疑难解答 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

亚马逊云服务器上的 Prometheus 指标疑难解答

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

我没有看到 Prometheus 指标发送到 CloudWatch Logs

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

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

首先,CloudWatch 过将以下粗体行添加到您的Amazon CloudFormation模板文件,cwagent-ecs-prometheus-metric-for-bridge-host.yaml或者cwagent-ecs-prometheus-metric-for-awsvpc.yaml。然后保存文件。

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

创建新的Amazon CloudFormation更改集对现有堆栈。将变更集中的其他参数设置为与现有Amazon CloudFormation堆栈。以下示例适用于使用 EC2 启动类型和桥接网络模式安装在 Amazon 云服务器集群中的 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

转至Amazon CloudFormation控制台来查看新的变更集,$NEW_CHANGESET_NAME。应该有一个更改应用于木条配置参数资源的费用。通过输入以下命令执行变更集并重新启动 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: 查看弹性云服务器服务发现日志

CloudWatch 代理的云服务器任务定义默认启用以下部分中的日志。这些日志将发送到日志组中的 CloudWatch Logs/ecs/ecs-cwagent-Prometheus

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获取与云服务器服务发现相关的指标,如以下示例所示。

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

特定云服务器服务发现周期每个指标的含义如下:

  • AWSCLI_ 描述性实例ECS::DescribeContainerInstances已进行 API 调用。

  • AWSCLI_ 描述实例请求ECS::DescribeInstancesRequest已进行 API 调用。

  • AWSCLI_ 描述定义ECS::DescribeTaskDefinition已进行 API 调用。

  • AWSCLI_ 描述询问ECS::DescribeTasks已进行 API 调用。

  • 任务列表任务ECS::ListTasks已进行 API 调用。

  • 出口商发现目标计数― 发现并成功导出到容器内目标结果文件中的 Prometheus 目标数。

  • 获取 EC2 元数据― 从缓存中检索容器实例元数据的次数。

  • Lruache 获取任务定义― 从高速缓存中检索弹性云服务器任务定义元数据的次数。

  • 长度缓存大小 _ 容器实例― 内存中缓存的唯一容器实例元数据的数量。

  • 长度缓存大小 _ 任务定义― 内存中高速缓存的唯一弹性云服务器任务定义数。

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

检查ExporterDiscoveredTargetCount,了解发现的 Prometheus 目标是否符合您的期望。如果没有,可能的原因如下:

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

  • CloudWatch 代理的云服务器任务角色可能没有检索弹性云服务器任务元数据的权限。检查 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 代理的云服务器任务角色可能没有CloudWatchAgentServerPolicy托管策略。CloudWatch 代理的云服务器任务角色需要具有此策略才能将 Prometheus 指标作为日志事件发送。如果您使用了示例Amazon CloudFormation模板自动创建 IAM 角色,弹性云服务器任务角色和弹性云服务器执行角色都被授予执行 Prometheus 监控的最低权限。