prometheus基于consul的服务发现
consul在微服务中用于服务注册与发现的,在prometheus中也可以用于被监控对象的自动发现,这样就实现了在不修改prometheus配置文件、不重启的情况下,自动发现exporter并将其加入到监控范围
运行consul
可以去官网下载二进制安装包,但这里我还是推荐使用docker,快速上手
docker run -d --rm --name=consul -p 8500:8500 consul:1.15.4
浏览器访问 IP:8500 到consul的services页面,可见现在只有一个consul服务:
运行prometheus
修改默认配置文件为如下内容:
# ...
scrape_configs:- job_name: "prometheus"# 注释掉之前静态配置的内容
# static_configs:
# - targets: ["localhost:9090"]# 修改服务发现为 consul_sd_configs:consul_sd_configs:- server: 'consul_ip:8500'services: ['node_exporter']
启动prometheus容器:
docker run -d -p 9090:9090 -v $(pwd)/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml --name prometheus --rm bitnami/prometheus
浏览器访问 IP:9090 到prometheus的targets页面,目前也是一个target都没有
将node_exporter注册到consul
这里采用发HTTP请求的方式注册.先写一个注册的shell脚本
register_consul.sh:
#!/bin/bash
NodeExporterIP=""
NodeExporterPort=9200
ServiceID="node_exporter1" # 服务唯一标记,随便写,只要保证唯一就行,一般是uuid
ServiceName="node_exporter" # (一组)服务的名称consulIP=""
consulPort=8500curl -X PUT -d '{"id": "'$ServiceID'","name": "'$ServiceName'","address": "'$NodeExporterIP'","port": '$NodeExporterPort',"tags": ["node_exporter"],"checks": [{"http": "http://'$NodeExporterIP':'$NodeExporterPort'/metrics","interval": "10s"}]
}' http://$consulIP:$consulPort/v1/agent/service/register
注册脚本可以写到node_exporter的启动脚本中(比如systemctl的service或者单独的shell脚本),这样就能在node_exporter启动时,自动注册到consul
运行脚本后到consul和prometheus页面上就能发现刚刚注册的服务和target:
注销服务脚本,deregister_consul.sh:
#!/bin/bash
ServiceID="node_exporter1"consulIP=""
consulPort=8500curl -X PUT http://$consulIP:$consulPort/v1/agent/service/deregister/$ServiceID
服务从consul注销后,prometheus也会自动将其从targets中移除