一、prometheus中pushgateway组件的介绍与安装部署
1.1、pushgateway组件简介
Pushgateway是Prometheus监控系统中的一个重要组件,它采用被动push的方式获取数据(即:由应用主动将数据推送到pushgateway中存储,prometheus再从pushgateway里抓取数据)。**pushgateway可以单独运行在任何节点上,并不一定要运行在被监控的客户端上。**如下图所示:

1.2、pushgateway的使用场景与缺点
|--------|-----------------------------------------------------------------------------------------------|
| 对于【网络只能出不能进】或者【瞬时或批量作业】场景使用pushgateway模式是最佳的。 在如上的特殊场景下,可以通过编写自定义脚本,将需要监控的数据推送(push)到pushgateway中,然后prometheus在从pushgateway中拉取数据,从而实现数据的汇总。 ||
| 序号 | pushgateway的使用场景 |
| 1 | prometheus与需监控的目标(target)由于某些原因网络不能互通,导致prometheus无法直接拉取各个目标(target)数据时,可以经过pushgateway做中转代理。 |
| 2 | 在【作业生命周期较短】【批量任务】等没有足够时间等待prometheus抓取数据时,可以先把数据推送到pushgateway暂存,再让prometheus来抓取。 |
| ||
| 序号 | pushgateway的缺点 |
| 1 | 将多个节点数据汇总到 pushgateway中,若pushgateway挂了,则多个监控节点都会受到影响。 |
| 2 | 通过单个 pushgateway监控多个实例时, pushgateway将会成为单点故障和潜在瓶颈。 |
| 3 | pushgateway可以持久化推送给它的所有监控数据。 因此,即使你的监控已经下线,prometheus还会拉取到旧的监控数据,因此,需要手动清理pushgateway下老旧的数据。 |
[pushgateway的使用场景与缺点]
1.3、pushgateway的安装部署
可在Download | Pushgateway界面下载pushgateway组件的二进制安装包

bash
#pushgateway的下载安装
#1-下载pushgateway的二进制安装包
wget https://github.com/prometheus/pushgateway/releases/download/v1.11.2/pushgateway-1.11.2.linux-amd64.tar.gz -c -P /data
#2-解压下载好的pushgateway
cd /data
tar -zxvf pushgateway-1.11.2.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv pushgateway-1.11.2.linux-amd64 pushgateway-1.11.2
cd pushgateway-1.11.2/
ls
#3-编写操作pushgateway的服务
vi /usr/lib/systemd/system/pushgateway.service
#【/usr/lib/systemd/system/pushgateway.service】文件的完整内容如下:
[Unit]
Description=prometheus pushgateway
Documentation=https://github.com/prometheus/pushgateway
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/pushgateway-1.11.2/pushgateway --web.listen-address=:9091 --web.enable-admin-api
ExecStop=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
#4-启动pushgateway后并设置开机自启
systemctl daemon-reload
systemctl start pushgateway.service
systemctl status pushgateway.service
ps -ef | grep pushgateway
netstat -antlp | grep pushgateway
systemctl enable pushgateway.service
#5-打开浏览器访问【IP:9091】查看(注意:若是没法在浏览器打开访问则需要检查防火墙放开9091端口)
ip a
firewall-cmd --list-port
firewall-cmd --zone=public --add-port=9091/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port






1.4、prometheus中静态添加pushgateway配置
若需要将pushgateway配置为prometheus自动发现可查看《Prometheus+Grafana构建云原生分布式监控系统(七)》
bash
#prometheus中静态添加pushgateway配置
#1-进入prometheus路径编辑其配置文件【prometheus.yml】
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下添加pushgateway静态节点
scrape_configs:
config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
# The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
labels:
app: "prometheus"
- job_name: "pushgateway"
static_configs:
- targets: ["192.168.1.25:9091"]
labels:
app: "pushgateway"
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的【pushgateway】节点及其状态【up】表示在线【down】表示离线。




