本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS叢集自動探索的詳細指南
Prometheus 提供數十種動態服務探索機制,如 <scrape_config>
啟用 Amazon ECS Prometheus 服務探索時, CloudWatch 代理程式會定期API呼叫 Amazon ECS和 Amazon EC2 前端,以擷取目標ECS叢集中執行中ECS任務的中繼資料。
EC2:DescribeInstances ECS:ListTasks ECS:ListServices ECS:DescribeContainerInstances ECS:DescribeServices ECS:DescribeTasks ECS:DescribeTaskDefinition
CloudWatch 代理程式會使用中繼資料來掃描ECS叢集中的 Prometheus 目標。 CloudWatch 代理程式支援三種服務探索模式:
-
容器 Docker 標籤型服務探索
-
ECS 任務定義ARN規則運算式型服務探索
-
ECS 服務名稱規則運算式型服務探索
所有模式都可搭配使用。 CloudWatch 代理程式會根據下列條件來取消複製探索的目標:{private_ip}:{port}/{metrics_path}
。
所有探索的目標都會寫入 CloudWatch 代理程式容器內sd_result_file
組態欄位指定的結果檔案中。以下是範例結果檔案:
- targets: - 10.6.1.95:32785 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT: "9406" ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port TaskGroup: family:demo-jar-ec2-bridge-dynamic-port TaskRevision: "7" VpcId: vpc-01234567890 container_name: demo-jar-ec2-bridge-dynamic-port job: demo-jar-ec2-bridge-dynamic - targets: - 10.6.3.193:9404 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404" ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port TaskGroup: family:demo-jar-tomcat-bridge-mapped-port TaskRevision: "12" VpcId: vpc-01234567890 container_name: demo-tomcat-ec2-bridge-mapped-port job: demo-tomcat-ec2-bridge-mapped-port
您可以將此結果檔案與 Prometheus 檔案型服務探索直接整合。如需 Prometheus 檔案型服務探索的詳細資訊,請參閱 <file_sd_config>
假設結果檔案寫入 /tmp/cwagent_ecs_auto_sd.yaml
。下列 Prometheus 湊集組態將會使用它。
global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: cwagent-ecs-file-sd-config sample_limit: 10000 file_sd_configs: - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]
CloudWatch 客服人員也會為探索的目標新增下列其他標籤。
-
container_name
-
TaskDefinitionFamily
-
TaskRevision
-
TaskGroup
-
StartedBy
-
LaunchType
-
job
-
__metrics_path__
-
Docker 標籤
當叢集具有EC2啟動類型時,會新增下列三個標籤。
-
InstanceType
-
VpcId
-
SubnetId
注意
不符合規則表達式的 Docker 標籤 [a-zA-Z_][a-zA-Z0-9_]*
會被篩選掉。這與 Prometheus 文件中的組態檔案label_name
列出的 Prometheus 慣例相符。
ECS 服務探索組態範例
本節包含示範ECS服務探索的範例。
範例 1
"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { } }
此範例會啟用 Docker 標籤型服務探索。 CloudWatch 客服人員每分鐘會查詢ECS任務的中繼資料一次,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml
檔案中。
docker_label
區段中的 sd_port_label
的預設值為 ECS_PROMETHEUS_EXPORTER_PORT
。如果ECS任務中任何執行中的容器具有 ECS_PROMETHEUS_EXPORTER_PORT
Docker 標籤,代理 CloudWatch 程式會使用其值container port
來掃描容器的所有公開連接埠。如果有相符項目,則會使用映射的主機連接埠加上容器的私有 IP,以下列格式建構 Prometheus 匯出工具目標:private_ip:host_port
。
docker_label
區段中的 sd_metrics_path_label
的預設值為 ECS_PROMETHEUS_METRICS_PATH
。如果容器具有此 Docker 標籤,則其值將被用作 __metrics_path__
。如果容器沒有此標籤,則會使用預設值 /metrics
。
docker_label
區段中的 sd_job_name_label
的預設值為 job
。如果容器具有此 Docker 標籤,其值會附加為目標的其中一個標籤,以取代 Prometheus 組態中指定的預設任務名稱。此 docker 標籤的值會用作 CloudWatch Logs 日誌群組中的日誌串流名稱。
範例 2
"ecs_service_discovery": { "sd_frequency": "15s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A", "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME" } }
此範例會啟用 Docker 標籤型服務探索。THe CloudWatch 代理程式會每 15 秒查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 代理程式容器內的/tmp/cwagent_ecs_auto_sd.yaml
檔案中。將掃描帶有 Docker 標籤的容器 ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A
。Docker 標籤的值 ECS_PROMETHEUS_JOB_NAME
可用作任務名稱。
範例 3
"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "task_definition_list": [ { "sd_job_name": "java-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9404; 9406", "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+" }, { "sd_job_name": "envoy-prometheus", "sd_metrics_path": "/stats/prometheus", "sd_container_name_pattern": "^envoy$", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23" } ] }
此範例會啟用ECS任務定義ARN規則表達式型服務探索。 CloudWatch 客服人員將每五分鐘查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml
檔案中。
定義了兩個任務定義ARN規則過期區段:
-
在第一個區段中,ARN會篩選ECS任務定義
javajmx
中包含 ECS 的任務,以進行容器連接埠掃描。如果這些ECS任務中的容器在 9404 或 9406 上公開容器連接埠,則對應的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path
的值會將__metrics_path__
設定為/metrics
。因此, CloudWatch 代理程式將從 抓取 Prometheus 指標private_ip:host_port/metrics
,抓取指標會傳送至java-prometheus
日誌群組 中 CloudWatch 日誌串流中的日誌串流/aws/ecs/containerinsights/cluster_name/prometheus
。 -
對於第二個區段,
:23
會在其ECS任務定義appmesh
中篩選使用 ECS的任務ARN,並在使用version
時篩選容器連接埠掃描的任務。對於名稱為envoy
且在9901
上公開容器連接埠的容器,則會使用映射的主機連接埠以及容器的私有 IP 來建立 Prometheus 匯出工具目標。這些ECS任務中的值會公開 9404 或 9406 上的容器連接埠,映射的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path
的值會將__metrics_path__
設定為/stats/prometheus
。因此, CloudWatch代理程式將從 抓取 Prometheus 指標private_ip:host_port/stats/prometheus
,並將抓取指標傳送至envoy-prometheus
日誌群組 中 CloudWatch 日誌串流中的日誌串流/aws/ecs/containerinsights/cluster_name/prometheus
。
範例 4
"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "service_name_list_for_tasks": [ { "sd_job_name": "nginx-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-.*" }, { "sd_job_name": "haproxy-prometheus", "sd_metrics_path": "/stats/metrics", "sd_container_name_pattern": "^haproxy$", "sd_metrics_ports": "8404", "sd_service_name_pattern": ".*haproxy-service.*" } ] }
此範例會啟用ECS服務名稱規則表達式型服務探索。 CloudWatch 客服人員將每五分鐘查詢ECS一次服務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml
檔案中。
定義了兩個服務名稱規則表達式區段:
-
在第一個區段中,會針對容器連接埠掃描
^nginx-.*
篩選與名稱符合規則表達式之ECS服務相關聯的ECS任務。如果這些ECS任務中的容器在 9113 上公開容器連接埠,映射的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path
的值會將__metrics_path__
設定為/metrics
。因此, CloudWatch 代理程式將從 抓取 Prometheus 指標private_ip:host_port/metrics
,而抓取指標會傳送至nginx-prometheus
日誌群組 中 CloudWatch 日誌串流。/aws/ecs/containerinsights/cluster_name/prometheus
-
或第二個區段,
.*haproxy-service.*
會針對容器連接埠掃描篩選與名稱符合規則表達式之ECS服務相關聯的ECS任務。對於名稱為haproxy
且在 8404 上公開容器連接埠的容器,則會使用映射的主機連接埠以及容器的私有 IP 來建立 Prometheus 匯出工具目標。sd_metrics_path
的值會將__metrics_path__
設定為/stats/metrics
。因此, CloudWatch 代理程式將從 中抓取 Prometheus 指標private_ip:host_port/stats/metrics
,而抓取的指標會傳送至haproxy-prometheus
日誌群組 中 CloudWatch 日誌串流。/aws/ecs/containerinsights/cluster_name/prometheus
範例 5
"ecs_service_discovery": { "sd_frequency": "1m30s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL", "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL", "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL" } "task_definition_list": [ { "sd_metrics_ports": "9150", "sd_task_definition_arn_pattern": "*memcached.*" } ] }
此範例會啟用兩種ECS服務探索模式。 CloudWatch 客服人員每 90 秒會查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml
檔案中。
若為 Docker 型服務探索組態:
-
具有 docker 標籤ECS的任務
MY_PROMETHEUS_EXPORTER_PORT_LABEL
會篩選 Prometheus 連接埠掃描。目標 Prometheus 容器連接埠由標籤MY_PROMETHEUS_EXPORTER_PORT_LABEL
的值指定。 -
Docker 標籤的值
MY_PROMETHEUS_EXPORTER_PORT_LABEL
可用於__metrics_path__
。如果容器沒有此 Docker 標籤,則會使用預設值/metrics
。 -
Docker 標籤的值
MY_PROMETHEUS_EXPORTER_PORT_LABEL
可用作任務名稱。如果容器沒有此 Docker 標籤,則會使用 Prometheus 組態中定義的任務名稱。
針對ECS任務定義,以表達式為基礎的ARN一般服務探索組態:
-
ARN 會篩選ECS任務定義
memcached
中具有 ECS的任務,以進行容器連接埠掃描。目標 Prometheus 容器連接埠由sd_metrics_ports
定義為 9150。使用預設指標路徑/metrics
。使用 Prometheus 組態中定義的任務名稱。