Skip to content

1. relabeling

1.1 relabel简介

Relabeling 是一个强大的工具,它允许你通过重写标签集来分类和过滤PrometheusTarget/目标Metric/指标

image-20241226143000386

1.2 relabel目的

如何将指标量级降维和重组

  • 要保留的数据:这涉及保留一组明确定义的重要指标和标签,并删除其他所有内容。要将指标和标签列入白名单,首先应该明确哪些核心指标和标签是希望保留的。要在Prometheus中启用白名单,需要配合relabeling action的keeplabelkeep来操作。
  • 可丢弃的数据:这涉及删除你需要明确定义的一组不重要指标,并保留其他所有指标。一旦确定了要删除的高基数指标和标签列表,拒绝名单就可能需要被使用。要在 Prometheus 中启用黑名单,需要配合relabeling action的droplabeldrop来操作。

💡 说明

记住一点,我们有两个阶段可以重新标记。

第一阶段是对来自服务发现的目标进行重新标记,这是对于来自服务发现的元数据标签中的信息应用于指标上的标签来说非常有用。

第二阶段是抓取指标之后但是在存储系统之前。这样就可以确定哪些指标需要保存,哪些需要丢弃以及这些指标的样式。

抓取之前使用relabel_configs,抓取之后使用metrics_relabel_configs

1.3 生命周期

1.4 原理

重新标记标签作用:

1、动态生成新标签 根据已有的标签生成新标签

2、过滤采集的Target

3、删除不需要或者敏感标签

4、添加新标签

1.5 relabel四种方式

1.relabel_config

重新标记(Relabeling)是一个可以在抓取目标(target)数据之前,动态修改目标的标签集的强大工具。每个抓取(scrape)配置可以定义多个重新标记步骤。它们按照在配置文件中的出现顺序应用于每个目标的标签集。

bash
relabel_config
在被prometheus抓取之前修改,针对的是target
relabel_config
在被prometheus抓取之前修改,针对的是target

2.metric_relabel_configs

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

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

metric_relabel_configs
在被prometheus存储之前修改,针对的是metric
metric_relabel_configs
在被prometheus存储之前修改,针对的是metric

3.alert_relabel_configs

alert_relabel_configs
在被发送到alertmanager之前,针对的是alert
alert_relabel_configs
在被发送到alertmanager之前,针对的是alert

4.write_relabel_configs

write_relabel_configs
写到远程存储的样本
write_relabel_configs
写到远程存储的样本

Relabeling

5.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 配置就不会对它产生任何影响。

  • Prometheus配置

https://prometheus.io/docs/prometheus/2.55/configuration/configuration/#relabel_config

yaml
global:
...

rule_files:
...

scrape_configs:
  - job_name: sample_job_1
    kubernetes_sd_configs:
    - ...
    relabel_configs:           # <-
    - source_labels: [...]
       ...
    - source_labels: [...]
      ...
    metric_relabel_configs:    # <-
    - source_labels: [...]
      ...
    - source_labels: [...]
      ...
  - job_name: sample_job_2
    static_configs:
    - targets: [...]
    metric_relabel_configs:    # <-
    - source_labels: [...]
      ...

alerting:
  alert_relabel_configs:       # <-
    [ - <relabel_config> ... ]
  alertmanagers:
    [ - <alertmanager_config> ... ]

remote_write:
- url: ...
  write_relabel_configs:       # <-
  - source_labels: [...]
    ...
  - source_labels: [...]
    ...
global:
...

rule_files:
...

scrape_configs:
  - job_name: sample_job_1
    kubernetes_sd_configs:
    - ...
    relabel_configs:           # <-
    - source_labels: [...]
       ...
    - source_labels: [...]
      ...
    metric_relabel_configs:    # <-
    - source_labels: [...]
      ...
    - source_labels: [...]
      ...
  - job_name: sample_job_2
    static_configs:
    - targets: [...]
    metric_relabel_configs:    # <-
    - source_labels: [...]
      ...

alerting:
  alert_relabel_configs:       # <-
    [ - <relabel_config> ... ]
  alertmanagers:
    [ - <alertmanager_config> ... ]

remote_write:
- url: ...
  write_relabel_configs:       # <-
  - source_labels: [...]
    ...
  - source_labels: [...]
    ...

1.6 relabeling规则

常用的在以下两个阶段可以重新标记:

relabel_configs:在采集之前(比如在采集数据之前重新定义元标签),可以使用relabel_configs添加一些标签、也可以只采集特定目标或过滤目标

metric_relabel_configs:如果是已经抓取到指标数据时,可以使用metric_relabel_configs做最后的重新标记和过滤

1.在线分析

Prom Labs 的Relabeler工具在调试relabeling配置时可能会有所帮助,它可以让你直观地确认relabel配置实施的规则

image-20241226141032849

2.语法

除了配置的每个目标标签之外,prometheus还会自动添加几个标签:

  • 默认matedata

job标签:设置为job_name相应的抓取配置的值。

instance标签:__address__设置为目标的地址<host>:<port>。重新标记后,如果在重新标记期间未设置标签,则默认将__address__标签值赋值给instance。

schema:协议类型

__metrics_path:抓取指标数的url

scrape_interval:scrape抓取数据时间间隔(秒)

scrape_timeout:scrape超时时间(秒)

  • consul的metedata

如果什么也不添加,默认只显示 job 及 instance 两个标签,其他标签都默认属于 before relabeling

yaml
#源标签,需要在现有标签中已存在
[ source_labels: '[' <labelname> [, ...] ']' ]

# 多个源标签的分隔符;
[ separator: <string> | default = ; ]

# 要替换的目标标签;
[ target_label: <labelname> ]

