实操|Prometheus Pushgateway 部署、推送与数据管理全流程

1、Pushgateway组件介绍

Pushgateway是Prometheus监控系统中的一个重要组件,它采用被动push的方式获取数据,由应用主动将数据推送到pushgateway,然后Prometheus再从Pushgateway抓取数据。Pushgateway可以单独运行在任何节点上,并不一定要运行在被监控的客户端上。

在某些特殊场景下,我们可以通过自定义编写脚本,把需要监控的数据push到pushgateway,然后Prometheus再从pushgateway拉取数据,最终实现数据汇总。

使用Pushgateway的场景:

  • Prometheus和target由于某些原因网络不能互通,导致 Prometheus 无法直接拉取各个 target 数据,此时,需要经由Pushgateway做中转代理。
  • 某些作业生命周期较短、批量任务等,没有足够的时间等待Prometheus抓取数据。所以可以先把数据推送到Pushgateway暂存,再让Prometheus来抓取。
  • 将多个节点数据汇总到 pushgateway, 如果pushgateway挂了,多个监控节点会受到影响。
  • 通过单个 Pushgateway监控多个实例时, Pushgateway将会成为单点故障和潜在瓶颈。
  • Pushgateway可以持久化推送给它的所有监控数据。 因此,即使你的监控已经下线,prometheus还会拉取到旧的监控数据,因此,需要手动清理pushgateway下老旧的数据。
2、pushgateway的安装和配置

https://prometheus.io/download/#pushgateway 下载对应版本的pushgateway二进制包即可。安装过程如下:

复制代码
[root@docker-server data]# tar zxvf pushgateway-1.5.1.linux-amd64.tar.gz
[root@docker-server data]# mv pushgateway-1.5.1.linux-amd64 /usr/local/pushgateway
[root@docker-server data]# cd /usr/local/pushgateway
[root@docker-server pushgateway]#./pushgateway --web.listen-address=:9091

编写service脚本启动pushgateway:

复制代码
[root@docker-server data]# cat /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@docker-server data]# systemctl  daemon-reload
[root@docker-server data]# systemctl  start pushgateway.service

验证端口监听

复制代码
ss -tulpn | grep 9091

接着,还需要配置Prometheus,在prometheus.yml文件中,增加如下内容:

复制代码
- job_name: "prometheus-gateway"
  honor_labels: true
  static_configs:
    - targets: ["192.168.38.148:9091"]

然后reload配置:

复制代码
[root@prometheus-server prometheus]# curl -XPOST localhost:9090/-/reload

最后,浏览器访问 IP:9091 验证pushgateway页面即可。

3、pushgateway的使用
(1)、推送数据格式

要推送数据到Pushgateway中,可以通过其提供的API接口来添加,默认推送URL地址为:

复制代码
http://<ip>:9091/metrics/job/<job-name>/<label-name>/<label-value>

其中job-name是必填项,是job标签的值,后边可以跟任意数量的标签&标签值对,一般会添加一个instance/标签来区分指标数据来源。

在推送的数据部分,格式定义如下:

复制代码
## TYPE metric_name type
metric_name{lable_name="label_value",...}  value

例如,推送一个group定义为{job="some_job"}的数据:

复制代码
echo "some_metric 3.14" | curl --data-binary @- http://192.168.38.148:9091/metrics/job/some_job
  • some_metric 3.14: 推送的键和值。
  • job/some_job:相当于指定job_name为job=some_job,多个标签直接往后添加即可。
  • data-binary:以二进制数据格式发送post请求 。

推送到Pushgateway之后,就可以刷新Pushgateway界面,看到对应数据了,除了 some_metric外,同时还新增了 push_time_secondspush_failure_time_seconds 两个指标,这两个是 PushGateway 系统自动生成的相关指标

访问192.168.38.148:9091/metrics查看

又例如:推送一个group定义为{job="some_job",instance="some_instance"}的数据:

复制代码
cat <<EOF | curl --data-binary @- http://192.168.38.148:9091/metrics/job/some_job/instance/192.168.38.148
# TYPE some_metric2 counter
some_metric2{label="val1"} 100
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF

重点,/metrics/job/some_job和 /metrics/job/some_job/instance/some_instance,它们都属于 some_job,但是,它们属于两个指标值,因为 instance 对二者做了区分。

注意:

Prometheus 会给每个抓取的指标附加一个 jobinstance 的标签,job 标签来自 scrape 配置,我们这里抓取 Pushgateway 的 job 标签为 job="prometheus gateway"instance 标签的值会自动设置为抓取目标的主机和端口,所以所有从 Pushgateway 抓取的指标都会有 Pushgateway 的主机和端口作为 instance 标签,但是这可能会和你附加推送到 Pushgateway 指标上的 jobinstance 标签冲突,这个时候 Prometheus 会将这些标签重命名为 exported_jobexported_instance

但是,在抓取 Pushgateway 时,通常不希望出现这种行为。更多的时候你可能更希望保留推送到 Pushgateway 的指标的 jobinstance 标签,这个时候我们只需要在 Pushgateway 的抓取配置中设置 honor_labels: true 即可。

(2)、复杂的数据的推送方法

如果一次性推送数据较多,可以将要推送的数据写到一个文件中,然后推送文件即可:

