抓取其他 Prometheus 源并导入这些指标
具有 Prometheus 监控功能的 CloudWatch 代理需要两种配置来抓取 Prometheus 指标。一个用于 Prometheus 文档中 <scrape_config>
对于 Amazon ECS 集群,配置通过 Amazon ECS 任务定义中的密钥与 AWS Systems Manager 的 Parameter Store 集成:
-
密钥
PROMETHEUS_CONFIG_CONTENT
用于 Prometheus 抓取配置。 -
密钥
CW_CONFIG_CONTENT
用于 CloudWatch 代理配置。
要抓取其他 Prometheus 指标源并将这些指标导入 CloudWatch,您需要修改 Prometheus 抓取配置和 CloudWatch 代理配置,然后使用更新的配置重新部署代理。
VPC 安全组要求
Prometheus 工作负载的安全组的入口规则必须向 CloudWatch 代理打开 Prometheus 端口,以便通过私有 IP 抓取 Prometheus 指标。
CloudWatch 代理的安全组的出口规则必须允许 CloudWatch 代理通过私有 IP 连接到 Prometheus 工作负载的端口。
Prometheus 抓取配置
CloudWatch 代理支持标准的 Prometheus 抓取配置,如 Prometheus 文档中的 <scrape_config>
global: scrape_interval: 1m scrape_timeout: 10s
-
scrape_interval – 定义抓取目标的频率。
-
scrape_timeout – 定义抓取请求超时之前的等待时间。
您还可以在作业级别为这些设置定义不同的值,以覆盖全局配置。
Prometheus 抓取任务
CloudWatch 代理 YAML 文件已配置了一些默认的抓取任务。例如,在 Amazon ECS 的 YAML 文件(例如 cwagent-ecs-prometheus-metric-for-bridge-host.yaml
)中,默认抓取任务在 ecs_service_discovery
部分中配置。
"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { }, "task_definition_list": [ { "sd_job_name": "ecs-appmesh-colors", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition\/.*-ColorTeller-(white):[0-9]+", "sd_metrics_path": "/stats/prometheus" }, { "sd_job_name": "ecs-appmesh-gateway", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*-ColorGateway:[0-9]+", "sd_metrics_path": "/stats/prometheus" } ] }
这些默认目标中的每个目标都会被抓取,并使用嵌入式指标格式在日志事件中将指标发送到 CloudWatch。有关更多信息,请参阅 在日志中嵌入指标。
来自 Amazon ECS 集群的日志事件存储在 /aws/ecs/containerinsights/cluster_name
/prometheus 日志组中。
每个抓取作业都包含在此日志组中的不同日志流中。
要添加新的抓取目标,请在 YAML 文件 ecs_service_discovery
部分下的 task_definition_list
部分中添加一个新条目,然后重新启动代理。有关此过程的示例,请参阅 添加新 Prometheus 抓取目标的教程:Prometheus API 服务器指标。
Prometheus 的 CloudWatch 代理配置
CloudWatch 代理配置文件在 metrics_collected
下面有一个 prometheus
部分用于 Prometheus 抓取配置。它包含以下配置选项:
-
cluster_name – 指定要在日志事件中添加为标签的集群名称。该字段是可选的。如果省略此项,代理可以检测 Amazon ECS 集群名称。
-
log_group_name – 指定已抓取 Prometheus 指标的日志组名称。该字段是可选的。如果省略此项,CloudWatch 会将 /aws/ecs/containerinsights/
cluster_name
/prometheus 用于来自 Amazon ECS 集群的日志。 -
prometheus_config_path – 指定 Prometheus 抓取配置文件路径。如果此字段的值以
env:
开头,Prometheus 抓取配置文件内容将从容器的环境变量中检索。请勿更改此字段。 -
ecs_service_discovery – 是指定 Amazon ECS Prometheus 目标自动发现功能配置的部分。支持两种模式来发现 Prometheus 目标:根据容器的 docker 标签的发现或根据 Amazon ECS 任务定义 ARN 正则表达式的发现。您可以同时使用这两种模式,CloudWatch 代理将根据 {private_ip}:{port}/{metrics_path} 对发现的目标进行重复去除。
ecs_service_discovery
部分包含以下字段:-
sd_frequency
是发现 Prometheus 导出器的频率。指定数字和单位后缀。例如,1m
表示每分钟一次或30s
表示每 30 秒一次。有效的单位后缀为ns
、us
、ms
、s
、m
和h
。该字段是可选的。默认值为 60 秒(1 分钟)。
-
sd_target_cluster
是用于自动发现的目标 Amazon ECS 集群名称。该字段是可选的。默认名称为安装 CloudWatch 代理的 Amazon ECS 集群的名称。 -
sd_cluster_region
是目标 Amazon ECS 集群的区域。该字段是可选的。默认区域为安装 CloudWatch 代理的 Amazon ECS 集群的区域。 -
sd_result_file
是 Prometheus 目标结果的 YAML 文件的路径。Prometheus 抓取配置将引用此文件。 -
docker_label
是可选部分,您可以使用它来指定基于 docker 标签的服务发现的配置。如果省略此部分,则不会使用基于 docker 标签的发现。此部分包含以下字段:-
sd_port_label
是容器的 docker 标签名称,用于指定 Prometheus 指标的容器端口。默认值为ECS_PROMETHEUS_EXPORTER_PORT
。如果容器没有此 docker 标签,CloudWatch 代理将跳过它。 -
sd_metrics_path_label
是容器的 docker 标签名称,用于指定 Prometheus 指标路径。默认值为ECS_PROMETHEUS_METRICS_PATH
。如果容器没有此 docker 标签,则代理会采用默认路径/metrics
。 -
sd_job_name_label
是容器的 docker 标签名称,用于指定 Prometheus 抓取任务名称。默认值为job
。如果容器没有此 docker 标签,CloudWatch 代理会使用 Prometheus 抓取配置中的任务名称。
-
-
task_definition_list
是可选部分,可用于指定基于任务定义的服务发现的配置。如果省略此部分,则不会使用基于任务定义的发现。此部分包含以下字段:-
sd_task_definition_arn_pattern
是用于指定要发现的 Amazon ECS 任务定义的模式。这是正则表达式。 -
sd_metrics_ports
列出 Prometheus 指标的 containerPort。用分号分隔 containerPorts。 -
sd_container_name_pattern
指定 Amazon ECS 任务容器名称。这是正则表达式。 -
sd_metrics_path
指定 Prometheus 指标路径。如果省略此项,代理会采用默认路径/metrics
-
sd_job_name
指定 Prometheus 抓取任务名称。如果省略此字段,CloudWatch 代理会使用 Prometheus 抓取配置中的任务名称。
-
-
service_name_list_for_tasks
是可选部分,可用于指定基于服务名称的发现的配置。如果省略此部分,则不会使用基于服务名称的发现。此部分包含以下字段:-
sd_service_name_pattern
是用于指定要在其中发现任务的 Amazon ECS 服务的模式。这是正则表达式。 -
sd_metrics_ports
列出 Prometheus 指标的containerPort
。用分号分隔多个containerPorts
。 -
sd_container_name_pattern
指定 Amazon ECS 任务容器名称。这是正则表达式。 -
sd_metrics_path
指定 Prometheus 指标路径。如果省略此项,代理会采用默认路径/metrics
。 -
sd_job_name
指定 Prometheus 抓取任务名称。如果省略此字段,CloudWatch 代理会使用 Prometheus 抓取配置中的任务名称。
-
-
-
metric_declaration – 是指定要生成的采用嵌入式指标格式的日志数组的部分。默认情况下,CloudWatch 代理从中进行导入的每个 Prometheus 源都有
metric_declaration
部分。这些部分各包括以下字段:-
label_matcher
是一个正则表达式,用于检查source_labels
中列出的标签的值。匹配的指标将启用,以包含在发送到 CloudWatch 的嵌入式指标格式中。如果您在
source_labels
中指定了多个标签,我们建议您不要在label_matcher
的正则表达式中使用^
或$
字符。 -
source_labels
指定由label_matcher
行检查的标签的值。 -
label_separator
指定要在label_matcher
行中使用的分隔符(如果指定了多个source_labels
)。默认为;
。您可以在以下示例中看到label_matcher
行中使用的此默认值。 -
metric_selectors
是一个正则表达式,用于指定要收集并发送到 CloudWatch 的指标。 -
dimensions
是要用作每个选定指标的 CloudWatch 维度的标签列表。
-
请参阅以下 metric_declaration
示例。
"metric_declaration": [ { "source_labels":[ "Service", "Namespace"], "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system$", "dimensions":[ ["Service", "Namespace"] ], "metric_selectors":[ "^coredns_dns_request_type_count_total$" ] } ]
此示例配置嵌入式指标格式部分,以便在满足以下条件时作为日志事件发送:
-
Service
的值包含node-exporter
或kube-dns
。 -
Namespace
的值为kube-system
。 -
Prometheus 指标
coredns_dns_request_type_count_total
同时包含Service
和Namespace
标签。
发送的日志事件包括以下突出显示的部分:
{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"coredns_dns_request_type_count_total" } ], "Dimensions":[ [ "Namespace", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "Namespace":"kube-system", "Service":"kube-dns", "coredns_dns_request_type_count_total":2562, "eks_amazonaws_com_component":"kube-dns", "instance":"192.168.61.254:9153", "job":"kubernetes-service-endpoints", ... }