一、Relabeling机制简介
前面讲了Prometheus的几种服务发现机制。通过服务发现的方式,可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息。
基于consul服务发现。 如何加lable标签?Prometheus能够按照某些规则(比如标签)从服务发现注册中心返回的Target实例中有选择性的采集某些Exporter实例的监控数据。
1.1 什么是Relabeling机制
在采集样本数据之前,对Target实例的标签(Metadata)进行重写的机制在Prometheus被称为Relabeling。Relabeling最基本的应用场景就是基于Target实例中包含的metadata标签,动态的添加或者覆盖标签
在采集任务设置中通过relabel_configs来添加自定义的Relabeling过程。如prometheus.yml下图:
之前配置过
因为要对Metadata标签进行重写,所以我们先来看下Metadata标签
1.2 默认Metadata标签
在Prometheus所有的Target实例中,都包含一些默认的Metadata标签信息。可以通过Prometheus UI的Targets页面中查看这些实例的Metadata标签的内容:
默认情况下,当Prometheus加载Target实例完成后,这些Target时候都会包含一些默认的标签: ● __address__:当前Target实例的访问地址<host>:<port>,如果在重新标记期间未设置标签,则默认将__address__标签值赋值给instance。 ● __scheme__:采集目标地址的协议,HTTP或者HTTPS ● __metrics_path__:采集目标服务访问地址的访问路径 ● __param_<name>:采集任务目标服务的中包含的请求参数 ● job:设置为job_name相应的抓取配置的值。 ● __scrape_interval__:scrape抓取数据时间间隔(秒) ● __scrape_timeout__: scrape超时时间(秒) 一般来说,Target以__作为前置的标签是在系统内部使用的,因此这些标签不会被写入到样本数据中。不过这里有一些例外,
例如,我们会发现所有通过Prometheus采集的样本数据中都会包含一个名为instance的标签,该标签的内容对应到Target实例的__address__。
这里实际上是发生了一次标签的重写处理。
2.Consul动态发现的metadata标签
通过Consul动态发现的服务实例还会包含以下Metadata标签信息:
● __meta_consul_address:consul地址
● __meta_consul_dc:consul中服务所在的数据中心
● __meta_consul_metadata:服务的metadata
● __meta_consul_health: 健康检查
● __meta_consul_node:服务所在consul节点的信息
● __meta_consul_service_address:服务访问地址
● __meta_consul_service_id:服务ID
● __meta_consul_service_port:服务端口
● __meta_consul_service:服务名称
● __meta_consul_tags:服务包含的标签信息
3.relabel_configs配置
source_labels:源标签,没有经过relabel处理之前的标签名字。
target_labels:通过relabel处理之后的标签名字。
separator:源标签的值的连接分隔符。默认是";"
module:取源标签值散列的模数
regex:正则表达式,匹配源标签的值。默认是(.*)
replacement:通过分组替换后标签(target_label)对应的值。默认是$1
action:根据正则表达式匹配执行的动作。默认是replace
● replace:替换标签值,根据regex正则匹配到原标签值,使用replacement来引用表达式匹配的分组
● keep:满足regex正则条件的实例进行采集,把source_labels中没有匹配到regex正则内容的target实例丢掉,即只采集匹配成功的实例
● drop:满足regex正则条件的实例不采集,把source_labels中没有匹配到regex正则内容的target实例丢掉,即只采集没有匹配成功的实例
● hashmod: 使用hashmod计算source_labels的hash值并进行对比,基于自定义的模数取模,以实现对目标进行分类、重新赋值等功能
● labelmap: 匹配regex所有标签名称,然后复制匹配标签的值进行分组,通过replacement分组引用($1,$2,...)替代
● labeldrop: 匹配regex所有标签名称,对匹配到的实例标签进行删除
● labelkeep: 匹配regex所有标签名称,对匹配到的实例标签进行保留
3.1 替换标签值
可以通过
replace
这个操作来完成,如果没有指定 action
字段,则默认就是 replace
注:源数据需要加[]
以便区分。目标数据不需要加。
# 案例1:
relabel_configs:
- source_labels: [__meta_consul_service_address]
target_label: __param_target
action: replace # 如果没有指定,数值默认就是这个
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.10.100:9115
源数据:__meta_consul_service_address="192.168.10.100"
会变成:target="192.168.11.62",instance="192.168.10.100",__adress__="192.168.10.100:9115/prod"
# 案例2
# 从Node Exporter实例采集上来的样本数据如下所示
node_load1{instance="test服务器", job="node_exporter"} 0.04
# 希望能有一个额外的标签dc,可以表示该样本所属的数据中心:
node_load1{instance="test服务器", job="node_exporter",dc="dc1"} 0.04
# relabel_config配置:
relabel_configs:
- source_labels: ["__meta_consul_dc"]
target_label: "dc"
源数据:__meta_consul_dc="dc1"
会变成:dc="dc1"
3.2 保留或丢弃对象
通过keep
或 drop
这两个动作可以来完成
# 案例1:
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*exporter.*
action: keep
源数据为:__meta_consul_tags=",exporter," 会保留。如果action: drop就相反
源数据为:__meta_consul_tags=",domain," 会丢弃,如果action: drop就相反
3.3 标签集映射
把源标签的值映射到一组新的标签中去,使用 labelmap
这个动作完成
# 案例
relabel_configs:
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
源数据为:__meta_consul_service_metadata_job="test"
会变成: job="test"
3.4 保留或删除标签
使用 labelkeep
和 labeldrop
这两个操作
relabel_configs:
- regex: job
action: labeldrop
数据:probe_success{instance="192.168.11.61:9090", job="consul_blackbox_tcp"}
变成:probe_success{instance="192.168.11.61:9090"}
action: labelkeep 刚好相反
4.consul案例
consul服务发现prometheus配置,可以使用下面的配置和http://192.168.10.14:9090/targets中标签labels比对了解
- job_name: 'consul_exporter'
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*exporter.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: ["__meta_consul_dc"]
target_label: "dc"
# Spring Boot 2.x 应用数据采集配置
- job_name: 'consul_springboot_demo'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*springboot.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
#http配置
- job_name: "consul-blackbox_http"
metrics_path: /probe
params:
module: [http_2xx]
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*blackbox_http.*
action: keep
- regex: job
action: labeldrop
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [__meta_consul_service_address]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.10.100:9115
#tcp检查配置
- job_name: "consul_blackbox_tcp"
metrics_path: /probe
params:
module: [tcp_connect]
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*blackbox_tcp.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [__meta_consul_service_address]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.10.100:9115
#icmp检查配置
- job_name: "consul_blackbox_icmp"
metrics_path: /probe
params:
module: [icmp]
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*blackbox_icmp.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [__meta_consul_service_address]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.10.100:9115
#域名检测
- job_name: consul_domain_exporter
scrape_interval: 10s
metrics_path: /probe
consul_sd_configs:
- server: '192.168.10.14:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*domain.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [__meta_consul_service_address]
target_label: __param_target
- target_label: __address__
replacement: 192.168.10.100:9222
135,25
curl调用consul api添加服务命令,可以看到tags、meta之类
curl -X PUT -d '{"id": "rabbitmq2","name": "rabbitmq_exporter","address": "192.168.10.100","port": 9419,"tags": ["exporter"],"meta": {"job": "rabbitmq_exporter","instance": "test服务器","env":"test"},"checks": [{"http": "http://192.168.10.100:9419/metrics", "interval": "5s"}]}' http://localhost:8500/v1/agent/service/register