重标记配置
在 Prometheus 中,重标记(Relabeling) 是一种强大的功能,允许你在抓取指标时动态地修改或过滤目标(targets)和标签(labels)。通过重标记,你可以灵活地控制哪些指标被收集、如何命名它们,以及如何为它们添加或删除标签。这对于管理复杂的监控环境非常有用。
什么是重标记?
重标记是 Prometheus 在抓取指标之前或之后对目标或标签进行处理的过程。它允许你通过配置规则来修改或过滤目标、标签或指标名称。重标记通常用于以下场景:
- 动态添加或删除标签:例如,根据目标的某些属性自动添加环境标签(如
env=production
)。 - 过滤目标:例如,只抓取特定区域或特定类型的服务。
- 修改指标名称:例如,将指标名称统一为某种格式。
重标记的工作原理
Prometheus 的重标记配置是通过 relabel_configs
字段实现的。你可以在以下配置中使用它:
- 抓取配置(scrape_configs):用于修改或过滤抓取目标。
- 服务发现(service discovery):用于动态生成目标时修改目标属性。
重标记规则由一系列步骤组成,每个步骤都会对目标或标签进行处理。每个步骤可以执行以下操作:
- 添加、修改或删除标签。
- 根据条件过滤目标。
- 修改指标名称。
重标记配置语法
重标记配置由一组规则组成,每个规则包含以下字段:
source_labels
: 指定要操作的标签列表。separator
: 用于连接source_labels
的字符串(默认为;
)。regex
: 用于匹配source_labels
的正则表达式。target_label
: 指定要修改的目标标签。replacement
: 替换字符串,用于生成新的标签值。action
: 指定要执行的操作(如replace
、keep
、drop
等)。
示例 1:动态添加标签
假设你有一组目标,它们的 __meta_kubernetes_pod_name
标签包含 Pod 名称。你可以通过重标记为这些目标添加一个 pod_name
标签:
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,可以使用以下配置:
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_
,可以使用以下配置:
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 中区分不同环境的指标:
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,你不想抓取它们的指标。你可以通过重标记过滤掉这些目标:
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
)来调试重标记规则,确保它们按预期工作。
附加资源
练习
- 为你的 Prometheus 配置添加一个重标记规则,将所有
__meta_kubernetes_pod_name
标签的值复制到pod_name
标签。 - 尝试过滤掉命名空间为
kube-system
的所有目标。 - 修改一个指标名称,将其前缀从
node_
替换为host_
。
通过完成这些练习,你将更好地掌握重标记的使用方法!