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

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon ECS Fargate 上抓取 Redis OSS Prometheus 指標的教學課程

本教學課程提供實作簡介,以在 Amazon ECS Fargate 叢集中抓取範例 Redis OSS 應用程式的 Prometheus 指標。CloudWatch 代理程式會根據容器的 Docker 標籤,使用 Prometheus 指標支援來自動探索 Redis OSS Prometheus 匯出工具目標。

Redis OSS (https://redis.io/) 是開放原始碼 (BSD 授權)、記憶體內資料結構存放區,用作資料庫、快取和訊息中介裝置。如需詳細資訊,請參閱 redis

redis_exporter (MIT License license) 用於公開指定連接埠上的 Redis OSS prometheus 指標 (預設值:0.0.0:9121)。如需詳細資訊,請參閱 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 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 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
  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

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 指標
  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區段中, docker_label型服務探索會使用以 為基礎的預設設定啟用ECS_PROMETHEUS_EXPORTER_PORT,這符合我們在 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. 如果您已在 Amazon ECS 叢集中部署 CloudWatch 代理程式 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://https://console.aws.amazon.com/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 OSS 指標

此教學課程會將下列指標傳送至 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 維度的數值可以是:appendclientcommandconfigdbsizeflushallgetincrinfo latencyslowlog

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