抓取其他 Prometheus 源并导入这些指标 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

抓取其他 Prometheus 源并导入这些指标

具有 Prometheus 监控功能的 CloudWatch 代理需要两种配置来抓取 Prometheus 指标。一个是标准的 Prometheus 配置,如<scrape_config>在 Prometheus 文档中。另一个是 CloudWatch 代理配置文件。

对于 Amazon EKS 集群,配置在prometheus-eks.yaml(对于 EC2 启动类型)或prometheus-eks-fargate.yaml(用于 Fargate 启动类型)作为两个配置映射:

  • name: prometheus-config 部分包含 Prometheus 抓取的设置。

  • 这些区域有:name: prometheus-cwagentconfig部分包含 CloudWatch 代理的配置。您可以使用此部分配置 CloudWatch 收集 Prometheus 指标的方式。例如,您指定要将哪些指标导入 CloudWatch,并定义其维度。

对于在 Amazon EC2 实例上运行的 Kubernetes 集群,配置在prometheus-k8s.yamlYAML 文件作为两个配置映射:

  • name: prometheus-config 部分包含 Prometheus 抓取的设置。

  • 这些区域有:name: prometheus-cwagentconfig部分包含 CloudWatch 代理的配置。

要抓取其他 Prometheus 指标源并将这些指标导入到 CloudWatch 中,您需要修改 Prometheus 抓取配置和 CloudWatch 代理配置,然后使用更新的配置重新部署代理。

VPC 安全组要求

Prometheus 工作负载的安全组的入口规则必须打开 Prometheus 端口到 CloudWatch 代理,以便通过私有 IP 抓取 Prometheus 指标。

CloudWatch 代理的安全组的出口规则必须允许 CloudWatch 代理通过私有 IP 连接到 Prometheus 工作负载的端口。

Prometheus 刮板配置

CloudWatch 代理支持标准的 Prometheus 刮擦配置,如<scrape_config>在 Prometheus 文档中。您可以编辑此部分以更新此文件中已有的配置,并添加其他 Prometheus 抓取目标。默认情况下,示例配置文件包含以下全局配置行:

global: scrape_interval: 1m scrape_timeout: 10s
  • 刮取间隔— 定义抓取目标的频率。

  • 刮取超时— 定义在刮取请求超时之前等待的时间。

您还可以在作业级别为这些设置定义不同的值,以覆盖全局配置。

Prometheus 刮作业

CloudWatch 代理 YAML 文件已配置了一些默认的抓取作业。例如,在中prometheus-eks.yaml时,默认抓取作业将在job_name线条scrape_configs部分。在此文件中,以下默认kubernetes-pod-jmx部分抓取 JMX 导出器指标。

- job_name: 'kubernetes-pod-jmx' sample_limit: 10000 metrics_path: /metrics kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__address__] action: keep regex: '.*:9404$' - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod_name - action: replace source_labels: - __meta_kubernetes_pod_container_name target_label: container_name - action: replace source_labels: - __meta_kubernetes_pod_controller_name target_label: pod_controller_name - action: replace source_labels: - __meta_kubernetes_pod_controller_kind target_label: pod_controller_kind - action: replace source_labels: - __meta_kubernetes_pod_phase target_label: pod_phase

这些默认目标中的每个目标都会被抓取,并使用嵌入式指标格式在日志事件中将指标发送到 CloudWatch。有关更多信息,请参阅摄取h-c基数lOG 和g精力充沛m使用 CloudWatch 进行e已嵌入m电子format

来自亚马逊 EKS 和库贝内特群集的日志事件存储在/aw/集装箱查看/群集名称/Prometheus日 CloudWatch Logs 组。来自 Amazon 云服务器集群的日志事件存储在/aw/EC/集装箱查看/群集名称/Prometheus日志组。

每个抓取作业都包含在此日志组中的不同日志流中。例如,Prometheus 抓取作业kubernetes-pod-appmesh-envoy是为 App Mesh 定义的。来自亚马逊 EKS 和 Kubernetes 集群的所有 App Mesh Prometheus 指标都会发送到名为/aw/集装箱查看/群集名称> 普罗米修斯/库贝尔内特-舱-应用程序-特使/

要添加新的抓取目标,请将新的 job_name 部分添加到 YAML 文件的 scrape_configs 部分,然后重新启动代理。有关此过程的示例,请参阅 有关添加新的 Prometheus 刮取目标的教程:Prometheus API 服务器指标

Prometheus 的云监视代理配置

