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

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

在亚马逊 ECS Fargate 上抓取 Redis Prometheus 指标的教程

本教程将为您提供实践经验,告诉您如何抓取 Amazon ECS Fargate 集群中 Redis 应用程序的 Prometheus 指标。Redis Prometheus 导出器目标将由具有 Prometheus 指标支持的 CloudWatch 代理自动发现,基于容器的码头标签。

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

redis_exporter(MIT 许可证许可)用于在指定端口上公开 Redis 普罗米修斯指标(默认值:0.0.0. 0:9121)。有关更多信息,请参阅 。复制导出器

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

先决条件

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

设置亚马逊云服务器 Fargate 集群环境变量

设置亚马逊云服务器 Fargate 集群环境变量

  1. 如果您尚未安装 Amazon ECS CLI,此时安装。有关更多信息,请参阅 。安装亚马逊云服务器 CLI

  2. 设置新的 Amazon 云服务器集群名称和区域。例如:

    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 云服务器 Fargate 集群设置网络环境变量

为 Amazon 云服务器 Fargate 集群设置网络环境变量

  1. 设置亚马逊云服务器集群的 VPC 和子网 ID。如果您在上一步骤中创建了新集群,则最终命令的结果中将看到这些值。否则,请使用要与 Redis 一起使用的现有集群的 ID。

    ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
  2. 在本教程中,我们将在 Amazon 云服务器集群 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 群集耳聋安全组变量,替换默认值安全组替换为您在上一条命令中找到的值。

    ECS_CLUSTER_SECURITY_GROUP=my-default-security-group

安装 Redis 示例工作负载

安装公开 Prometheus 度量的示例 Redis 工作负载

  1. 下载 RedisAmazon 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

这些区域有:Amazon CloudFormation堆栈创建四种资源:

  • 一个 ECS 任务角色

  • 单个 ECS 任务执行角色

  • 一条 Redis 任务定义

  • Redis 服务

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

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

  • 另一个容器运行 Redis 导出程序进程,以公开端口 9121 上的 Prometheus 指标。这是由 CloudWatch 代理发现和抓取的容器。定义了以下码头标签,以便 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_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 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. 打开 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. 如果您首次安装 CloudWatch 代理,并收集了集群的 Prometheus 指标,请输入以下命令:

    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 指标

本教程会向EC/集装箱视景/普罗米修斯命名 CloudWatch。您可以使用 CloudWatch 控制台查看该命名空间中的指标。

指标名称 Dimensions

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维度可以是:appendclientcommandconfigdbsizeflushallgetincrinfolatency,或者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" \