实操|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拉取异常、脚本执行报错等问题,欢迎在评论区留言,一起交流排查思路,也可以收藏本文,后续用到时直接查阅即可。

相关推荐
方便面不加香菜1 小时前
Linux--基础IO(一)
linux·运维·服务器
Jinkxs3 小时前
Prometheus - 监控微服务:Spring Boot 应用指标暴露与监控
spring boot·微服务·prometheus
张忠琳3 小时前
【client-go v0.36.1】(store Part 3)Store 超深度分析 — 集成模式、完整数据流、不变量、与 DeltaFIFO 协作
云原生·kubernetes·informer·store·client-go
鼎讯信通4 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..4 小时前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
跨境数据猎手5 小时前
大数据在电商行业的应用
大数据·运维·爬虫
linyanRPA6 小时前
影刀RPA店群自动化实战:多店铺活动自动报名与促销管理架构设计
运维·自动化·办公自动化·rpa·python脚本·爬虫自动化·店群自动化
mounter6256 小时前
现代 Linux 内存管理的演进与变革:从传统 LRU 到多代架构 MGLRU
linux·服务器·kernel
会Tk矩阵群控的小木6 小时前
安卓群控系统对于游戏工作室实战教程
android·运维·游戏·adb·开源软件·个人开发
赵渝强老师6 小时前
【赵渝强老师】Kubernetes(K8s)中的金丝雀升级
linux·docker·云原生·容器·kubernetes