二、pushgateway的使用
2.1、推送到pushgateway的数据格式
|--------|---------------|------------------------------------------------------------|
| bash #推送到pushgateway的数据格式 http://<ip>:9091/metrics/job/<job-name>/<label-name>/<label-value> |||
| 序号 | 推送的数据格式参数 | 说明 |
| 1 | job-name | 是job标签的值,后面可以跟上任意数量的标签及其标签键值对;一般会添加一个instance/标签来区分指标数据来源。 |
| |||
| 3 | | |
| bash #推送数据的格式 metric_name{lable_name="label_value",...} value #推送数据示例1(如:推送的键是【ck_testjob】值是【26.126】的数据且属于cktest组【 #但是这样推送的instance对应的值是不对的(用了pushgateway所在主机的IP)】) echo "ck_testjob 26.126" | curl --data-binary @- http://192.168.1.25:9091/metrics/job/cktest 《1》"ck_testjob 26.126" 表示推送的键【ck_testjob】和值【26.126】; 《2》job/cktest 表示job_name是【job=cktest】,多个标签值则直接往后添加即可; 《3》data-binary 表示以二进制格式发送post请求。 注意:除【ck_testjob】指标外,同时还新增了【push_time_seconds】和【push_failure_time_seconds】两个指标,这两个是 PushGateway 系统自动生成的相关指标。
|||
| bash #推送数据示例2(如:推送的键是【ck_testjob】值是【26.126】的数据且属于{job="cktest",instance="192.168.1.9"}组 #一次发送多条数据到{job="cktest",instance="192.168.1.9"}组中 cat <<EOF | curl --data-binary @- http://192.168.1.25:9091/metrics/job/cktest/instance/192.168.1.9 # TYPE some_metric counter ck_test2{label="val1"} 2626 # TYPE another_metric gauge # HELP another_metric Just an example. ck_metrics 2026.126 EOF
注意:【/metrics/job/cktest】和【/metrics/job/cktest/instance/192.168.1.9】它们都属于【cktest】,但是它们属于两个指标值,因为 instance 对二者做了区分。 |||
[推送到pushgateway的数据格式]
注意: Prometheus 会给每个抓取的指标附加一个 job 和 instance 的标签,job 标签来自 scrape 配置,我们这里抓取 Pushgateway 的 job 标签为 job="prometheus gateway",instance 标签的值会自动设置为抓取目标的主机和端口,所以所有从 Pushgateway 抓取的指标都会有 Pushgateway 的主机和端口作为 instance 标签,但是这可能会和你附加推送到 Pushgateway 指标上的 job 和 instance 标签冲突,这个时候 Prometheus 会将这些标签重命名为 exported_job 和 exported_instance。但是,在抓取 Pushgateway 时,通常不希望出现这种行为。更多的时候你可能更希望保留推送到 Pushgateway 的指标的 job 和 instance 标签,这个时候我们只需要在 Pushgateway 的抓取配置中设置 honor_labels: true 即可。
bash
#解决prometheus中抓取的pushgateway里面的数据直接使用现有的instance值
#prometheus中静态添加的pushgateway配置里新增【honor_labels: true】
#1-进入prometheus路径编辑其配置文件【prometheus.yml】
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下修改pushgateway静态节点
scrape_configs:
config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
# The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
labels:
app: "prometheus"
- job_name: "pushgateway"
honor_labels: true
static_configs:
- targets: ["192.168.1.25:9091"]
labels:
app: "pushgateway"
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的【pushgateway】节点及其状态【up】表示在线【down】表示离线。




2.2、复杂数据推送到pushgateway
如果一次性推送数据较多,可以将要推送的数据写到一个文件中,然后推送文件即可:
bash
#复杂数据的推送示例
#1-将需推送的数据写入文件中
vi cktestdata.txt
#【cktestdata.txt】文件的完整内容如下:
# TYPE http_request_total counter
# HELP http_request_total get interface request count with different code.
http_request_total{code="200",interface="/v1/save"} 1679
http_request_total{code="404",interface="/v1/delete"} 6
http_request_total{code="500",interface="/v1/save"} 3
# TYPE http_request_time gauge
# HELP http_request_time get core interface http request time.
http_request_time{code="200",interface="/v1/core"} 0.362
#2-将数据文件推送到pushgateway中
curl -XPOST --data-binary @cktestdata.txt http://192.168.1.25:9091/metrics/job/app/instance/app-192.168.1.9
#3-在pushgateway【192.168.1.25:9091】的metrics下可以查看到对应的app组及其相关数据内容




2.3、编写采集脚本定时推送数据到pushgateway
shell脚本编程(九)_awk
https://coffeemilk.blog.csdn.net/article/details/156954391shell脚本编程(七)-列表for循环
https://coffeemilk.blog.csdn.net/article/details/156889172linux的定时任务
https://blog.csdn.net/xiaochenXIHUA/article/details/149882125
在一些场景下,可以自定义一些脚本采集数据,然后推送到pushgateway。
bash
#编写采集脚本定时推送数据到pushgateway
#示例:实现获取Linux主机的磁盘使用状态数据定时推送到pushgateway
#1-编写获取Linux主机磁盘使用状态数据的shell脚本
vi disk-usage-status.sh
#【disk-usage-status.sh】文件的完整内容如下:
#!/bin/bash
#filename=disk-usage-status.sh
hostname=`hostname -f | cut -d '.' -f1`
metrics=""
for line in `df |awk 'NR>1{print $NF "=" int($(NF-1))}'`
do
disk_name=`echo $line|awk -F'=' '{print $1}'`
disk_usage=`echo $line|awk -F'=' '{print $2}'`
metrics="$metrics\ndisk_usage{instance=\"$hostname\",job=\"disk\",disk_name=\"$disk_name\"} $disk_usage"
done
echo -e "#Get the disk usage of a Linux host.\n$metrics" | curl --data-binary @- http://192.168.1.25:9091/metrics/job/pushgateway/instance/$hostname
#2-先手动执行一次查看效果
bash /data/shell/disk-usage-status.sh
#3-手动执行成功后在将这个脚本放到定时任务中,定期执行(如实现每分钟执行1次)
crontab -e
* * * * * /bin/bash /data/shell/disk-usage-status.sh
#查看定时任务的最新执行日志
tail -f /var/log/cron







