Prometheus的Relabeling机制
在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容:
默认情况下,当Prometheus加载Target实例完成后,这些Target时候都会包含一些默认的标签:
__address__
:当前Target实例的访问地址<host>:<port>
__scheme__
:采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS__metrics_path__
:采集目标服务访问地址的访问路径__param_<name>
:采集任务目标服务的中包含的请求参数
上面这些标签将会告诉Prometheus如何从该Target实例中获取监控数据。除了这些默认的标签以外,我们还可以为Target添加自定义的标签。
一般来说,Target以__
作为前置的标签是在系统内部使用的,因此这些标签不会被写入到样本数据中。不过这里有一些例外,例如,我们会发现所有通过Prometheus采集的样本数据中都会包含一个名为instance的标签,该标签的内容对应到Target实例的__address__
。 这里实际上是发生了一次标签的重写处理。
这种发生在采集样本数据之前,对Target实例的标签进行重写的机制在Prometheus被称为Relabeling。
Prometheus允许用户在采集任务设置中通过relabel_configs来添加自定义的Relabeling过程。
- Relabel用来重写target的标签
- 每个Target可以配置多个Relabel动作,按照配置文件顺序应用
- Target包含一些内置的标签(以’__'开头),都可以用于relabel,在relabel时未保留,内置标签将被删除
relabel流程
Target([source_label,…]) -> relabel -> Target ([target_label,…])
Relabel的配置
[ source_labels: '[' <labelname> [, ...] ']' ]
[ separator: <string> | default = ; ]
[ target_label: <labelname> ]
[ regex: <regex> | default = (.*) ]
[ modulus: <uint64> ]
[ replacement: <string> | default = $1 ]
[ action: <relabel_action> | default = replace ]
Relabel的action
ACTION | Regex匹配 | 操作对象 | 重要参数 | 描述 |
---|---|---|---|---|
keep | 标签值 | Target | 源标签、regex | 丢弃指定源标签的标签值没有匹配到regex的target |
Drop | 标签值 | Target | 源标签、regex | 丢弃指定源标签的标签值匹配到regex的target |
labeldrop | 标签名 | Label | Regex | 丢弃匹配到regex 的标签 |
labelkeep | 标签名 | Label | Regex | 丢弃没有匹配到regex 的标签 |
Replace | 标签值 | Label名+值 | 源标签、目标标签、替换(值)、regex(值) | 更改标签名、更改标签值、合并标签 |
hashmod | 无 | 标签名+值 | 源标签、hash长度、target标签 | 将多个源标签的值进行hash,作为target标签的值 |
labelmap | 标签名 | 标签名 | regex、replacement | Regex匹配名->replacement用原标签名的部分来替换名 |
replace是缺省action,可以不配置action
使用labeldrop 和labelkeep Relabel后需要注意保证metrics+labels唯一
regex 和 replacement 参数详解
regex 正则匹配字段是标签名、标签值具体看上面的表格, Replacement会用到了正则捕获组(需要自行补充相关知识)来替换相应的值(标签名、值)
如何查看源标签
从prometheus-》status-》service Discovery
过滤target
- 使用keep,保留标签值匹配regex的targets
scrape_configs:
- …
- job_name: "cephs"
relabel_configs:
- action: keep
source_labels:
- __address__
regex: ceph01.*
relabel结果可以在Prometheus网页的status/ Service Discovery中查看
- 使用drop,丢弃匹配regex的targets
scrape_configs:
- …
- job_name: "cephs"
relabel_configs:
- action: drop
source_labels:
- __address__
regex: ceph01.*
删除标签
将标签名为job的标签删除
scrape_configs:
- …
- job_name: "cephs"
relabel_configs:
- regex: job
action: labeldrop
labelKeep和labeldrop不操作’__’开头的标签,要操作需要先改名
修改label名
使用replace将scheme标签改名为protocol
scrape_configs:
- …
- job_name: "cephs"
relabel_configs:
- source_labels:
- __scheme__
target_label: procotol
这里可以是多个source_labels,只有值匹配到regex,才会进行替换
- 使用labelmap,将原始标签的一部分转换为target标签,这一功能replace无法实现
scrape_configs:
- …
- job_name: "sd_file_mysql"
file_sd_configs:
- files:
- mysql.yml
refresh_interval: 1m
relabel_configs:
- action: labelmap
regex: (.*)(address)(.*)
replacement: ${2}
修改label值
配置k8s服务发现
scrape_configs:
- …
- job_name: "sd_k8s_nodes"
kubernetes_sd_configs:
- role: node
bearer_token_file: bearer_token
tls_config:
ca_file: ca.crt
namespaces:
names:
- default
api_server: https://master01:6443
服务发现完成后,默认node的port是10250,会无法取得数据,同通过relabel修改标签.
relabel_configs:
- source_labels:
- __address__
regex: (.*)\:10250
replacement: "${1}:10255"
target_label: __address__
多标签合并
标签合并,可以将多个源标签合并为一个目标标签,可以取源标签的值,也可以进行hash,用户target分组
- 在文件服务发现中,将标签filename=“mysql.yml” 和sd_type="file"合并为sd=”file;mysql.yml”,标签值使用分号连接
scrape_configs:
- …
- job_name: "sd_file_mysql"
file_sd_configs:
- files:
- mysql.yml
refresh_interval: 1m
relabel_configs:
- source_labels:
- sd_type
- filename
separator: ;
target_label: sd
- 将多个标签的值进行hash,形成一个target标签,只要target标签一致,则表示源标签一致,可以用来实现prometheus的负载均衡
scrape_configs:
- …
- job_name: "sd_file_mysql"
file_sd_configs:
- files:
- mysql.yml
refresh_interval: 1m
relabel_configs:
- action: hashmod
source_labels:
- __scheme__
- __metrics_path__
modulus: 64
target_label: hash_id
完整案例
以下是一个完整的relabel案例,这个案例包括
- 根据标签值过滤target
- 合并标签值,并进行正则匹配
- 修改标签名
- 直接添加标签名
这个案例说明源标签是可以重复使用的