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

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

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

本教程提供了实践介绍,以抓取 Amazon ECS Fargate 集群中示例 Redis 应用程序的 Prometheus 指标。根据容器的 Docker 标签,具有 Prometheus 指标支持的CloudWatch代理将自动发现 Redis Prometheus 导出程序目标。

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

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

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

先决条件

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

设置Amazon ECSFargate集群环境变量

设置Amazon ECSFargate集群环境变量

  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 工作负载和Amazon ECS代理的 Fargate CloudWatch 集群,则可以通过输入以下命令创建一个。

    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 ECSFargate集群的网络环境变量

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

  1. 设置集群的 VPC 和子网 Amazon ECS ID。如果您在上一过程中创建了新集群,则会在最终命令的结果中看到这些值。否则,请使用您要用于 Redis 的现有集群IDs的 。

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

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

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

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

    ECS_CLUSTER_SECURITY_GROUP=my-default-security-group

安装示例 Redis 工作负载

安装公开 Prometheus 指标的示例 Redis 工作负载

  1. 输入以下命令以下载 Redis AWS CloudFormation 模板。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/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

AWS 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/master/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
  2. 使用文本编辑器打开 文件,并在 CloudWatch 部分中找到 value 键后面的完整resource:CWAgentConfigSSMParameter代理配置。

    然后,在此处显示的ecs_service_discovery部分中,使用基于 的默认设置启用基于 docker_label的 服务发现ECS_PROMETHEUS_EXPORTER_PORT,这些设置与我们在 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. 如果您已经通过 在CloudWatch集群中部署了 Amazon ECS 代理AWS CloudFormation,则可以通过输入以下命令来创建更改集。

    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. https://console.amazonaws.cn/cloudformation 打开 AWS 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 指标

本教程将以下指标发送到 中的 ContainerInsights 命名空间CloudWatch。您可以使用 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 维度的值可以是append:、clientcommandconfigdbsizeflushallgetincrinfolatency、 或 slowlog

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/master/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" \