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来做示例,下图是服务发现后自动打上的标签:
