Amazon ECS 集群上的自动发现的详细指南 - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon ECS 集群上的自动发现的详细指南

Prometheus 提供了数十个动态服务发现机制,如<scrape_config>中所述。但是,没有针对 的内置服务发现Amazon ECS。CloudWatch 代理添加此机制。

在启用 Amazon ECS Prometheus 服务发现后CloudWatch,代理会定期对 Amazon ECS 和 Amazon EC2 前端进行以下 API 调用,以检索目标 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

注意

[a-zA-Z_][a-zA-Z0-9_]*筛选掉与正则表达式不匹配的 Docker 标签。这与 Prometheus 文档label_name的配置文件https://prometheus.io/docs/prometheus/latest/configuration/configuration/#labelname中的 中列出的 Prometheus 约定匹配。

ECS 服务发现配置示例

本节包含演示 ECS 服务发现的示例。

示例 1

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

此示例启用基于 docker 标签的服务发现。CloudWatch 代理将每分钟查询一次 ECS 任务的元数据,并将发现的目标写入/tmp/cwagent_ecs_auto_sd.yaml到代理容器内的 CloudWatch 文件中。

sd_port_label docker_label 部分中 的默认值为 ECS_PROMETHEUS_EXPORTER_PORT。如果 ECS 任务中任何正在运行的容器具有 ECS_PROMETHEUS_EXPORTER_PORT Docker 标签CloudWatch,则代理使用其值 container port 来扫描容器的所有公开端口。如果存在匹配项,则使用映射的主机端口以及容器的私有 IP 来构建以下格式的 Prometheus 导出程序目标private_ip:host_port:。

sd_metrics_path_label docker_label 部分中 的默认值为 ECS_PROMETHEUS_METRICS_PATH。如果容器具有此 Docker 标签,则其值将用作 __metrics_path__ 。如果容器没有此标签,/metrics则使用默认值。

sd_job_name_label docker_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 标签的服务发现。THeCloudWatch代理将每 15 秒查询 ECS 任务的元数据,并将发现的目标写入/tmp/cwagent_ecs_auto_sd.yaml到代理容器内的 CloudWatch 文件中。将ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A扫描 Docker 标签为 的容器。docker label 的值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_name_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_name_pattern": ".*:task-definition/.*appmesh.*:23" } ] }

此示例启用 ECS 任务定义 ARN 基于正则表达式的服务发现。CloudWatch 代理将每五分钟查询一次 ECS 任务的元数据,并将发现的目标写入/tmp/cwagent_ecs_auto_sd.yaml到代理容器内的 CloudWatch 文件中。

定义了两个任务定义 ARN 常规扩展部分:

  • 对于第一个部分,将筛选其 ECS 任务定义 ARN javajmx 中具有 的 ECS 任务以进行容器端口扫描。如果这些 ECS 任务中的容器在 9404 或 9460 上公开容器端口,则使用映射的主机端口以及容器的私有 IP 来创建 Prometheus 导出程序目标。的值sd_metrics_path__metrics_path__ 设置为 /metrics。因此CloudWatch,代理将从 抓取 Prometheus 指标private_ip:host_port/metrics,抓取的指标将发送到 java-prometheus 日志组 CloudWatch Logs 中的 日志流/aws/ecs/containerinsights/cluster_name/prometheus

  • 对于第二个部分,对于容器端口扫描appmesh,将筛选 ECS 任务(在 ECS 任务定义 ARN version 中具有 且具有 :23 的 )中的 。对于名称为 envoy 并在 上公开容器端口的容器9901,将使用映射的主机端口以及容器的私有 IP 来创建 Prometheus 导出程序目标。这些 ECS 任务中的 值在 9404 或 9460 上公开容器端口,并且使用映射的主机端口以及容器的私有 IP 来创建 Prometheus 导出程序目标。的值sd_metrics_path__metrics_path__ 设置为 /stats/prometheus。因此CloudWatch,代理将从 抓取 Prometheus 指标private_ip:host_port/stats/prometheus,并将抓取的指标发送到envoy-prometheus日志组 中的 CloudWatch Logs 中的日志流/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 服务的元数据,并将发现的目标写入/tmp/cwagent_ecs_auto_sd.yaml到代理容器内的 CloudWatch 文件中。

定义了两个服务名称常规表达式部分:

  • 对于第一个部分,将^nginx-.*筛选与名称与正则表达式匹配的 ECS 服务关联的 ECS 任务以进行容器端口扫描。如果这些 ECS 任务中的容器在 9113 上公开容器端口,则使用映射的主机端口以及容器的私有 IP 创建 Prometheus 导出程序目标。的值sd_metrics_path__metrics_path__ 设置为 /metrics。因此CloudWatch,代理将从 抓取 Prometheus 指标private_ip:host_port/metrics,并且抓取的指标将发送到nginx-prometheus日志组 CloudWatch Logs 中的 中的日志流/aws/ecs/containerinsights/cluster_name/prometheus

  • 或者第二部分,将.*haproxy-service.*筛选与名称与正则表达式匹配的 ECS 服务关联的 ECS 任务以进行容器端口扫描。对于名为 的容器,在 8404 上haproxy公开容器端口,将使用映射的主机端口以及容器的私有 IP 创建 Prometheus 导出程序目标。的值sd_metrics_path__metrics_path__ 设置为 /stats/metrics。因此CloudWatch,代理将从 抓取 Prometheus 指标private_ip:host_port/stats/metrics,并且抓取的指标将发送到haproxy-prometheus日志组 CloudWatch Logs 中的 中的日志流/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_name_pattern": "*memcached.*" } ] }

此示例启用 ECS 服务发现模式。CloudWatch 代理将每 90 秒查询 ECS 任务的元数据,并将发现的目标写入/tmp/cwagent_ecs_auto_sd.yaml到代理容器内的 CloudWatch 文件中。

对于基于 docker 的服务发现配置:

  • 具有 Docker 标签的 ECS 任务MY_PROMETHEUS_EXPORTER_PORT_LABEL将筛选为 Prometheus 端口扫描。目标 Prometheus 容器端口由标签 的值指定MY_PROMETHEUS_EXPORTER_PORT_LABEL

  • docker label 的值MY_PROMETHEUS_EXPORTER_PORT_LABEL用于 __metrics_path__。如果容器没有此 Docker 标签/metrics,则使用默认值。

  • docker label 的值MY_PROMETHEUS_EXPORTER_PORT_LABEL用作作业标签。如果容器没有此 Docker 标签,则使用 Prometheus 配置中定义的作业名称。

对于 ECS 任务定义 ARN 基于正则表达式的服务发现配置:

  • 在 ECS 任务定义 ARN memcached 中包含 的 ECS 任务将筛选用于容器端口扫描。目标 Prometheus 容器端口为 9150,如 所定义sd_metrics_ports。使用默认指标路径/metrics。将使用 Prometheus 配置中定义的作业名称。