本文将详细介绍 prometheus 中 relabel_configs(重新标记) 和 metric_relabel_configs(指标重新标记)的使用。包括官方对二者的介绍、二者的区别以及使用示例。
官方对 relabel_configs 介绍
重新标记(Relabeling)是一个可以在抓取目标(target)数据之前,动态修改目标的标签集的强大工具。每个抓取(scrape)配置可以定义多个重新标记步骤。它们按照在配置文件中的出现顺序应用于每个目标的标签集。
初始情况下,除了按目标配置的每个标签之外,目标的 job 标签也设置为相应抓取配置 job_name 的值。__address__ 标签被设置为目标的
scrape_interval 和 scrape_timeout 标签被设置为目标的抓取间隔和超时时间。这是实验性的,可能会在将来发生改变。
重新标记阶段可能会提供以 _meta 为前缀的额外标签。这些标签由目标的服务发现机制设置,并且在不同机制之间有所不同。
在目标重新标记完成后,以 __ 开头的标签将从标签集中删除。
如果重新标记步骤需要仅临时存储标签值(作为后续重新标记步骤的输入),请使用 __tmp 标签名称前缀。Prometheus本身永远不会使用这个前缀。
官方对 metric_relabel_configs 介绍
指标重新标记(Metric relabeling)是在摄取(ingestion)之前最后一步对样本(samples)应用的。它具有与目标重标记(relabel_configs)相同的配置格式和操作。指标重标记不适用于自动生成的时间序列,例如 up。
这样做的一个用途是排除那些摄取成本过高的时间序列。
配置格式
- source_labels:指定输入源(现有标签集),这些标签的值将被用于后续的操作(比如重写、拼接等)。
- separator:合并多个 source_labels 的值时使用的分隔符(默认为 ;)。
- target_label:指定要修改或新创建的目标标签的名称。
- regex:定义一个正则表达式,用于匹配和筛选 source_labels 的值。
- modulus:与 hashmod 动作一起使用,用于通过哈希函数和模运算来筛选标签。
- replacement: 当使用regex进行匹配后,replacement字段指定了一个替换值,它将会替换目标标签的值。
- action:定义要执行的具体操作,如重写标签、删除标签等。
<relabel_action> 决定了要采取的重标记动作:
- replace:将 regex 与连接的 source_labels 进行匹配。然后,将 target_label 设置为 replacement,其中 replacement 中的匹配组引用(${1}, ${2}, ...)被替换为它们的值。如果 regex 不匹配,则不进行替换。
- lowercase:将连接的 source_labels 映射到它们的小写形式。
- uppercase:将连接的 source_labels 映射到它们的大写形式。
- keep:对于 regex 不匹配连接的 source_labels 的目标,将其丢弃。
- drop:对于 regex 匹配连接的 source_labels 的目标,将其丢弃。
- keepequal:对于连接的 source_labels 不匹配 target_label 的目标,将其丢弃。
- dropequal:对于连接的 source_labels 匹配 target_label 的目标,将其丢弃。
- hashmod:将 target_label 设置为连接的 source_labels 的哈希值的模。
- labelmap:将 regex 与所有源标签名(不仅仅是 source_labels 中指定的那些)进行匹配。然后,将匹配的标签的值复制到 replacement 给出的标签名中,其中 replacement 中的匹配组引用(${1}, ${2}, ...)被替换为它们的值。
- labeldrop:将 regex 与所有标签名进行匹配。任何匹配的标签都将从标签集中移除。
- labelkeep:将 regex 与所有标签名进行匹配。任何不匹配的标签都将从标签集中移除。
- 在使用 labeldrop 和 labelkeep 时必须小心,以确保一旦标签被移除,指标仍然具有唯一的标签。
relabel_configs 和 metric_relabel_configs 区别
- 应用时间点不同:relabel_configs 用于在抓取目标之前对目标进行标签重写或筛选,而 metric_relabel_configs 在指标收集完成后进行操作。
- 操作的对象不同:relabel_configs 用于目标级别的操作,可以对目标进行标签的修改、生成和过滤;metric_relabel_configs 用于指标级别的操作,可以对指标的标签进行修改、生成和过滤。
- 使用场景不同:relabel_configs 适用于需要在抓取目标前进行标签的操作,例如修改抓取数据时默认使用的端口或路径;metric_relabel_configs 适用于需要在指标收集完成后对指标进行进一步处理,例如过滤掉不需要的标签或者基于现有标签创建新的标签。
需要注意的是,如果使用 metric_relabel_configs 基于现有标签创建新的标签,那么只有已经存在老标签的指标才会有新的标签,而不是所有指标中都会有。这是因为 metric_relabel_configs 中定义的操作是基于已存在的标签进行的。如果一个指标不包含这个特定的标签,那么相关的 metric_relabel_configs 配置就不会对它产生任何影响。
relabel_configs 使用示例
在所有指标中新增名为 node_ip 的标签
基于现有 address 标签的值(192.168.2.100:9100),正则截取出 IP 地址赋值给 node_ip 标签。
- job_name: "node_exporter"
static_configs:
- targets: ["192.168.2.100:9100"]
relabel_configs:
- source_labels: ['__address__']
separator: ';'
target_label: node_ip
regex: '([^:]+):.*'
replacement: '$1'
action: replace
上面的配置中,如果对应的参数使用的默认值,那么可以忽略不写:
relabel_configs:
- source_labels: ['__address__']
target_label: node_ip
regex: '([^:]+):.*'
效果如下图所示
修改抓取时默认使用的端口
抓取 ingress-nginx-controller 提供的监控数据时,默认使用的端口为提供服务访问的端口,所以要修改下。
relabel_configs:
- source_labels: ['__address__']
target_label: node_ip
regex: '([^:]+):.*'
replacement: '$1:10254'
target_label: __address__
metric_relabel_configs 使用示例
基于主机名创建新的标签
如下所示,截取 nodename 标签的值定义新的 node_env 标签。
metric_relabel_configs:
- source_labels: ['nodename']
target_label: 'node_env'
regex: ^([^\-]+)-.*$
效果如下所示,主机名为 test-imzcy 时拆分除 node_env 值为 test 。
丢弃标签值为指定字符的目标
如下 L15 - L17 配置所示,当 test_env 标签值为 test 时,将丢弃对应目标(target)所有指标的数据。
- job_name: "node_exporter"
static_configs:
- targets: ["192.168.2.100:9100"]
- targets: ["192.168.2.100:9101"]
labels:
test_env: test
relabel_configs:
- source_labels: ['__address__']
target_label: node_ip
regex: '([^:]+):.*'
metric_relabel_configs:
- source_labels: ['nodename']
target_label: 'node_env'
regex: ^([^\-]+)-.*$
- source_labels: ['test_env']
regex: 'test'
action: drop
效果如下图所示
以上内容仅代表个人观点,不足之处还请指正交流。
本文采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
如果您的问题未解决,欢迎微信扫描右侧二维码与我联系。