1. relabeling
1.1 relabel简介
Relabeling 是一个强大的工具,它允许你通过重写标签集来分类和过滤PrometheusTarget/目标
和Metric/指标
。
1.2 relabel目的
如何将指标量级降维和重组
- 要保留的数据:这涉及保留一组明确定义的重要指标和标签,并删除其他所有内容。要将指标和标签列入白名单,首先应该明确哪些核心指标和标签是希望保留的。要在Prometheus中启用白名单,需要配合relabeling action的
keep
和labelkeep
来操作。 - 可丢弃的数据:这涉及删除你需要明确定义的一组不重要指标,并保留其他所有指标。一旦确定了要删除的高基数指标和标签列表,拒绝名单就可能需要被使用。要在 Prometheus 中启用黑名单,需要配合relabeling action的
drop
和labeldrop
来操作。
1.3 relabel四种方式
1.relabel_config
重新标记(Relabeling)是一个可以在抓取目标(target)数据之前,动态修改目标的标签集的强大工具。每个抓取(scrape)配置可以定义多个重新标记步骤。它们按照在配置文件中的出现顺序应用于每个目标的标签集。
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
写到远程存储的样本
5.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 配置就不会对它产生任何影响。
- Prometheus配置
https://prometheus.io/docs/prometheus/2.55/configuration/configuration/#relabel_config
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配置实施的规则
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
下
# 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动作,可选值包括 replace 、keep 、drop 、hashmod 、labelmap 、labeldrop 、labelkeep ,默认值为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 映射到它们的大写形式 |