在 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 上设置 Container Insights。
主题
设置 Amazon ECS Fargate 集群环境变量
设置 Amazon ECS Fargate 集群环境变量
-
请安装 Amazon ECS CLI(如果尚未安装)。有关更多信息,请参阅安装 Amazon ECS CLI。
-
设置新的 Amazon ECS 集群名称和区域。例如:
ECS_CLUSTER_NAME=ecs-fargate-redis-tutorial AWS_DEFAULT_REGION=ca-central-1
-
(可选)如果您还没有要在其中安装示例 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 集群设置网络环境变量
-
设置 Amazon ECS 集群的 VPC 和子网 ID。如果您在上一步骤中创建了新集群,您将在最终命令的结果中看到这些值。否则,请使用要与 Redis 一起使用的现有集群的 ID。
ECS_CLUSTER_VPC=
vpc-xxxxxxxxxxxxxxxxx
ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx
ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
-
在本教程中,我们将在 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 工作负载
-
通过输入以下命令,下载 Redis OSS AWS 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
-
通过输入以下命令,设置要为 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
-
通过输入以下命令安装 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
AWS 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 指标
-
通过输入以下命令,下载
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
-
使用文本编辑器打开该文件,并在
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$" ] },
-
如果 AWS 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 打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
查看新创建的变更集
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}
-
等待大约 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}
-
如果您是首次为集群安装带有 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 控制台查看该命名空间中的指标。
指标名称 | 尺寸 |
---|---|
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
ClusterName、 |
|
|
|
|
注意
cmd 维度的值可以是 append
、client
、command
、config
、dbsize
、flushall
、get
、incr
、info
、latency
或 slowlog
。
db 维度的值可以从 db0
到 db15
。
您还可以为 Redis OSS Prometheus 指标创建 CloudWatch 控制面板。
为 Redis OSS Prometheus 指标创建控制面板
-
创建环境变量,替换以下值以匹配部署。
DASHBOARD_NAME=
your_cw_dashboard_name
ECS_TASK_DEF_FAMILY=redis-prometheus-demo-$ECS_CLUSTER_NAME-fargate-awsvpc -
输入以下命令以创建控制面板。
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" \