07. Prometheus - 标签重写
默认标签
默认情况下,Prometheus 加载 targets 后,都会包含一些默认的标签,其中以 __
作为前缀的标签是在系统内部使用的,因此这些标签不会写入到样本数据中。
这些标签将会告诉 Prometheus 如何从该目标实例中获取监控数据。
自定义标签
除了系统给定的标签,用户其实可以自己自定义一些标签,以提升数据的可操作性。
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
- targets:
- "192.168.200.101:9100"
labels:
__server_node_name__: "node-01"
__server_idc__: "aliyun"
- targets:
- "192.168.200.102:9100"
labels:
__server_node_name__: "node-02"
__server_idc__: "tengxunyun"
调用接口重载 Prometheus 配置:
curl -X POST http://192.168.200.101:9090/-/reload
结果如图所示:
标签重写
标签重写(Relabeling)是 Prometheus 一个非常有用的功能,它可以在任务拉取(scraping)阶段前,修改 target 和它的 labels。prometheus 自身其实也做了标签重写工作,比如 instance 标签其实质是由 __address__
标签重写而来。
通过 Service Discovery 就能直接的看到每个 target 所具有的标签:
标签重写的配置参数为 relabel_config
,测试将原有的标签重写成新的标签:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 将标签 __address__ 的值重写给新的标签 address
relabel_configs:
- source_labels:
- __address__
target_label: "address"
调用接口重载 Prometheus 配置,结果如图所示:
重写覆盖(replacement)
该方法其实相当于重新自定义了一个标签,原始获取到的值已经被覆盖为了自定义的值:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 将标签 __address__ 的值重写给新的标签 address,然后再用指定的值去覆盖它
relabel_configs:
- source_labels:
- __address__
target_label: "address"
replacement: "helloworld"
调用接口重载 Prometheus 配置,结果如图所示:
多标签拼接(separator)
重写标签的值不但能是一个标签的值,也可能是多个标签的值拼接而来:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 标签重写
relabel_configs:
- source_labels:
- __scheme__
- __address__
# 指定多个标签拼接的分隔符
separator: "://"
target_label: "api"
调用接口重载 Prometheus 配置,结果如图所示:
正则重写
有时候标签的值并不能直接使用,可能需要进行处理:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 标签重写
relabel_configs:
- source_labels:
- __address__
target_label: "address"
regex: "(.*):(.*)"
replacement: "$1-$2"
调用接口重载 Prometheus 配置,结果如图所示:
重写丢弃(drop / keep)
如果有些 target 不希望保留,则可以使用正则去匹配标签的值,如果匹配则 drop:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 标签重写
relabel_configs:
- source_labels:
- __address__
target_label: "address"
regex: "(.*):(.*)"
replacement: "$1-$2"
# 对重写的标签再次进行处理,如果匹配正则则删除 target
- source_labels:
- address
regex: "(.*)101(.*)"
action: drop
调用接口重载 Prometheus 配置,结果如图所示:
如果你想实现相反的功能,则只需要将 drop 换成 keep 即可。
标签名称替换(labelmap)
前面我们自定义了两个标签,如果想让这两个标签都暴露出来,则可以使用 labelmap 实现:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 标签重写
relabel_configs:
- regex: "__server_(.+)__"
action: labelmap
调用接口重载 Prometheus 配置,结果如图所示:
其原理和标签重写很像,labelmap 是去正则匹配所有标签名,将匹配部分作为新的标签名,然后指向本来的值。
标签删除(labeldrop / labelkeep)
通过 labeldrop 能够实现删除匹配的所有标签:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 将匹配的标签名删除
relabel_configs:
- regex: "(job)"
action: labeldrop
调用接口重载 Prometheus 配置,结果如图所示:
同样,如果想实现相反的功能,则换成 labelkeep 即可。
但是问题却出来了,换成 labelkeep 之后,整个 target 都消失了:
metric_relabel_configs
metric_relabel_configs 的使用方法和 relabel_config 类似,但是它确实用来重写指标名称的。常用于丢弃不需要的指标数据:
# 指标采集配置
scrape_configs:
...
# 自己打标签
- job_name: "node-exporter-relabel"
static_configs:
...
# 删除 exporter 带的 go 指标
metric_relabel_configs:
- source_labels:
- "__name__"
regex: "(go_.*)"
action: drop
调用接口重载 Prometheus 配置,结果如图所示:
此时 exporter 自带的 go 指标就被清理了,其实质也是用了标签丢弃的原理。