规则
- 所有以
__
开头的标签在刮擦后都会被删除。大多数内部标签以__
开头。 - 您可以设置名为
__param_<name>
的内部标签。主要是提供那些为刮擦请求设置带有键<name>
的URL参数。 - 有一个内部标签
__address__
,其值是由 Prometheus 配置文件中static_configs
下targets
的每一个值设置的,其值是刮擦请求的主机名。默认情况下,它后来用于设置标签instance
的值,该值附加到每个指标上,并告诉您指标来自哪里。
标签重新配置 relabel_config
# source labels 从现有标签(可以是已经配置的和动态已经生成的)中选择值。
# 使用配置的分隔符(默认 = )并与配置的正则表达式匹配到的内容进行连接,用于替换、保留和删除操作。
[ source_labels: '[' <labelname> [, ...] ']' ]
# 分隔符 放在内容和原标签之间
[ separator: <string> | default = ; ]
# 在替换操作中将结果值写入的标签。
# 对于替换操作,它是强制性的。Regex捕获组($1,$2)是可以可用的
[ target_label: <labelname> ]
# 正则表达式 与提取的内容相匹配,一般是 source_labels
# 书写的正则表达是需要是 .*<regex>.* 的方式,就是两头必须都有 .*,或者使用单引号引起来 '<regex>'
[ regex: <regex> | default = (.*) ]
# 替换的值
# 如果正则表达式匹配,则对其执行正则表达式替换。Regex捕获组可用。
# 这个是默认行为,如果需要替换为其他值,可以使用这个配置去指定。
# 一般替换的值是给 target_label,可以用于创建新标签。
[ replacement: <string> | default = $1 ]
# 动作
# 基于正则表达式匹配执行的动作
[ action: <relabel_action> | default = replace ]
relabel_action 有:
- replace: 替换 这个是默认动作,其行为是将
regex
从source_labels
匹配的内容进行替换. 替换的值存放在replacement ,正则匹配到的组可以引用 (比如 ${1}, ${2}, …)。
最终 replacement 值会赋值给target_label
。如果regex
不匹配,则不进行替换。 - lowercase: 将连接的
source_labels
映射到它们的小写字母。 - uppercase: 将连接的
source_labels
映射它们的大写字母。 - keep: 删除
regex
与连接不匹配的目标source_labels
,让Prometheus丢弃没有匹配到regex
的target
. - drop: 删除
regex
与连接匹配的目标source_labels
,让Prometheus丢弃匹配到regex
的target
- labelmap: 匹配
regex
所有标签名称,并将捕获的内容分组,用第一个分组内容作为新的标签名(使用正则提取出多个字段,使用匹配到的作为新标签名,但是标签的内容不会改变,相对于对原有标签换了个名字,原标签仍然存在) - labeldrop:将正则表达式与所有标签名称匹配。任何匹配的标签都将从标签集中删除
- labelkeep:将正则表达式与所有标签名称匹配。任何不匹配的标签都将从标签集中删除
实战分析
static_configs:
- targets:
- getway=192.168.0.39:8766
- a=192.168.0.39:6060
- b=192.168.0.39:6130
- c=127.0.0.1:6130
relabel_configs:
- source_labels: [__address__]
regex: '([a-z]+)=.*'
target_label: server_name
- source_labels: [__address__]
regex: '[a-z]+=(.*)'
target_label: server_addr
- source_labels: [server_addr]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.0.39:9115
__address__
是targets 中的值,比如 getway=192.168.0.39:8766
- source_labels: [__address__]
regex: '([a-z]+)=.*'
target_label: server_name
上面的意思是使用 regex 指定的正则表达式 '([a-z]+)=.*'
和 __address__
的值进行匹配,并且进行了分组。
之后把分组 $1 的内容赋值给新的标签 server_name
, 标签将用于标记每个被监控实例的标记,最后会展现在 grafana 的图表中。
- source_labels: [__address__]
regex: '[a-z]+=(.*)'
target_label: server_addr
上面的意思是把匹配到的分组内容 $1 分配给新的标签 server_addr
, 同样会作为标记被展现出来。
- source_labels: [server_addr] # 192.168.0.39:8766
target_label: __param_target # 192.168.0.39:8766
上面的意思是把 server_addr 标签的内容赋值给 Prometheus 新建的一个自定义内置标签 __param_target
,这将会被构建在一个有目标参数的请求中,比如:
http://黑盒测试的地:端口/probe?target=192.168.0.39:8766&module=tcp
当时有 黑盒测试的时候,实际也会会映射到 Prometheus 的配置文件中为如下内容
- job_name: "java-tcp"
scrape_interval: 5s
metrics_path: /probe
params:
target:
- 192.168.0.39:8766 # server_addr 的值
- source_labels: [__param_target]
target_label: instance
上面的意思是 把内置标签 __param_target
的值赋值给标签 instance
- target_label: __address__
replacement: 192.168.0.39:9115
上面的意思是把 replacement
的值 192.168.0.39:9115
赋值给Prometheus 内置的标签 __address__
这里的场景是 192.168.0.39:9115 为黑盒监控的监听地址。
总结: 上的一堆配置的目的就是,先用 __address__
的值,经过匹配,获取到需要的值,并赋值个自定义的标签,这些标签将会用于很好的识别或者标识每一次被发送请求的目标,目标通常是指需要被获取监控信息的服务器 。
获取到的值,也被赋值给 instence
, 这个就是我们众多被监控对象其中的一个。这样我们就可以作为每一次请求的参数,告诉 blakexport或者其他的支持多目标监控对象的 exporter, instence 就是此次发送请求的目标。