Prometheus是一套开源的系统监控报警框架,此前对Prometheus有过介绍Prometheus的介绍与实践,Prometheus会去各个监控节点Pull数据。现在存在一个问题,如何让Prometheus去新增的监控节点Pull数据。
本博主对Prometheus的服务发现机制亲自进行验证的方式有两种,一种是基于文件的服务发现;一种是基于Consul的服务发现。
基于文件的服务发现有三步:
1.在一个Json文件中定义被监控的主机列表信息;
2.在Prometheus的配置文件中关联这个Json文件,以及对这个文件的扫描周期;
3.如果有新增的监控节点,将监控节点的主机列表信息写入到Json文件中,Prometheus通过周期扫描就会发现新增的节点。
关于文件的服务发现的具体配置可以参考基于文件的服务发现
基于的Consul服务发现可以分为两步:
1.在Prometheus的配置中关联上Consul服务发现。
2.新增的节点向Consul进行注册,Prometheus便可添加上新增的服务。
关于Prometheus的服务发现的两种机制的细节本博客不做深入研究,下面将只会从Consul的安装、Prometheus的配置,新增服务的注册和解注册。
3.1 Consul的安装
docker pull consul //用docker拉取最新的镜像
docker run --name consul -d -p 8500:8500 consul //最简单的docker run命令,将consul镜像运行在docker容器中,并将容器端口8500映射到主机端口8500
3.2 在Prometheus的yml配置文件中关联Consul
Prometheus的配置参考文件如下:
- job_name: 'consul-prometheus'
consul_sd_configs:
#consul 地址
- server: 'xx.xx.xx.xx:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*prometheus-target.*
action: keep
relabel_configs在上述配置中起过滤作用:表示只有consul的service的tag为prometheus-target时才会被动态发现。
3.3 服务注册到Consul
服务注册到Consul需要编写一个Json文件或者Json信息,可以参考如下:
{
"ID": "userServiceId", //服务id
"Name": "userService", //服务名
"Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
"primary",
"v1"
],
"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
"Port": 8000, //服务注册consul的PORT,发现的就是这个PORT
"EnableTagOverride": false,
"Check": { //健康检查部分
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
"Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL
}
}
备注:在注册Consul的过程中,服务ID要求唯一,服务名可以相同,Tag用于对服务的信息进行标注。
直接使用上述Json进行注册:
curl http://10.240.185.2:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '
{
"ID": "userServiceId", //服务id
"Name": "userService", //服务名
"Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
"primary",
"v1"
],
"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
"Port": 8000, //服务注册consul的PORT,发现的就是这个PORT
"EnableTagOverride": false,
"Check": { //健康检查部分
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
"Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL
}
}'
将上述的信息保存成regitor.json文件后进行注册:
curl --request PUT --data @regitor.json http://localhost:8500/v1/agent/service/register
3.4 注册服务的查询
服务成功注册到Consul之后可以在Consul查看到所有注册的服务,也可以选择通过命令行进行查询注册的服务的结果状态,参考如下:
curl http://10.240.185.2:8500/v1/catalog/service/userService1 //userService1为查询的服务名
[
{
"ID": "7894fedb-9d68-0aa5-2f81-4dfb36ff575c",
"Node": "55d85741eea1",
"Address": "127.0.0.1",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "127.0.0.1",
"wan": "127.0.0.1"
},
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceKind": "",
"ServiceID": "userServiceId1",
"ServiceName": "userService1",
"ServiceTags": [
"primary",
"v1"
],
"ServiceAddress": "10.240.185.4",
"ServiceWeights": {
"Passing": 1,
"Warning": 1
},
"ServiceMeta": {},
"ServicePort": 9105,
"ServiceEnableTagOverride": false,
"ServiceProxyDestination": "",
"ServiceProxy": {},
"ServiceConnect": {},
"CreateIndex": 419,
"ModifyIndex": 419
}
]
3.5 服务解注册
在服务成功注册Consul之后,如果希望将服务从Consul解绑下来,可以考虑使用Consul的解绑命令,参考如下:
curl --request PUT http://localhost:8500/v1/agent/service/deregister/userService1 //为删除的服务名
另外Consul提供的其它操作API,可以参考Consul文档中列举的API接口。
1.Consul文档
2.Consul手册
3.Prometheus 通过consul动态修改Targets接入
4.CentOS7下利用docker搭建prometheus+grafana+consul监控环境