CloudWatch 代理配置文件具有prometheus位置在下metrics_collected,了解 Prometheus 抓取配置。它包含以下配置选项:

  • 群集名称— 指定要在日志事件中添加为标签的集群名称。此字段为可选项。如果省略它,工程师可以检测到 Amazon EKS 或 Kubernetes 集群名称。

  • log_group_name— 指定抓取的 Prometheus 指标的日志组名称。此字段为可选项。如果省略它,CloudWatch 会使用/aw/集装箱查看/群集名称/Prometheus查看来自亚马逊 EKS 和库贝内特群集的日志。

  • 配置路径— 指定 Prometheus 抓取配置文件路径。如果此字段的值以开头env:将从容器的环境变量中检索 Prometheus 抓取配置文件内容。请勿更改此字段。

  • EC_ 服务发现— 是指定亚马逊云服务器 Prometheus 服务发现配置的部分。有关更多信息,请参阅Amazon 云服务器集群上自动发现的详细指南

    这些区域有:ecs_service_discovery部分可以包含以下字段:

    • sd_frequency是发现 Prometheus 出口商的频率。指定数字和单位后缀。例如,1m每分钟一次或30s每 30 秒一次。有效的单位后缀为nsusmssm, 和h

      此字段为可选项。默认值为 60 秒 (1 分钟)。

    • sd_target_cluster是用于自动发现的目标 Amazon 云服务器集群名称。此字段为可选项。默认值为安装 CloudWatch 代理的亚马逊云服务器集群的名称。

    • sd_cluster_region是目标亚马逊云服务器集群的区域。此字段为可选项。默认值为安装 CloudWatch 代理的亚马逊云服务器集群所在的区域。

    • sd_result_file是 Prometheus 目标结果的 YAML 文件的路径。Prometheus 刮擦配置将引用此文件。

    • docker_label是一个可选部分,您可以使用它为基于码头标签的服务发现指定配置。如果省略此部分,则不使用基于码头标签的发现。此部分可以包含以下字段:

      • sd_port_label是容器的码头标签名称,用于指定 Prometheus 度量的容器端口。默认值为 ECS_PROMETHEUS_EXPORTER_PORT。如果容器没有此码头标签,CloudWatch 代理将跳过它。

      • sd_metrics_path_label是指定 Prometheus 度量路径的容器码头标签名称。默认值为 ECS_PROMETHEUS_METRICS_PATH。如果容器没有此码头标签,则代理将采用默认路径/metrics

      • sd_job_name_label是容器的码头标签名称,用于指定 Prometheus 刮取作业名称。默认值为 job。如果容器没有此码头标签,CloudWatch 代理将使用 Prometheus 刮除配置中的作业名称。

    • task_definition_list是一个可选部分,可用于指定基于任务定义的服务发现的配置。如果省略此部分,则不会使用基于任务定义的发现。此部分可以包含以下字段:

      • sd_task_definition_arn_pattern是用于指定要发现的 Amazon 云服务器任务定义的模式。这是正则表达式。

      • sd_metrics_ports列出了 Prometheus 量度的容器端口。用分号分隔容器端口。

      • sd_container_name_pattern指定亚马逊云服务器任务容器名称。这是正则表达式。

      • sd_metrics_path指定 Prometheus 度量路径。如果省略该参数,代理将采用默认路径/metrics

      • sd_job_name指定 Prometheus 刮取作业名称。如果省略此字段,CloudWatch 代理将使用 Prometheus 抓取配置中的作业名称。

  • 度量声明— 是指定要生成的采用嵌入式指标格式的日志数组的部分。有metric_declaration部分,CloudWatch 代理从中进行导入的每个 Prometheus 源。这些部分各包括以下字段:

    • 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-exporterkube-dns

  • Namespace 的值为 kube-system

  • Prometheus 指标 coredns_dns_request_type_count_total 同时包含 ServiceNamespace 标签。

发送的日志事件包括以下突出显示的部分:

{ "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", ... }

有关添加新的 Prometheus 刮取目标的教程:Prometheus API 服务器指标

默认情况下,Kubernetes API 服务器会在终端节点上公开 Prometheus 指标。Kubernetes API 服务器抓取配置的官方示例可在 Github 上找到。

以下教程演示如何执行以下步骤以开始将 Kubernetes API 服务器指标导入到 CloudWatch 中:

  • 将 Kubernetes API 服务器的 Prometheus 抓取配置添加到 CloudWatch 代理 YAML 文件。

  • 在 CloudWatch 代理 YAML 文件中配置嵌入式指标格式指标定义。

  • (可选)为 Kubernetes API 服务器指标创建 CloudWatch 控制面板。

注意

Kubernetes API 服务器公开计量表、计数器、直方图和摘要指标。在此版本的 Prometheus 指标支持中,CloudWatch 仅导入具有计量表、计数器和摘要类型的指标。

