Skip to content

1. relabeling

1.1 relabel简介

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

image-20241226143000386

1.2 relabel目的

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

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

1.3 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.4 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
# The source labels select values from existing labels. Their content is concatenated
# using the configured separator and matched against the configured regular expression
# for the replace, keep, and drop actions.
[ source_labels: '[' <labelname> [, ...] ']' ]

# Separator placed between concatenated source label values.
[ separator: <string> | default = ; ]

# Label to which the resulting value is written in a replace action.
# It is mandatory for replace actions. Regex capture groups are available.
[ target_label: <labelname> ]

# Regular expression against which the extracted value is matched.
[ regex: <regex> | default = (.*) ]

# Modulus to take of the hash of the source label values.
[ modulus: <int> ]

# Replacement value against which a regex replace is performed if the
# regular expression matches. Regex capture groups are available.
[ replacement: <string> | default = $1 ]

# Action to perform based on regex matching.
[ action: <relabel_action> | default = replace ]
# The source labels select values from existing labels. Their content is concatenated
# using the configured separator and matched against the configured regular expression
# for the replace, keep, and drop actions.
[ source_labels: '[' <labelname> [, ...] ']' ]

# Separator placed between concatenated source label values.
[ separator: <string> | default = ; ]

# Label to which the resulting value is written in a replace action.
# It is mandatory for replace actions. Regex capture groups are available.
[ target_label: <labelname> ]

# Regular expression against which the extracted value is matched.
[ regex: <regex> | default = (.*) ]

# Modulus to take of the hash of the source label values.
[ modulus: <int> ]

# Replacement value against which a regex replace is performed if the
# regular expression matches. Regex capture groups are available.
[ replacement: <string> | default = $1 ]

# Action to perform based on regex matching.
[ 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 映射到它们的大写形式

relabel_configs 使用示例

labelmap使用示例