Relabel
在exporter的配置与集成环节,接触了文件的引入(动态服务发现方法之一)和relabel_configs
,看的一脸懵逼,所以去详细看了下,并记录一下。
replace&laabelmap
在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容:
在Prometheus的所有的实例中,都包含了一些默认的元数据(Metadata)标签,如下图
如: __address__
:当前Target实例的访问地址<host>:<port>
, 通常来说,Target以__
作为前置的标签是在系统内部使用的,有点像PY的私有方法,因此这些标签不会被写入到样本数据中,如果需要,可通过scrape_configs
进行操作
replace
一个简单的例子
scrape_configs:
- job_name: test
kubernetes_sd_configs:
- role: pod
api_server: http://xxxx.xx.xx:xxxx
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: ["__address__"]
target_label: "address"
#action: replace # 这个是默认的行为,如果未指定action,则为replace
将 source_labels
下 __address__
的值,赋值到标签为 addr
下。
除了使用replace
以外,还可以指定action
为labelmap
,labelmap会根据regex
的定义去匹配所有实例标签名称,并且以匹配到的内容为新的标签名,其值作为新标签的值
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
还可以使用labelkeep
和keepdrop
对标签进行过滤,是丢弃还是保留。
relabel_configs:
- regex: label_should_drop_(.+)
action: labeldrop
总结: 通过Relabeling机制,可以对prometheus实例的标签进行规范的管理与维护。有了标签的规范,后续就可按标签做很多事情
keep/drop
标签虽有了管理,但如果是通过配置中心或集群发现等,自动发现服务,server端若不做控制,将会发现所有的实例,这一点是我们不想看到的。比如我们在集群中加了个测试节点,或者有多个server,做业务区分等。此时可通过keep/drop行为,来做过滤。
scrape_configs:
- job_name: test
kubernetes_sd_configs:
- role: pod
api_server: http://xxxx.xx.xx:xxxx
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: ["__address__"]
regex: "192.168.2.133:10249"
action: keep
action设置为keep,会根据regex匹配后进行保留。若为drop则为丢弃
hashmod
scrape_configs:
- job_name: 'test'
relabel_configs:
- source_labels: [__address__]
modulus: 4
target_label: tmp_hash
action: hashmod
https://github.com/prometheus/prometheus/blob/main/model/relabel/relabel.go#L289
根据当前Target实例__address__的值以4作为系数,这样每个Target实例都会包含一个新的标签tmp_hash,并且该值的范围在1~4之间,查看Target实例的标签信息,可以看到如下的结果,每一个Target实例都包含了一个新的tmp_hash值