开始在 CloudWatch 中收集 Kubernetes API 服务器 Prometheus 指标的步骤

  1. 下载最新版本的prometheus-eks.yamlprometheus-eks-fargate.yaml,或者prometheus-k8s.yaml文件,方法是输入以下命令之一。

    对于具有 EC2 启动类型的 Amazon EKS 集群,请输入以下命令:

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml

    对于采用 Fargate 启动类型的 Amazon EKS 集群,请输入以下命令:

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml

    对于在 Amazon EC2 实例上运行的 Kubernetes 集群,请输入以下命令:

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
  2. 使用文本编辑器打开文件,找到 prometheus-config 部分,然后在该部分中添加以下部分。然后,保存更改:

    # Scrape config for API servers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints namespaces: names: - default scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: kubernetes;https - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: Service
  3. 当 YAML 文件仍在文本编辑器中处于打开状态时,找到 cwagentconfig.json 部分。添加以下子部分并保存更改。此部分将 API 服务器指标放到 CloudWatch 代理允许列表中。将三种类型的 API 服务器指标添加到允许列表中:

    • etcd 对象计数

    • API 服务器注册控制器指标

    • API 服务器请求指标

    {"source_labels": ["job", "resource"], "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)", "dimensions": [["ClusterName","Service","resource"]], "metric_selectors": [ "^etcd_object_counts$" ] }, {"source_labels": ["job", "name"], "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$", "dimensions": [["ClusterName","Service","name"]], "metric_selectors": [ "^workqueue_depth$", "^workqueue_adds_total$", "^workqueue_retries_total$" ] }, {"source_labels": ["job","code"], "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$", "dimensions": [["ClusterName","Service","code"]], "metric_selectors": [ "^apiserver_request_total$" ] }, {"source_labels": ["job"], "label_matcher": "^kubernetes-apiservers", "dimensions": [["ClusterName","Service"]], "metric_selectors": [ "^apiserver_request_total$" ] },
  4. 如果您已在集群中部署了具有 Prometheus 支持的 CloudWatch 代理,则必须通过输入以下命令将其删除:

    kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
  5. 通过输入以下命令之一,使用更新的配置部署 CloudWatch 代理。对于具有 EC2 启动类型的 Amazon EKS 集群,请输入:

    kubectl apply -f prometheus-eks.yaml

    对于具有 Fargate 启动类型的 Amazon EKS 集群,请输入以下命令。ReplaceMyCluster区域的值来匹配您的部署。

    cat prometheus-eks-fargate.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

    对于 Kubernetes 集群,请输入以下命令。ReplaceMyCluster区域的值来匹配您的部署。

    cat prometheus-k8s.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

完成此操作后,您应该看到名为的新日志流库贝尔内特斯中的/aw/集装箱查看/群集名称/Prometheus日志组。此日志流应使用嵌入式指标格式定义来嵌入日志事件,如下所示:

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"apiserver_request_total" } ], "Dimensions":[ [ "ClusterName", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "ClusterName":"my-cluster-name", "Namespace":"default", "Service":"kubernetes", "Timestamp":"1592267020339", "Version":"0", "apiserver_request_count":0, "apiserver_request_total":0, "code":"0", "component":"apiserver", "contentType":"application/json", "instance":"192.0.2.0:443", "job":"kubernetes-apiservers", "prom_metric_type":"counter", "resource":"pods", "scope":"namespace", "verb":"WATCH", "version":"v1" }

您可以在 CloudWatch 控制台中的集装箱景观/Prometheus命名空间。您还可以选择为 Prometheus Kubernetes API 服务器指标创建 CloudWatch Watch 控制面板。

(可选)为 Kubernetes API 服务器指标创建控制面板

要在控制面板中查看 Kubernetes API 服务器指标,您必须先完成前面几个部分中的步骤,然后才能在 CloudWatch 中开始收集这些指标。

为 Kubernetes API 服务器指标创建控制面板

  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 确保选择了正确的 Amazon 区域。

  3. 在导航窗格中,选择 Dashboards

  4. 选择创建控制面板。输入新控制面板的名称,然后选择创建控制面板

  5. 添加到该控制面板中,选择取消

  6. 依次选择操作编辑控制面板

  7. 下载以下 JSON 文件:Kubernetes API 控制面板源

  8. 使用文本编辑器打开下载的 JSON 文件,然后执行以下更改:

    • 将所有 {{YOUR_CLUSTER_NAME}} 字符串替换为您的集群的确切名称。请勿在文本之前或之后添加空格。

    • 将所有 {{YOUR_REGION}} 字符串替换为在其中收集指标的区域的名称。例如 us-west-2. 请勿在文本之前或之后添加空格。

  9. 复制整个 JSON blob 并将其粘贴到 CloudWatch 控制台的文本框中,替换框中已有的内容。

  10. 选择更新保存控制面板