规则
- 所有以
__
开头的标签在抓取后都会被删除。大多数内部标签以__
开头。 - 您可以设置名为
__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 # 默认行为是将正则匹配到的第一个分组($1) 的内容赋值给这里指定的标签: server_name
-
source_labels: [__address__]
的意思是需要被处理的源标签是__address__
,此示例的值是getway=192.168.0.39:8766
。 -
regex: '([a-z]+)=.*'
的意思是使用 regex 指定的正则表达式'([a-z]+)=.*'
和__address__
的值进行匹配,也就是([a-z]+)=.*
将会配到getway=192.168.0.39:8766
,并且 正则匹配的第一个分组$1
的内容是getway
。 -
target_label: server_name
的意思是把分组$1
的内容赋值给新的标签server_name
, 标签将会被添加到指标名称中,便于以后搜索。
- source_labels: [__address__]
regex: '[a-z]+=(.*)'
target_label: server_addr
原理同上,最终会有标签 server_addr=192.168.0.39:8766
被添加到指标中
- 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
这里其实省略了 source_labels:[__address__]
,意思是将标签 __address__
的值,将正则 .*
(默认的表达式)和 __address__
匹配到的内容再重新赋值给标签 __address__
, 但是赋值的值是 replacement
指定的值。而内部标签 __address__
的值是 Prometheus 发送抓取指标请求时实际使用的请求地址。
这里的场景是 192.168.0.39:9115 为黑盒监控的监听地址。
因此最终每次抓取请求的 URL 是 http://192.168.0.39:9115/probe
,请求的参数是 target=192.168.0.39:8766
,最终组成完整的抓取指标请求:
`http://192.168.0.39:9115/probe?target=192.168.0.39:8766
/probe
这个是根据具体 exporter 设置的,所以它不是固定的,这个在 prometheus.yaml 文件中使用metrics_path: /probe
指定。
而当 Prometheus 将这个请求发送给一个支持多目标监控对象的 exporter(这里指的是 黑盒测试 blakexport)时,这个程序就会获取到 target
参数的值,并且向这个值(这里是 192.168.0.39:8766)所代表的服务发起获取指标的请求,而 192.168.0.39:8766 会返回指标数据给黑盒测试 blakexport, 而 黑盒测试 blakexport 再返回 Prometheus。