prometheus 之 relabel_configs 使用详解

- 监控

本文将详细介绍 prometheus 中 relabel_configs(重新标记) 和 metric_relabel_configs(指标重新标记)的使用。包括官方对二者的介绍、二者的区别以及使用示例。
2024-04-13T08:45:29.png


官方对 relabel_configs 介绍

重新标记(Relabeling)是一个可以在抓取目标(target)数据之前,动态修改目标的标签集的强大工具。每个抓取(scrape)配置可以定义多个重新标记步骤。它们按照在配置文件中的出现顺序应用于每个目标的标签集。
2024-04-13T08:46:01.png
初始情况下,除了按目标配置的每个标签之外,目标的 job 标签也设置为相应抓取配置 job_name 的值。__address__ 标签被设置为目标的 : 地址。重新标记后,如果在重新标记过程中未设置 instance 标签,则将 instance 标签默认设置为 address 的值。__scheme__ 和 metrics_path 标签分别设置为目标的协议和 metrics 路径。__param_ 标签被设置为第一个传递的 URL 参数的值。

scrape_intervalscrape_timeout 标签被设置为目标的抓取间隔和超时时间。这是实验性的,可能会在将来发生改变。

重新标记阶段可能会提供以 _meta 为前缀的额外标签。这些标签由目标的服务发现机制设置,并且在不同机制之间有所不同。

在目标重新标记完成后,以 __ 开头的标签将从标签集中删除。

如果重新标记步骤需要仅临时存储标签值(作为后续重新标记步骤的输入),请使用 __tmp 标签名称前缀。Prometheus本身永远不会使用这个前缀。



官方对 metric_relabel_configs 介绍

指标重新标记(Metric relabeling)是在摄取(ingestion)之前最后一步对样本(samples)应用的。它具有与目标重标记(relabel_configs)相同的配置格式和操作。指标重标记不适用于自动生成的时间序列,例如 up。

这样做的一个用途是排除那些摄取成本过高的时间序列。



配置格式

2024-04-13T08:47:03.png

是任何有效的 RE2 正则表达式。它对于 replace、keep、drop、labelmap、labeldrop 和 labelkeep 动作是必需的。

<relabel_action> 决定了要采取的重标记动作:




relabel_configs 和 metric_relabel_configs 区别

  1. 应用时间点不同:relabel_configs 用于在抓取目标之前对目标进行标签重写或筛选,而 metric_relabel_configs 在指标收集完成后进行操作。
  2. 操作的对象不同:relabel_configs 用于目标级别的操作,可以对目标进行标签的修改、生成和过滤;metric_relabel_configs 用于指标级别的操作,可以对指标的标签进行修改、生成和过滤。
  3. 使用场景不同: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: '([^:]+):.*'

效果如下图所示
2024-04-13T08:51:54.png

修改抓取时默认使用的端口

抓取 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 。
2024-04-13T08:53:31.png

丢弃标签值为指定字符的目标

如下 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

效果如下图所示
2024-04-13T08:54:13.png

以上内容仅代表个人观点,不足之处还请指正交流。