View a markdown version of this page

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

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

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

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

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

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

先决条件

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

设置 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 OSS 工作负载和 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 OSS 应用程序和 CloudWatch 代理。默认安全组允许同一安全组内的所有网络连接,因此 CloudWatch 代理可以抓取 Redis OSS 容器上公开的 Prometheus 指标。在实际生产环境中,您可能希望为 Redis OSS 应用程序和 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 OSS 示例工作负载

安装公开 Prometheus 指标的示例 Redis OSS 工作负载
  1. 通过输入以下命令,下载 Redis OSS 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 OSS 创建的 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 OSS 示例工作负载。

    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

CloudFormation 堆栈创建四种资源:

  • 一个 ECS 任务角色

  • 一个 ECS 任务执行角色

  • 一个 Redis OSS 任务定义

  • 一项 Redis OSS 服务

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

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

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

    ECS_PROMETHEUS_EXPORTER_PORT: 9121

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

配置 CloudWatch 代理以抓取 Redis OSS 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 OSS ECS 任务定义中定义的 Docker 标签相匹配。因此,我们无需在此部分进行任何更改:

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

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

    { "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. 如果 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. 通过以下网址打开 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 OSS 指标

本教程会将以下指标发送到 CloudWatch 中的 ECS/ContainerInsights/Prometheus 命名空间。您可以使用 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 维度的值可以是 appendclientcommandconfigdbsizeflushallgetincrinfolatencyslowlog

db 维度的值可以从 db0db15

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

为 Redis OSS 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" \