# 正则表达式,用于匹配源标签的值
[ regex: <regex> | default = (.*) ]

# 源标签值取hash的模块;
[ modulus: <uint64> ]

# 当正则表达式匹配时,用于替换的值,$1代替正则匹配到的值;
[ replacement: <string> | default = $1 ]

# 基于正则匹配的动作
[ action: <relabel_action> | default = replace ]
#源标签,需要在现有标签中已存在
[ source_labels: '[' <labelname> [, ...] ']' ]

# 多个源标签的分隔符;
[ separator: <string> | default = ; ]

# 要替换的目标标签;
[ target_label: <labelname> ]

# 正则表达式,用于匹配源标签的值
[ regex: <regex> | default = (.*) ]

# 源标签值取hash的模块;
[ modulus: <uint64> ]

# 当正则表达式匹配时,用于替换的值,$1代替正则匹配到的值;
[ replacement: <string> | default = $1 ]

# 基于正则匹配的动作
[ action: <relabel_action> | default = replace ]

Relabeling 规则主要由以下的一些配置属性组成:

参数解释
action执行的relabeling动作,可选值包括 replacekeepdrophashmodlabelmaplabeldroplabelkeep,默认值为replace
separator分隔符,一个字符串,合并多个 source_labels 的值时使用的分隔符,默认为;
source_labels源标签,使用配置的分隔符串联的标签名称列表,并与提供的正则表达式进行匹配
target_label指定要修改或新创建的目标标签的名称,当使用replace或者hashmod动作时,应该被覆盖的标签名
regex定义一个正则表达式,用于匹配和筛选 source_labels 的值,默认为(.*)
modulus模数,串联的源标签哈希值的模,主要用于Prometheus水平分片
replacement写在目标标签上,它可以参考由 regex 捕获的正则表达式捕获组,默认值为$1

关于relabel_config的action类型说明:

参数解释
replace设置或替换/覆盖标签值,是默认的action
keep满足特定条件的target进行采集,其他的不采集
drop满足特定条件的target不采集,其他的采集
labeldrop匹配regex所有标签名称,对匹配到的实例标签进行删除
labelkeep匹配regex所有标签名称,对匹配到的实例标签进行保留
labelmap正则匹配所有标签名,将匹配的标签值部分做为新标签名,原标签值 做为新标签的值
hashmod使用hashmod计算source_labels的hash值并进行对比,基于自定义的模数取模,以实现对目标进行分类、重新赋值等功能
lowercase将连接的 source_labels 映射到它们的小写形式
uppercase将连接的 source_labels 映射到它们的大写形式

❌ 注意

重定义标签并应用后,__开头的标签会被删除; 要临时存储值用于下一阶段的处理,使用__tmp开头的标签名,这种标签不会被Prometheus使用;

relabel_configs 使用示例

1.添加机器

yml
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'

image-20250214152823836

replace替换

将__machine_hostname__的值替换到新标签hostname

流程图

image-20250214172237438

yml
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - source_labels: [__machine_hostname__]
        regex: "(.*)"
        action: replace
        replacement: '$1'
        target_label: "hostname"
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - source_labels: [__machine_hostname__]
        regex: "(.*)"
        action: replace
        replacement: '$1'
        target_label: "hostname"

source_labels 选择了需要的提取内容的源标签,然后会用 separator 将其标签值串行拼接起来,因为没有定义 separator,这里是默认的 ; 符号

经过正则匹配后,replacement 规定了 $1的结果,其中 $1 正则匹配结果的第一组,并把这个结果赋值给 hostname这个标签

image-20250214155132145

keep示例

yml
    relabel_configs:
    - source_labels: [__machine_hostname__]
      regex: "(.*)-01"
      target_label: "hostname"
      action: keep
      replacement: '$1'
    relabel_configs:
    - source_labels: [__machine_hostname__]
      regex: "(.*)-01"
      target_label: "hostname"
      action: keep
      replacement: '$1'

labelmap使用示例

重写新的标签hostname和idc,使用原有__machine_hostname__和__machine_idc__标签的值,换句话说,将 __machine_hostname 为前缀的标签,去除前缀后,将键值对作为最终标签

yml
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - action: labelmap
        regex: __machine_(.*)_
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - action: labelmap
        regex: __machine_(.*)_

这里不再依赖 source_labels,因为在 labelmap 里,regex 是对所有__machine_开头的标签匹配的

image-20250214160207203

uppercase示例

uppercase 的操作更加的简单,不需要正则处理,直接将源标签值转变为大写

yml
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - action: uppercase
        source_labels: [__machine_idc__]
        target_label: idc
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'idc-01'
    relabel_configs:
      - action: uppercase
        source_labels: [__machine_idc__]
        target_label: idc

这个 action 不使用正则,因此可以忽略 regex 和 replacement,操作过程也更加简单 就是把 source_labels 指定的标签都转化为大写字母,赋值给 env_dc 标签

image-20250214170414313

lowercase示例

恰好与uppercase操作相反,同时也不需要正则处理,直接将源标签值转变为小写

yml
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'IDC-01'
    relabel_configs:
      - action: uppercase
        source_labels: [__machine_idc__]
        target_label: idc
  - job_name: myjob
    honor_timestamps: true
    static_configs:
      - targets: ['10.103.236.199:9100']
        labels:
          __machine_hostname__: 'node-01'
          __machine_idc__: 'IDC-01'
    relabel_configs:
      - action: uppercase
        source_labels: [__machine_idc__]
        target_label: idc

这个 action 不使用正则,因此可以忽略 regex 和 replacement,操作过程也更加简单 就是把 source_labels 指定的标签的值都转化为小写字母,赋值给 env_dc 标签