03_Pushgateway使用&Prometheus的服务发现机制
1.Pushgateway使用
1.1pushgateway组件介绍
pushgateway是prometheus监控系统中的一个重要组件,他采用被动push的方式获取数据,由应用主动将数据推送到pushgateway,然后prometheus再从pushgateway中抓取数据。Pushgateway可以单独运行在任何的节点上,并不是一定要在监控的客户端上。

使用Pushgateway的场景
- Prometheus和target由于网络原因不能互传,导致Prometheus无法拉取各个target数据,因此要pushgateway做中转代理
- 某些作业生命周期较短,没有足够的时间等待Prometheus抓取数据,可以先把数据推送到Pushgateway暂存中。。
使用Pushgateway的缺点
- 将多个节点数据汇总到pushgateway,如果pushgateway挂了,将多个节点受到影响。
- pushgateway也会成为单点的故障和潜在瓶颈
- 手动清理pushgateway下的老旧数据
1.2pushgateway的安装配置
- 安装对应的pushgateway的源码包

-
安装配置和启动的service脚本如下
[root@prometheus-333 ~]# tar -xf pushgateway-1.11.1.linux-amd64.tar.gz -C /usr/local/
[root@prometheus-333 pushgateway-1.11.1.linux-amd64]# ll
total 20912
-rw-r--r--. 1 1001 1002 11357 Apr 9 2025 LICENSE
-rw-r--r--. 1 1001 1002 487 Apr 9 2025 NOTICE
-rwxr-xr-x. 1 1001 1002 21394840 Apr 9 2025 pushgateway[root@prometheus-333 local]# vim /usr/lib/systemd/system/pushgateway.service
[Unit]
Description=prometheus pushgateway
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/pushgateway/pushgateway --web.listen-address=:9091
ExecStop=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target[root@prometheus-333 local]# systemctl daemon-reload
[root@prometheus-333 local]# systemctl start pushgateway检查看看------------------暴露9091端口
tcp LISTEN 0 2048 *:9091 : users:(("pushgateway",pid=2061,fd=3))
-
配置Prometheus.yaml文件
- job_name: "prometheus gateway" static_configs: - targets: ["172.16.213.26:9091"]
1.3pushgateway使用
- 推送数据格式
要推送数据到pushgateway中可以直接使用提供的API接口来进行添加
http://<ip>:9091/metrics/job/<job-name>/<label-name>/<label-value>
-
job-name是必需填的,job是标签的值,后面可以跟任意数量的标签对应的值
-
推送部分数据如下
TYPE metric_name type
metric_name{lable_name="label_value",...} value
要删除group定义为{job="some_job"}下some_instance实例的所有数据:
curl -X DELETE http://172.16.213.26:9091/metrics/job/some_job/instance/some_instance
删除group下的所有数据:
curl -X DELETE http://172.16.213.26:9091/metrics/job/some_job
删除所有group下的所有metrics(启动pushgateway时需加上命令⾏参数 --web.enable-admin
api )
2.Prometheus的服务发现机制
Prometheus是基于pull模式监控数据,首先要能够发现需要监控的目标对象,就会有两种方法,1.静态手工配置,2.动态服务发现配置
- 对于小型环境来说,通过static_configs静态指定各Target便能解决问题,
- 对于动态性较强得云环境来说,就要用到动态服务发现机制
- 为了适应静态和动态发现机制,Prometheus引⼊⼀个中间的代理⼈(服务注册中⼼),这个代理⼈掌=握着当前所有监控⽬标的访问信息,Prometheus只需要向这个代理⼈询问有哪些监控⽬标即可, 这种模式被称为服务发现(service discovery)。
prometheus⽀持多种服务发现,⽬前已⽀持多达⼆⼗多种服务发现协议,常⻅的有:
kubernetes_sd_configs: kubernetes服务发现,让prometheus动态发现kubernetes中被监控
的⽬标。
static_configs: 静态服务发现,基于prometheus配置⽂件指定监控⽬标
dns_sd_configs: DNS服务发现监控⽬标
consul_sd_configs: Consul服务发现,基于consul服务动态发现监控⽬标
file_sd_configs: 基于指定的⽂件事先服务发现,prometheus定时读取⽂件如果发⽣变化则加载
2.1静态配置的局限性
静态服务发现机制,配置简单,但是监控目标是写在配置文件中,如要新增,修改。。。都需要每一次的修改配置文件,然后通过Prometheus重新加载,这样太麻烦了。于是出现了动态服务发现。
- 静态服务适合于小型环境
2.2文件动态发现服务
通过定义一组资源配置文件,yaml文件只需要存储target信息,这种方式可以被prometheus实时的动态获取到,不需要重新启动prometheus服务
-
修改prometheus.yml配置文件
- job_name: 'node_service_discovery' file_sd_configs: - files: - targets/*.json refresh_interval: 60s - files: - targets/*.yaml refresh_interval: 60s -
定义一个服务发现targets/node.yaml文件
- targets:
- "10.0.0.88:9100"
labels:
app: node-exporter
job: nodes
- "10.0.0.88:9100"
- targets:
-
重新启动prometheus

-
这里就发现了服务,就不需要每一次都去修改prometheus.yml文件
-
但是还是要写文件,有没有不需要的。有的有的老弟包有的这就是接下来讲的consul服务发现机制
2.4基于consul的服务发现
consul是基于Go开发的工具,提供了注册,发现服务...多数中心和分布式一致性保证功能一致。之前通过prometheus监控服务发现支持了Consul
- 安装consul
可以使用2进制安装和docker安装。consul官网(https://www.consul.io/downloads)这里我们用docker方式安装
docker run -d -p 8500:8500 --restart=always -v /data/consul/data:/consul/data --name=consul hashicorp/consul:1.21 agent -server -bootstrap -ui -node=dc1 -client='0.0.0.0'
参数含义
-
agent:表示启动Agent进程
-
server:表示启动Consul Server模式
-
client:表示启动Consol Client模式
-
bootstrap:表示这个节点是Server-leader
-
每个数据中⼼只能运⾏⼀台服务器。技术⻆度上
讲 Leader 是通过 Raft 算法选举的,但是集群第⼀次启动时需要⼀个引导 Leader,在引导群集后,建议不要使⽤此标志。
-
ui: 表⽰启动 Web UI 管理器,默认开放端⼝ 8500,所以上⾯使⽤ Docker 命令把 8500 端⼝对外开放。
-
node: 节点的名称,集群中必须是唯⼀的,默认是该节点的主机名。
-
client: consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0

-
Consul服务注册提供了两种注册⽅法:⼀种是定义配置⽂件服务注册⽅法,即在配置⽂件中定义服务来进⾏注册;⼀种是HTTP API服务注册⽅法,即在启动服务后,⾃⾝通过调⽤API进⾏⾃我注册。这⾥介绍第⼆种,consul主要是添加和删除命令,都是使⽤接⼝调⽤。先创建test.json⽂件,内容如下:
{
"id": "node-exporter",
"name": "node-exporter-172.16.213.28",
"address": "10.0.0.88",
"port": 9100,
"tags": ["test"],
"checks": [{
"http": "http://10.0.0.88:9100/metrics",
"interval": "5s"
}]
} -
执行如下命令
curl --request PUT --data @test.json http://10.0.0.88:8500/v1/agent/service/register
-
配置prometheus实现自动发现
现在 Consul 服务已经启动完毕,并成功注册了⼀个服务,接下来,我们需要配置 Prometheus 来使⽤Consul ⾃动服务发现,⽬的就是能够将上边添加的服务⾃动发现到 Prometheus 的 Targets 中,增加prometheus.yml 配置如下:
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: '10.0.0.88:8500'
services: []
- 基于DNS服务发现
⾸先,需要部署好⼀个DNS服务,并且配置好A记录与SRV记录,接着,将prometheus-server所在主机的dns设置为刚刚部署好的dns,dns配置好解析记录如下:
> server 172.16.213.40
Default server: 172.16.213.40
Address: 172.16.213.40#53
> set type=srv
> _prometheus._tcp.iivey.com
Server: 172.16.213.40
Address: 172.16.213.40#53
_prometheus._tcp.iivey.com service = 10 10 9100 node1.iivey.com.
_prometheus._tcp.iivey.com service = 10 10 9100 master.iivey.com.
修改prometheus.yaml
[root@localhost ~]# vi /usr/local/prometheus/prometheus.yml
......
- job_name: "dns-server-monitor"
dns_sd_configs:
- names: ['_prometheus._tcp.iivey.com']
curl -X POST http://172.16.213.35:9090/-/reload