在 Amazon ECS Fargate 上抓取 Redis Prometheus 指标的教程 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Amazon ECS Fargate 上抓取 Redis Prometheus 指标的教程

本教程提供实践介绍,关于如何在 Amazon ECS Fargate 集群中抓取示例 Redis 应用程序的 Prometheus 指标。Redis Prometheus 导出器目标将由 CloudWatch 代理自动发现,并根据容器的 docker 标签提供 Prometheus 指标支持。

Redis (https://redis.io/) 是一个开源(获得 BSD 许可)的内存数据结构存储,用作数据库、缓存和消息代理。有关更多信息,请参阅 redis

redis_exporter(MIT 许可证)用于在指定端口(默认值:0.0.0.0:9121)上公开 Redis prometheus 指标。有关更多信息,请参阅 redis_exporter

本教程使用了以下两个 Docker Hub 存储库中的 Docker 镜像:

先决条件

要从 Amazon ECS 的示例 Prometheus 工作负载收集指标,您必须在集群中运行 Container Insights。有关安装 Container Insights 的信息,请参阅 在 Amazon ECS 上设置 Container Insights

设置 Amazon ECS Fargate 集群环境变量

设置 Amazon ECS Fargate 集群环境变量
  1. 请安装 Amazon ECS CLI(如果尚未安装)。有关更多信息,请参阅安装 Amazon ECS CLI

  2. 设置新的 Amazon ECS 集群名称和区域。例如:

    ECS_CLUSTER_NAME=ecs-fargate-redis-tutorial AWS_DEFAULT_REGION=ca-central-1
  3. (可选)如果您还没有要在其中安装示例 Redis 工作负载和 CloudWatch 代理的 Amazon ECS Fargate 集群,您可以通过输入以下命令来创建一个。

    ecs-cli up --capability-iam \ --cluster $ECS_CLUSTER_NAME \ --launch-type FARGATE \ --region $AWS_DEFAULT_REGION

    此命令的预期结果如下所示:

    INFO[0000] Created cluster cluster=ecs-fargate-redis-tutorial region=ca-central-1 INFO[0001] Waiting for your cluster resources to be created... INFO[0001] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS VPC created: vpc-xxxxxxxxxxxxxxxxx Subnet created: subnet-xxxxxxxxxxxxxxxxx Subnet created: subnet-xxxxxxxxxxxxxxxxx Cluster creation succeeded.

为 Amazon ECS Fargate 集群设置网络环境变量

为 Amazon ECS Fargate 集群设置网络环境变量
  1. 设置 Amazon ECS 集群的 VPC 和子网 ID。如果您在上一步骤中创建了新集群,您将在最终命令的结果中看到这些值。否则,请使用要与 Redis 一起使用的现有集群的 ID。

    ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
  2. 在本教程中,我们将在 Amazon ECS 集群的 VPC 的默认安全组中安装 Redis 应用程序和 CloudWatch 代理。默认安全组允许同一安全组内的所有网络连接,因此 CloudWatch 代理可以抓取 Redis 容器上公开的 Prometheus 指标。在实际生产环境中,您可能希望为 Redis 应用程序和 CloudWatch 代理创建专用安全组并为其设置自定义权限。

    要获取默认安全组 ID,请输入以下命令。

    aws ec2 describe-security-groups \ --filters Name=vpc-id,Values=$ECS_CLUSTER_VPC \ --region $AWS_DEFAULT_REGION

    然后通过输入以下命令设置 Fargate 集群默认安全组变量,将 my-default-security-group 替换为您在上一个命令中找到的值。

    ECS_CLUSTER_SECURITY_GROUP=my-default-security-group

安装 Redis 示例工作负载

安装公开 Prometheus 指标的示例 Redis 工作负载
  1. 通过输入以下命令,下载 Redis Amazon CloudFormation 模板。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml
  2. 通过输入以下命令,设置要为 Redis 创建的 IAM 角色名称。

    REDIS_ECS_TASK_ROLE_NAME=redis-prometheus-demo-ecs-task-role-name REDIS_ECS_EXECUTION_ROLE_NAME=redis-prometheus-demo-ecs-execution-role-name
  3. 通过输入以下命令安装 Redis 示例工作负载。

    aws cloudformation create-stack --stack-name Redis-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-fargate-awsvpc \ --template-body file://redis-traffic-sample.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \ ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET_1 \ ParameterKey=TaskRoleName,ParameterValue=$REDIS_ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$REDIS_ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region $AWS_DEFAULT_REGION

Amazon CloudFormation 堆栈创建四种资源:

  • 一个 ECS 任务角色

  • 一个 ECS 任务执行角色

  • 一个 Redis 任务定义

  • 一项 Redis 服务

在 Redis 任务定义中,定义了两个容器:

  • 主容器运行一个简单的 Redis 应用程序并打开端口 6379 以供访问。

  • 另一个容器运行 Redis 导出器进程以在端口 9121 上公开 Prometheus 指标。该容器将由 CloudWatch 代理发现和抓取。定义了以下 docker 标签,以便 CloudWatch 代理可以根据它发现该容器。

    ECS_PROMETHEUS_EXPORTER_PORT: 9121

配置 CloudWatch 代理以抓取 Redis Prometheus 指标

配置 CloudWatch 代理以抓取 Redis Prometheus 指标
  1. 通过输入以下命令,下载 cwagent-ecs-prometheus-metric-for-awsvpc.yaml 的最新版本。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
  2. 使用文本编辑器打开该文件,并在 resource:CWAgentConfigSSMParameter 部分中的 value 密钥后面查找完整的 CloudWatch 代理配置。

    然后,在此处显示的 ecs_service_discovery 部分中,使用基于 ECS_PROMETHEUS_EXPORTER_PORT 的默认设置启用基于 docker_label 的服务发现,这与我们在 Redis ECS 任务定义中定义的 Docker 标签相匹配。因此,我们无需在此部分进行任何更改:

    ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", * "docker_label": { },* ...

    对于 metric_declaration 部分,默认设置不允许任何 Redis 指标。添加以下部分以允许 Redis 指标。请务必遵循现有的缩进模式。

    { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily"]], "metric_selectors": [ "^redis_net_(in|out)put_bytes_total$", "^redis_(expired|evicted)_keys_total$", "^redis_keyspace_(hits|misses)_total$", "^redis_memory_used_bytes$", "^redis_connected_clients$" ] }, { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily","cmd"]], "metric_selectors": [ "^redis_commands_total$" ] }, { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily","db"]], "metric_selectors": [ "^redis_db_keys$" ] },
  3. 如果 Amazon CloudFormation 已在 Amazon ECS 集群中部署 CloudWatch 代理,您可以通过输入以下命令来创建更改集。

    ECS_LAUNCH_TYPE=FARGATE CREATE_IAM_ROLES=True ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1 ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \ --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \ ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \ ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \ ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \ ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region ${AWS_DEFAULT_REGION} \ --change-set-name redis-scraping-support
  4. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  5. 查看新创建的变更集 redis-scraping-support。您会看到一项应用于 CWAgentConfigSSMParameter 资源的更改。通过输入以下命令执行变更集并重新启动 CloudWatch 代理任务。

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \ --region ${AWS_DEFAULT_REGION}
  6. 等待大约 10 秒,然后输入以下命令。

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \ --region ${AWS_DEFAULT_REGION}
  7. 如果您是首次为集群安装带有 Prometheus 指标收集功能的 CloudWatch 代理,请输入以下命令:

    ECS_LAUNCH_TYPE=FARGATE CREATE_IAM_ROLES=True ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1 ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \ --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \ ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \ ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \ ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \ ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region ${AWS_DEFAULT_REGION}

查看您的 Redis 指标

本教程会将以下指标发送到 CloudWatch 中的 ECS/ContainerInsights/Prometheus 命名空间。您可以使用 CloudWatch 控制台查看该命名空间中的指标。

指标名称 尺寸

redis_net_input_bytes_total

ClusterName、TaskDefinitionFamily

redis_net_output_bytes_total

ClusterName、TaskDefinitionFamily

redis_expired_keys_total

ClusterName、TaskDefinitionFamily

redis_evicted_keys_total

ClusterName、TaskDefinitionFamily

redis_keyspace_hits_total

ClusterName、TaskDefinitionFamily

redis_keyspace_misses_total

ClusterName、TaskDefinitionFamily

redis_memory_used_bytes

ClusterName、TaskDefinitionFamily

redis_connected_clients

ClusterName、TaskDefinitionFamily

redis_commands_total

ClusterName, TaskDefinitionFamily, cmd

redis_db_keys

ClusterName, TaskDefinitionFamily, db

注意

cmd 维度的值可以是 appendclientcommandconfigdbsizeflushallgetincrinfolatencyslowlog

db 维度的值可以从 db0db15

您还可以为 Redis Prometheus 指标创建 CloudWatch 控制面板。

为 Redis Prometheus 指标创建控制面板
  1. 创建环境变量,替换以下值以匹配部署。

    DASHBOARD_NAME=your_cw_dashboard_name ECS_TASK_DEF_FAMILY=redis-prometheus-demo-$ECS_CLUSTER_NAME-fargate-awsvpc
  2. 输入以下命令以创建控制面板。

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \