Prometheus基于consul服务发现
安装consul
wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip unzip consul_1.5.3_linux_amd64.zip ./consul agent -dev
或者
docker run --name consul -d -p 8500:8500 consul
访问地址为: http://172.30.12.167:8500
添加测试注册服务,添加本机的node-exporter和另一台主机的cadvisor-exporter。
curl -X PUT -d '{"id": "node-exporter1","name": "node-exporter1-192.168.31.131","address": "192.168.31.131","port": 9100,"tags": ["test"],"checks": [{"http": "http://192.168.31.131:9100/metrics", "interval": "5s"}]}' http://192.168.31.131:8500/v1/agent/service/register
curl -X PUT -d '{"id": "cadvisor-exporter1","name": "cadvisor-exporter1-192.168.31.158","address": "192.168.31.158","port": 9200,"tags": ["test1"],"checks": [{"http": "http://192.168.31.158:9200/metrics", "interval": "5s"}]}' http://192.168.31.131:8500/v1/agent/service/register
注销服务,如果不需要继续监控注册到consul的某个服务,如node-exporter,通过如下命令删除
#curl -X PUT http://192.168.31.131:8500/v1/agent/service/deregister/node-exporter
更新Prometheus配置
[root@localhost prometheus]# vim /home/prometheus/prometheus.yml
global: # 全局设置,可以被覆盖
scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率
evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查
scrape_configs: # 抓取配置
#服务发现
- job_name: 'consul-prometheus'
consul_sd_configs: #基于服务发现类型
- server: '192.168.31.131:8500' #服务地址
relabel_configs:
- source_labels: [__meta_consul_tags] #注意两个下划线"__"
regex: .*,test,.* #匹配__meta_consul_tags值包含test的数据(即tags=test)
action: keep #丢弃__meta_consul_tags值中不包含test的数据
热加载prometheus
#curl -X POST http://localhost:9090/-/reload #热加载prometheus命令

自定义标签信息
Prometheus 允许用户在采集任务设置中,通过 relabel_configs 来添加自定义的 Relabeling 的额过程,来对标签进行指定规则的重写。Target 以 __ 作为前置的标签是在系统内部使用的。Prometheus 内部做了一次标签重写处理,所以 instance 标签的内容刚好对应 Target 实例的 __address__ 值。
详细 relabel_configs 配置及说明可以参考 relabel_config 官网说明。
- replace: 根据 regex 的配置匹配 source_labels 标签的值(注意:多个 source_label 的值会按照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${2} 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace。
- keep: 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
- drop: 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
- hashmod: 将 target_label 设置为关联的 source_label 的哈希模块
- labelmap: 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值
- labeldrop: 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
- labelkeep: 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签
上面的 relabel_configs 配置作用为丢弃源标签中 __meta_consul_tags 不包含 test 标签的服务,__meta_consul_tags 对应到 Consul 服务中的值为 "tags": ["test"],默认 consul 服务是不带该标签的,从而实现过滤。
下面进行标签自定义,并分组。
向 Meta Data 数据添加自定义标签信息
#vim /home/prometheus/config/consul-0.json
{
"ID": "node-exporter",
"Name": "node-exporter-192.168.31.131",
"Tags": [
"test"
],
"Address": "192.168.31.131",
"Port": 9100,
"Meta": {
"app": "spring-boot",
"team": "appgroup",
"project": "bigdata"
},
"EnableTagOverride": false,
"Check": {
"HTTP": "http://192.168.31.131:9100/metrics",
"Interval": "10s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
注:该 Json 文件为要注册的服务信息,同时往 Meta 信息中添加了 app=spring-boot,team=appgroup,project=bigdata 三组标签,目的就是为了方便告警分组使用。
注册服务
curl --request PUT --data @/home/prometheus/config/consul-0.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1

更新Prometheus.yml
- job_name: 'consul-prometheus'
consul_sd_configs: #基于服务发现类型
- server: '192.168.31.131:8500' #服务地址
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*,test,.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap

将自动发现的服务进行分类
可以通过服务 Tag 来进行匹配来创建不同的类型 exporter 分组,通过给每个服务标记不同的 Tag,然后通过 relabel_configs 来进行匹配区分。
注册服务
$ vim /home/prometheus/config/consul-1.json
{
"ID": "node-exporter",
"Name": "node-exporter-192.168.31.131",
"Tags": [
"node-exporter"
],
"Address": "192.168.31.131",
"Port": 9100,
"Meta": {
"app": "spring-boot",
"team": "appgroup",
"project": "bigdata"
},
"EnableTagOverride": false,
"Check": {
"HTTP": "http://192.168.31.131:9100/metrics",
"Interval": "10s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
# 更新注册服务
$ curl --request PUT --data @/home/prometheus/config/consul-1.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1
$ vim /home/prometheus/config/consul-2.json
{
"ID": "cadvisor-exporter",
"Name": "cadvisor-exporter-192.168.31.131",
"Tags": [
"cadvisor-exporter"
],
"Address": "192.168.31.131",
"Port": 9080,
"Meta": {
"app": "docker",
"team": "cloudgroup",
"project": "docker-service"
},
"EnableTagOverride": false,
"Check": {
"HTTP": "http://192.168.31.131:9080/metrics",
"Interval": "10s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
# 注册服务
$ curl --request PUT --data @/home/prometheus/config/consul-2.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1
更新Prometheus.yml
[root@localhost prometheus]# vim /home/prometheus/prometheus.yml
#文件发现
- job_name: 'file_ds' #任务名 全局唯一
file_sd_configs: #基于文件发现配置
- files: ['/etc/prometheus/config/*.yml'] #配置文件路径
refresh_interval: 5s #每五秒扫描刷新配置文件
#服务发现
- job_name: 'consul-node-exporter'
consul_sd_configs: #基于服务发现类型
- server: '192.168.31.131:8500' #服务地址
services: []
relabel_configs:
- source_labels: [__meta_consul_tags] #注意两个横杠"__"
regex: .*node-exporter.* #匹配__meta_consul_tags中值包含node-exporter的
action: keep #keep丢弃未匹配到regex中内容的数据
- regex: __meta_consul_service_metadata_(.+) #获取__meta_consul_service_metadata_的值(标签)
action: labelmap #将获取的值作为新的标签
- job_name: 'consul-cadvisor-exproter'
consul_sd_configs:
- server: '192.168.31.131:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*cadvisor-exporter.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap


浙公网安备 33010602011771号