2.4、删除pushgateway中的数据
|--------|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 删除pushgateway中的数据 | 说明 |
| 1 | 删除指定组数据 | 直接在pushgateway的web界面【ip:9091】的Metrics下选中需删除的组点击【Delete Group】按钮删除即可,如下图所示:
|
| 1 | 删除指定组数据 | bash #直接调用接口删除指定组 #示例1:删除job="cktest"命令 curl -X DELETE http://192.168.1.25:9091/metrics/job/cktest #2-示例2:删除job="cktest" instance="192.168.1.9"命令 curl -X DELETE http://192.168.1.25:9091/metrics/job/cktest/instance/192.168.1.9
|
| 2 | 删除所有group下的 所有metrics数据 | 注意:在删除所有group下的所有metrics数据前需要给pushgateway在启动时需添加上【--web.enable-admin-api 】参数,并重启该pushgateway服务。 bash #删除所有group下的所有metrics数据命令 curl -X PUT http://192.168.1.25:9091/api/v1/admin/wipe
|
| 说明: 《1》删除数据是以组(Group)为单位的,Group由job name和URL中的label唯一标识; 《2》如上删除示例中的删除{job="cktest"}数据的语句并不会删除{job="cktest",instance="192.168.1.9"}的数据。因为属于不同的Group。如需要删除{job="cktest",instance="192.168.1.9"}下的数据,需要指定完整标签。 《3》这里删除数据是指删除pushgateway中的数据,跟promethues没有关系。 |||
[删除pushgateway中的数据]
2.5、pushgateway使用的注意事项
|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | pushgateway使用的注意事项 |
| 1 | 指标值只能是数字类型,非数字类型报错。 |
| 2 | 指标值支持最大长度为 16 位,超过16 位后默认置为 0 |
| 3 | pushgateway 推送及 prometheus 拉取时间:设置 Prometheus 每次从 PushGateway 拉取的数据,并不是拉取周期内用户推送上来的所有数据,而是用户最后一次 Push 到 PushGateway 上的数据; 所以建议设置推送时间小于或等于 Prometheus 拉取的时间,这样保证每次拉取的数据是最新 Push 上来的。 《1》修改定时任务的时间: 《2》修改prometheus.yml里面关于pushgateway的job_name节点下的拉取间隔时间【添加( scrape_interval: 120s)参数后重启服务】
|
[pushgateway使用的注意事项]
三、pushgateway的数据持久化
pushgateway 默认是不做数据持久化操作的,这样当 pushgateway 重启或者异常挂掉,就会导致数据的丢失;不过可以通过 pushgateway 启动时添加【 --persistence.file 】和 【--persistence.interval】参数来持久化数据。
《1》【--persistence.file】参数是:指定持久化文件路径或名称。若没有指定存储,则监控指标仅保存在内存中,若出现pushgateway重启或意外故障,便会导致数据丢失。默认情况下,持久化文件每5分钟写一次。
《2》【--persistence.interval】参数是:重新设置写入文件的时间间隔(可以自定义时间)。
bash
#pushgateway的数据持久化
#1-修改pushgateway.service文件的中pushgateway启动时内容添加持久化参数
vi /usr/lib/systemd/system/pushgateway.service
#【/usr/lib/systemd/system/pushgateway.service】文件的完整内容如下:
[Unit]
Description=prometheus pushgateway
Documentation=https://github.com/prometheus/pushgateway
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/pushgateway-1.11.2/pushgateway --web.listen-address=:9091 --web.enable-admin-api --persistence.file=/usr/local/pushgateway-1.11.2/pushgateway_persist_file --persistence.interval=2m
ExecStop=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
#2-重启pushgateway服务
systemctl daemon-reload
systemctl restart pushgateway.service
#3-最后可以到指定的目录【/usr/local/pushgateway-1.11.2】查看在时间间隔内是否有持久化文件【pushgateway_persist_file】生成

