跳到主要内容

重标记配置

在 Prometheus 中,重标记(Relabeling) 是一种强大的功能,允许你在抓取指标时动态地修改或过滤目标(targets)和标签(labels)。通过重标记,你可以灵活地控制哪些指标被收集、如何命名它们,以及如何为它们添加或删除标签。这对于管理复杂的监控环境非常有用。

什么是重标记?

重标记是 Prometheus 在抓取指标之前或之后对目标或标签进行处理的过程。它允许你通过配置规则来修改或过滤目标、标签或指标名称。重标记通常用于以下场景:

  1. 动态添加或删除标签:例如,根据目标的某些属性自动添加环境标签(如 env=production)。
  2. 过滤目标:例如,只抓取特定区域或特定类型的服务。
  3. 修改指标名称:例如,将指标名称统一为某种格式。

重标记的工作原理

Prometheus 的重标记配置是通过 relabel_configs 字段实现的。你可以在以下配置中使用它:

  • 抓取配置(scrape_configs):用于修改或过滤抓取目标。
  • 服务发现(service discovery):用于动态生成目标时修改目标属性。

重标记规则由一系列步骤组成,每个步骤都会对目标或标签进行处理。每个步骤可以执行以下操作:

  • 添加、修改或删除标签。
  • 根据条件过滤目标。
  • 修改指标名称。

重标记配置语法

重标记配置由一组规则组成,每个规则包含以下字段:

  • source_labels: 指定要操作的标签列表。
  • separator: 用于连接 source_labels 的字符串(默认为 ;)。
  • regex: 用于匹配 source_labels 的正则表达式。
  • target_label: 指定要修改的目标标签。
  • replacement: 替换字符串,用于生成新的标签值。
  • action: 指定要执行的操作(如 replacekeepdrop 等)。

示例 1:动态添加标签

假设你有一组目标,它们的 __meta_kubernetes_pod_name 标签包含 Pod 名称。你可以通过重标记为这些目标添加一个 pod_name 标签:

yaml
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod_name

输入

  • 原始标签:__meta_kubernetes_pod_name=my-pod-123

输出

  • 新标签:pod_name=my-pod-123

示例 2:过滤目标

如果你只想抓取特定命名空间(如 production)中的 Pod,可以使用以下配置:

yaml
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
regex: production
action: keep

输入

  • 原始标签:__meta_kubernetes_namespace=production

输出

  • 目标被保留。

如果命名空间不是 production,目标将被过滤掉。

示例 3:修改指标名称

假设你想将指标名称中的前缀 http_ 替换为 api_,可以使用以下配置:

yaml
scrape_configs:
- job_name: 'http-metrics'
relabel_configs:
- source_labels: [__name__]
regex: http_(.*)
target_label: __name__
replacement: api_$1

输入

  • 原始指标名称:http_requests_total

输出

  • 新指标名称:api_requests_total

实际应用场景

场景 1:为不同环境添加标签

假设你有多个 Kubernetes 集群,分别用于开发、测试和生产环境。你可以通过重标记为每个目标添加 env 标签,以便在 Grafana 中区分不同环境的指标:

yaml
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
regex: (.*)
target_label: env
replacement: $1

结果

  • 如果命名空间是 production,则添加 env=production 标签。
  • 如果命名空间是 development,则添加 env=development 标签。

场景 2:过滤掉不需要的目标

假设你有一些测试环境的 Pod,你不想抓取它们的指标。你可以通过重标记过滤掉这些目标:

yaml
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
regex: test
action: drop

结果

  • 所有命名空间为 test 的目标将被过滤掉。

总结

重标记是 Prometheus 中一个非常强大的功能,它允许你动态地修改和过滤目标与标签。通过合理使用重标记,你可以更好地管理监控数据,确保只收集你关心的指标,并为它们添加有用的上下文信息。

提示

在实际使用中,建议结合 Prometheus 的日志功能(如 log_level: debug)来调试重标记规则,确保它们按预期工作。

附加资源

练习

  1. 为你的 Prometheus 配置添加一个重标记规则,将所有 __meta_kubernetes_pod_name 标签的值复制到 pod_name 标签。
  2. 尝试过滤掉命名空间为 kube-system 的所有目标。
  3. 修改一个指标名称,将其前缀从 node_ 替换为 host_

通过完成这些练习,你将更好地掌握重标记的使用方法!