Prometheus-5:relabel标签重新打标
Prometheus relabel重新打标
对target重新打标是在数据抓取之前动态重写target标签的强大工具,在每个数据抓取配置中,可以定义多个relabel步骤,它们将按照定义的顺序依次执行。
对于发现的每个target,Prometheus默认会执行如下操作:
- job的标签设定为其所属job_name的值;
- __address__标签的值为该target的套接字地址“:”
- instance标签的值为__address__的值
- __scheme__标签的值为抓取该target上指标时使用的协议(http或https)
- __metrics_path__标签的值为抓取该target指标时使用的URL路径,默认为/metrics
- __param_标签的值为传递的URL参数中第一个名称为的参数的值
需要注意:
重新标记期间,还可以使用该target上以"__meta_"开头的元标签,各服务发现机制为其target添加的源标签会有所不同。
重新标记完成后,该target上以"__"开头的所有标签都会被移除,若在relabel的过程中需要临时存储标签值,则要使用__tmp为前缀进行保存,以避免同Prometheus的内建标签冲突。
relabel_config
relabel中几个重要的字段作用:
# source_labels从指定标签中匹配值。并将值串联
# 使用配置的分隔符并与配置的正则表达式匹配
# 用于替换、保留和丢弃操作。
[ source_labels: '[' <labelname> [, ...] ']' ]
# 串联源标签值之间的分隔符,默认;
[ separator: <string> | default = ; ]
# 在替换操作中将结果值写入的标签。
# 对于替换操作,它是强制性的。Regex捕获组可用。
[ target_label: <labelname> ]
# 与提取值匹配的正则表达式。
# 当actions等于replace, keep, drop, labelmap,labeldrop and labelkeep时使用
[ regex: <regex> | default = (.*) ]
# 获取源标签值的哈希值的模数。
[ modulus: <int> ]
# 如果正则表达式匹配,则对其执行正则表达式替换的替换值。
[ replacement: <string> | default = $1 ]
# 基于正则表达式匹配要执行的操作。
[ action: <relabel_action> | default = replace ]
<relabel_action>字段用于定义重新标记的行为,其可用取值有:
1. 替换标签值
- replace:首先将source_labels中指定的各标签的值进行串联,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值
-
- replacement可按需引用保存regex中的某个“分组模式”匹配到的值;默认保存整个regex匹配到的内容
-
- 进行值替换时,replacement字段中指定标签的值也支持以分组格式进行引用
- hashmod:将target_label的值设置为一个hash值,该hash则由modules字段指定的hash模块对source_labels上各标签的串联值进行hash计算
2. 删除指标:该处的每个指标名称对应一个target
- keep:regex不能匹配到target上的source_labels上的各标签的串联值时,则删除该target
- drop:regex能够匹配到target上的source_labels上的各标签的串联值时,则删除该target
3. 创建或删除标签
- labelmap:将regex对所有的标签名进行匹配判定,而后将匹配到的标签的值赋给replacement字段指定的标签名之上,通常用于取出匹配的标签名的一部分生成新标签
- labeldrop:将regex对所有的标签名进行匹配判定,能够匹配到的标签将从target的标签集中删除
- labelkeep:将regex对所有的标签名进行匹配判定,不能够匹配到的标签将从target的标签集中删除
注意:要确保labeldrop或labelkeep操作后,余下的标签集依然能唯一标识该指标
relabel示例之replace
以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签:
我们这里做一个拼接,将__scheme__、__address__和__metrics_path__的值拼接成一个值并重新赋予给endpoint这个标签,如下:
- job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: (http|https)(.*)
separator: ""
target_label: endpoint
replacement: ${1}://${2}
action: replace
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
如此配置之后,所有job_name=nodes的target都会执行此relabel操作。
relabel示例之labelmap
以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签,都以__meta__consul开头:
我们这里做一个类似重命名的操作,将__meta_consul_service开头的标签再次利用起来,将__meta_consul_service_这么一堆去掉,改为node_xxx这种类型:
- regex: (__meta_consul_service_)(.*)
replacement: node_${2}
action: labelmap
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
已经达到预期,这个时候可以通过node_address等这些标签进行筛选target了。
relabel示例之labeldrop
以上两种方式实现了标签的拼接及重命名操作,但是还有很多标签是我们不想要的,我们也可以通过labeldrop来将它们删除,例如上边所有job开头的指标名称全部删除:
- regex: ^job.*
action: labeldrop
需要注意,relabel是按照配置顺序从上往下执行的,所以在删除操作之前如果有用到此类标签,一定要把drop的配置放在其后边
./promtool check config prometheus.yml
curl -XPOST monitor.example.com:9090/-/reload
此时包含所有以job开头的标签均已被删除:
relabel示例之keep
以上都是对target的标签进行了一系列操作,keep和drop是针对target本身的操作,例如,我想仅仅保持node_port标签值为9.+1的target,其他全部删除:
- source_labels:
- node_port
regex: 9.+1
action: keep
最终结果,node_port=9100的target被筛选走了:
以上实现最终prometheus.yml配置文件
scrape_configs:
- job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: (http|https)(.*)
separator: ""
target_label: endpoint
replacement: ${1}://${2}
action: replace
- regex: (__meta_consul_service_)(.*)
replacement: node_${2}
action: labelmap
- regex: job
action: labeldrop
- source_labels:
- node_port
regex: 9.+1
action: keep
metric_relabel_config
上边对target的标签进行relabel后,在获取指标的最后一步,还可以对metric进行重新打标,其作用在于:
- 删除不必要的指标
- 从指标中删除敏感或不需要的标签
- 添加、编辑或者修改指标的标签值或者标签格式
对metric重新打标的配置格式与target重新打标的格式相同,但要定义到 metric_relabel_configs 字段中。
需要注意的是:
- 更改或添加标签会创建新的时间序列,所以要明确使用各标签,尽可能保持不变,避免创建出一个动态的数据环境
- 标签是时间序列的唯一性约束,删除标签并导致时间序列重复时,可能会导致系统出现问题
metric relabel删除指标
例如删除go_info指标,通过__name__元标签引用指标名称,然后由regex进行匹配判定,可使用drop action删除匹配的指标。
注:__name__ 是一个特殊的标签名称,用于存储指标名称(也称为“指标类型”),例如go_info它就是一个指标名称。
下边示例,用于在响应的job_name之上,删除go_info指标:
- job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
metric_relabel_configs:
- source_labels: [__name__]
regex: go_info
action: drop
重新加载:
curl -XPOST monitor.example.com:9090/-/reload
删除前:
删除后:
至此,Prometheus relabel相关功能演示完毕。
写到最后
到此博客,Prometheus本身相关的话题、知识点及应用方式基本上都汇总完毕,后续会更着重于与Prometheus息息相关的组件介绍,包括查询结果的持久化、grafana、pushgateway以及告警组件altermanager等服务,感兴趣的朋友可以欢迎关注。