复制代码
# 创建指标文件
cat > /data/mydata.txt <<EOF
# TYPE http_request_total counter
# HELP http_request_total get interface request count with different code.
http_request_total{code="200",interface="/v1/save"} 1398
http_request_total{code="404",interface="/v1/delete"} 1
http_request_total{code="500",interface="/v1/save"} 2
# TYPE http_request_time gauge
# HELP http_request_time get core interface http request time.
http_request_time{code="200",interface="/v1/core"} 0.201
EOF

# 推送文件
curl -XPOST --data-binary @/data/mydata.txt http://192.168.38.148:9091/metrics/job/app/instance/app-192.168.38.148
(3)、编写采集脚本推送数据到Pushgateway

如果在某些特殊场景下,可以自写脚本,定时生成监控数据,然后推送到Pushgateway,例如下面脚本用来收集磁盘状态数据:

复制代码
mkdir -p /app/shell

cat > /app/shell/disk_usage_metris.sh <<EOF
#!/bin/bash
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 "# HELP disk_usage Disk usage percentage.\n# TYPE disk_usage gauge\n\$metrics" | curl --data-binary @- http://192.168.38.148:9091/metrics/job/pushgateway/instance/\$hostname
EOF

最后,将disk_usage_metris.sh脚本放到定时任务中,定期执行,例如:每1分钟推送一次数据,编辑crontab -e

复制代码
chmod +x /app/shell/disk_usage_metris.sh
crontab -e

* * * * *  /bin/bash /app/shell/disk_usage_metris.sh
(4)、删除数据
复制代码
# 删除某个instance下指标
curl -X DELETE http://192.168.38.148:9091/metrics/job/some_job/instance/192.168.38.148

# 删除整个job
curl -X DELETE http://192.168.38.148:9091/metrics/job/some_job

# 清空所有指标
curl -X PUT http://192.168.38.148:9091/api/v1/admin/wipe

说明:

  • 删除数据是以Group为单位的,Group由job name和URL中的label唯一标识。
  • 举例中删除{job="some_job"}数据的语句并不会删除{job="some_job",instance="some_instance"}的数据。因为属于不同的Group。如需要删除{job="some_job",instance="some_instance"}下的数据,需要指定完整标签。
  • 这里删除数据是指删除pushgateway中的数据,跟promethues没有关系。

要删除数据,还可以在pushgateway的web界面上完成。

(5)、PushGateway使用的注意事项
  • 指标值只能是数字类型,非数字类型报错。
  • 指标值支持最大长度为 16 位,超过16 位后默认置为 0
  • PushGateway 推送及 Prometheus 拉取时间:设置 Prometheus 每次从 PushGateway 拉取的数据,并不是拉取周期内用户推送上来的所有数据,而是用户最后一次 Push 到 PushGateway 上的数据,所以建议设置推送时间小于或等于 Prometheus 拉取的时间,这样保证每次拉取的数据是最新 Push 上来的。
4、PushGateway 数据持久化

默认 PushGateway 不做数据持久化操作,当 PushGateway 重启或者异常挂掉,导致数据的丢失,可以通过启动时添加 -persistence.file 和 -persistence.interval 参数来持久化数据。

例如:

复制代码
[root@docker-server data]# vi  /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 --web.enable-admin-api --persistence.file=/usr/local/pushgateway/pushgateway_persist_file --persistence.interval=2m
ExecStop=/usr/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

其中:

  • --persistence.file:指定持久化文件路径或名称。如果没有指定存储,则监控指标仅保存在内存中,若出现pushgateway重启或意外故障,便会导致数据丢失。默认情况下,持久化文件每5分钟写一次。
  • --persistence.interval:重新设置写入文件的时间间隔。

以上就是基于192.168.38.148 Prometheus环境,完整复刻Pushgateway的全部实操步骤,从安装部署、配置持久化,到指标推送、定时采集和数据删除,每一步都可直接复制执行,避开了标签冲突、数据丢失、指标异常等常见坑点。Pushgateway作为Prometheus的重要补充,完美解决了短周期任务监控、跨网络指标采集的痛点,但需注意单点故障风险和旧指标清理问题。如果在实操中遇到端口监听失败、Prometheus拉取异常、脚本执行报错等问题,欢迎在评论区留言,一起交流排查思路,也可以收藏本文,后续用到时直接查阅即可。

相关推荐
苏州IT威翰德3 小时前
跨城光缆上的“急诊室”:一次沪、锡、常三地联动的服务器生死时速
运维·服务器
Yingjun Mo3 小时前
2. AI 智能体工作流的自动化自主设计(ADAS)
运维·人工智能·自动化
2601_954706493 小时前
2026 上半年云手机实测:红手指 / 傲晨云 / ACE / 易舜云横向对比
运维·服务器·智能手机
z202305083 小时前
RDMA 之RoCEv2 的报文格式(5)
linux·服务器·网络·人工智能
银河麒麟操作系统3 小时前
【银河麒麟高级服务器操作系统】top命令详解
运维·服务器
William.csj3 小时前
Linux——查看cuda版本的全面方法
linux·运维·服务器
仙柒4158 小时前
Docker原理
运维·docker·容器
茉莉玫瑰花茶11 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
Cat_Rocky12 小时前
Kubernetes集群升级指南以及自动更新证书
云原生·容器·kubernetes