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

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

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

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

Redis OSS (https://redis.io/) 是一個開源(BSD許可),內存中的數據結構存儲,用作數據庫,緩存和消息代理。如需詳細資訊,請參閱 redis

redis_Export (授MIT權授權) 用於在指定的連接埠上公開 Redis OSS 測量結果 (預設值:0.0.0. 0:9121)。如需詳細資訊,請參閱 redis_exporter

本教學課程會使用下列兩個 Docker Hub 儲存庫中的 Docker 影像:

必要條件

若要從 Amazon 的 Prometheus 工作負載範例中收集指標ECS,您必須在叢集中執行容器洞見。如需安裝 Container Insights 的相關資訊,請參閱 在 Amazon 上設置容器洞察 ECS

設定 Amazon ECS Fargate 叢集環境變數

若要設定 Amazon ECS Fargate 叢集環境變數
  1. 安裝 Amazon,ECSCLI如果你還沒有這樣做。如需詳細資訊,請參閱安裝 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的子網路識別碼和子網路識別碼。如果您在先前的程序中建立了新的叢集,您會在最終命令的結果中看到這些值。否則,請使IDs用要與 Redis 搭配使用的現有叢集。

    ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
  2. 在本教程中,我們將在 Amazon ECS 集群的默認安全組中安裝 Redis OSS 應用程序和 CloudWatch代理。VPC預設安全性群組允許相同安全性群組內的所有網路連線,以便 CloudWatch 代理程式可擷取 Redis 容器上公開的 Prometheus 指標。OSS在實際的生產環境中,您可能想要為 Redis 應用程 CloudWatch 式和代理OSS程式建立專用的安全性群組,並為其設定自訂權限。

    輸入以下命令以獲取預設安全群組 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. 下載雷迪斯 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任務定義

  • 一個雷迪斯服務 OSS

在 Redis OSS 工作定義中,會定義兩個容器:

  • 主容器運行一個簡單的 Redis OSS 應用程序,並打開端口 6379 進行訪問。

  • 另一個容器會執行 Redis OSS 匯出程序,以公開連接埠 9121 上的 Prometheus 度量。這是 CloudWatch 代理人要發現和抓取的容器。已定義下列 docker 標籤,以便 CloudWatch 代理程式可以根據該容器探索此容器。

    ECS_PROMETHEUS_EXPORTER_PORT: 9121

設定 CloudWatch 代理程式以抓取 Redis Prometheus 度量 OSS

設定 CloudWatch 代理程式以抓取 Redis Prometheus 度量 OSS
  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. 使用文字編輯器開啟檔案,並在區段中尋找value金鑰後面的完整 CloudWatch 代理程式設resource:CWAgentConfigSSMParameter定。

    然後,在此處顯示的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. 打開 AWS CloudFormation 控制台在 https://console.aws.amazon.com/雲形成。

  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 量度

本教學課程會將下列度量傳送至中的 ECS/ContainerInsights/Promethe us 命名空間。 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 維度的數值可以是: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" \