Pushgateway 让 Prometheus 抓住 “一闪而过” 的脚本,搞定临时任务监控!cpolar 内网穿透实验室第 744 个成功挑战

0 阅读14分钟

在这里插入图片描述

软件名称: Pushgateway(Prometheus 官方配套工具)

操作系统支持: Linux(CentOS/Ubuntu/Debian 等)、Windows(需适配命令)、macOS,本文演示环境为 CentOS Linux release 7.9.2009 (Core),Docker 部署跨系统通用。

软件介绍

Pushgateway 是 Prometheus 的 “专属收件箱”—— 大家都知道 Prometheus 是 “被动拉数据” 的性格,只能盯着长期运行的服务(比如网站、数据库)薅指标,但那些 “来无影去无踪” 的临时任务(备份脚本、CI/CD 测试、数据批处理),刚执行完就溜了,Prometheus 根本 “抓不到”。而 Pushgateway 就是专门给这些 “短命任务” 留的 “快递柜”,让任务主动把执行指标(比如跑了多久、成没成功、处理了多少数据)推过来,Prometheus 再慢悠悠从 “快递柜” 里取数据,完美补上 Prometheus 监控的 “最后一块短板”。

在这里插入图片描述

Pushgateway 的出色功能

Pushgateway 最牛的本事,就是 “接住” 所有 Prometheus 抓不到的 “漏网之鱼”:

  • 「临时任务收纳」:不管是跑 30 秒的 Shell 脚本,还是 5 分钟的 Python 批处理,只要任务执行完,就能把关键指标(耗时、成功率、处理量)推给它,不会让任何一次任务执行 “查无此据”;
  • 「兼容所有脚本语言」:Shell、Python、Java 随便写,一行 curl 命令或几行代码就能推送指标,不用改复杂的监控逻辑;
  • 「无缝对接 Prometheus」:不用改 Prometheus 核心配置,加几行代码就能让 Prometheus 定期从 Pushgateway 拉数据,和原有监控体系完美融合;
  • 「指标灵活管理」:想删某个任务的指标、清某个实例的数据,简单的 API 调用就能搞定,不用重启服务、不用删配置文件。

在这里插入图片描述

实用场景

场景 1:备份脚本监控(运维刚需)

  • 痛点:每天凌晨的服务器备份脚本,执行成功 / 失败全靠 “碰运气”,一旦失败,第二天业务数据丢失才发现,追责都找不到原因;
  • 爽点:给备份脚本加几行代码,执行完自动把 “备份耗时”“成功状态” 推到 Pushgateway,Prometheus 实时监控,失败就告警,运维再也不用当 “背锅侠”,凌晨脚本执行情况躺床上都能看。

场景 2:CI/CD 流水线任务监控(开发刚需)

  • 痛点:公司 CI/CD 流水线里的测试任务,跑在内网服务器,每次执行是否通过、耗时多久,异地开发只能靠 “口头汇报”,调试时要远程连内网,操作繁琐;
  • 爽点:流水线任务结束后,自动推送 “测试用例通过率”“构建耗时” 到 Pushgateway,再用 cpolar 把 Pushgateway 映射到公网,异地同事直接打开浏览器就能看数据,不用连 VPN、不用改网络配置,沟通效率直接拉满。

在这里插入图片描述

cpolar 内网穿透技术带来的便利

本来 Pushgateway 再好用,也逃不开 “内网牢笼”—— 没有公网 IP 的话,只能在公司 / 家里的局域网里看监控数据,一旦离开这个网络,想查个指标比登天还难。而 cpolar 就像给 Pushgateway 开了一扇 “任意门”,不用申请公网 IP、不用改防火墙、不用找网管开端口,就能把内网的 Pushgateway 服务映射到公网上,带来的便利多到数不过来:

  1. 远程监控不设限:不管你是在咖啡厅、出差酒店,还是回老家,只要有网,就能用手机 / 电脑访问 Pushgateway 看临时任务的监控数据,再也不用 “绑” 在公司内网里;
  2. 跨团队协作更丝滑:异地的同事、客户想查看 Pushgateway 里的任务指标,不用你远程协助、不用发一堆截图,直接甩给他 cpolar 生成的公网地址,点开就能看,演示 / 排查问题效率翻倍;
  3. 不用折腾网络配置:运维不用再跟网管扯皮要公网 IP,不用手动配置端口映射、改路由表,cpolar 一键生成加密的公网地址,既安全又不用动原有网络架构,小白也能 5 分钟搞定;
  4. 成本几乎为 0:cpolar 有免费版,满足个人 / 中小企业的远程访问需求,不用买云服务器、不用租公网 IP,搭一套能远程访问的 Pushgateway 监控体系,一分钱不用花;
  5. 稳定不翻车:cpolar 生成的地址可以固定(二级子域名),不用每次重启服务都改地址,不管是脚本推送指标,还是 Prometheus 拉数据,都能稳稳连接,不会因为地址变了导致监控断联。

在这里插入图片描述

总结

Pushgateway 就像 Prometheus 的 “补漏神器”,把原本监控不到的临时任务、短命脚本全都纳入监控体系,让每一次脚本执行、每一个批处理任务都有 “数据可查、状态可追”;而 cpolar 则是 Pushgateway 的 “翅膀”,打破了内网的限制,让原本只能在局域网里用的监控服务,变成 “随时随地能访问、跨团队能共享” 的通用工具。

对运维来说,不用再担心临时任务 “失控”;对开发来说,不用再为了演示监控数据跑回公司;对中小企业来说,花最少的成本就能搭建一套完整的、能远程访问的临时任务监控体系 —— 这就是 Pushgateway+cpolar 的组合魅力:把复杂的监控问题变简单,把内网的工具变 “通用”,让技术人少走弯路、少踩坑。

用Pushgateway让Prometheus无懈可击的教程在下面,有需要的朋友照做即可。

本文将带你深入理解Pushgateway的工作原理,手把手部署配置,并通过Shell脚本、Python任务等真实场景演示如何上报关键指标。让每一次临时任务的执行,都不再是“黑盒”——因为Prometheus,现在也能收到它们的“信”了。

0935cd9c73984ad0e7eccad4e28628bc

1.安装条件

本次演示环境,我是在虚拟机上安装Linux系统来执行操作,以下是安装的软件及版本:

Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2) System: entOS Linux release 7.9.2009 (Core) Docker: 26.1.4 Prometheus: v3.5.0 PushGateway: 1.0.0 没有prometheus的小伙伴可以参考cpolar官网这篇文章《监控不再局域网!Cpolar 让 Prometheus 走出内网限制!》

2.PushGateway安装配置

2.1 二进制包安装

访问官网,下载二进制包,下载linux版本的:

image-20260129143748979

下载完成后,上传到/app目录下:

image-20260129143855857

上传成功后,我们为它解压:

tar -zxvf pushgateway-1.11.2.linux-amd64.tar.gz

image-20260129143943480

我这里为它重命名并删除压缩文件:

mv pushgateway-1.11.2.linux-amd64 pushgateway
rm -rf pushgateway-1.11.2.linux-amd64.tar.gz

image-20260129144055309

创建systemd服务文件:

sudo vim /etc/systemd/system/pushgateway.service
[Unit]
Description=Pushgateway for Prometheus
Documentation=https://github.com/prometheus/pushgateway
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/app/pushgateway/pushgateway \
  --web.listen-address=:9091 \
  --web.enable-admin-api \
  --log.level=info
WorkingDirectory=/app/pushgateway
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=pushgateway

[Install]
WantedBy=multi-user.target

image-20260129145533704

设置文件权限(确保二进制文件可执行,且属主正确):

sudo chown -R prometheus:prometheus /app/pushgateway
sudo chmod +x /app/pushgateway/pushgateway

image-20260129145155568

重载systemd并启动服务:

# 重载配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload

# 启动并设置开机自启
sudo systemctl start pushgateway
sudo systemctl enable pushgateway

# 查看状态
sudo systemctl status pushgateway

image-20260129145603537

验证服务是否正常:

# 检查进程
ps aux | grep pushgateway

# 访问指标端点(本地)
curl http://localhost:9091/metrics

# 查看日志
journalctl -u pushgateway -f

image-20260129145627630

(可选)配置防火墙放行端口(如需外部访问):

# CentOS 7 使用 firewalld
sudo firewall-cmd --permanent --add-port=9091/tcp
sudo firewall-cmd --reload

此时浏览器访问 http://<ip>:9091 即可访问 UI 页面,只不过默认Metrics上没有任何数据展示,那是因为我们还没有往 PushGateway 上推送任何数据。

image-20260129145725841

不过,PushGateway服务本身是带了一些Metrics的,可以通过访问 http://<ip>:9091/metrics 地址来获取,可以看到里边包含了go、process等相关的一些监控指标。

image-20260129145754623

2.2 docker安装

使用prom/pushgateway的Docker镜像:

docker pull prom/pushgateway

接下来启动Push Gateway:

docker run -d \
  --name=pg \
  -p 9091:9091 \
  prom/pushgateway

image-20260129150129786

访问url:

http://ip:9091/

image-20260129150152620

3.prometheus中配置pushgateway

要使Push Gateway正常工作,必须要在prometheus中配置对应的job才行。

找到prometheus配置文件:

vi /app/prometheus/prometheus.yml
      - targets: ['localhost:9091']
        labels:
          app: "pushgateway"

image-20260129152219677

重新启动prometheus服务:

systemctl restart prometheus
systemctl status prometheus

image-20260129151727333

通过浏览器访问“ip:9090”就可以看见pushgateway服务已经添加监控成功:

image-20260129152401195

4.推送数据到pushgateway

我们要Push数据到PushGateway中,可以通过其提供的API标准接口来添加。

默认URL地址为:http://:9091/metrics/job/{/<LABEL_NAME>/<LABEL_VALUE>}。

其中 是必填项,为job标签值,后边可以跟任意数量的标签对,一般我们会添加一个instance/<INSTANCE_NAME> 实例名称标签,来方便区分各个指标。

接下来,可以Push一个简单的指标数据到PushGateway中测试一下。

echo "test_metric 123456" | curl --data-binary @- http://192.168.42.140:9091/metrics/job/test_job

回到pushgateway页面就可以看见test_job啦!

除了test_metric外,同时还新增了push_time_secondspush_failure_time_seconds两个指标,这两个是PushGateway系统自动生成的相关指标。

image-20260129155105272

此时,我们在Prometheus UI页面上Graph页面可以查询的到该指标了。

image-20260129155224555

添加更多更复杂数据,通常数据会带上instance, 表示来源位置:

cat <<EOF | curl --data-binary @- http://192.168.42.140:9091/metrics/job/some_job/instance/some_instance
# TYPE some_metric counter
some_metric{label="val1"} 42
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF

image-20260129155900553

删除某个组下的某实例的所有数据:

curl -X DELETE http://192.168.42.140:9091/metrics/job/some_job/instance/some_instance

删除某个组下的所有数据:

curl -X DELETE http://192.168.42.140:9091/metrics/job/some_job

5.真实场景上演推送指标

5.1 shell脚本

模拟一个备份任务的执行过程,并将任务的关键指标(耗时和成功状态)主动推送到Prometheus的Pushgateway,以便被Prometheus采集和监控。

#!/bin/bash

JOB_NAME="daily_backup"
INSTANCE="server01"
PUSHGATEWAY_URL="http://localhost:9091"

start_time=$(date +%s)

# 模拟备份操作
echo "Starting backup..."
sleep 3
backup_success=1  # 1 表示成功,0 表示失败(实际可由命令返回值决定)

end_time=$(date +%s)
duration=$((end_time - start_time))

# 构建指标
cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/$JOB_NAME/instance/$INSTANCE
# HELP backup_duration_seconds Duration of the backup job in seconds
# TYPE backup_duration_seconds gauge
backup_duration_seconds $duration

# HELP backup_success Whether the backup succeeded (1) or failed (0)
# TYPE backup_success gauge
backup_success $backup_success
EOF

echo "Metrics pushed to Pushgateway."

image-20260129161434793

执行后,访问 http://ip:9091 可看到:

image-20260129161331862

最终在Prometheus中看到的指标形如:

backup_duration_seconds{job="daily_backup", instance="server01"} 3
backup_success{job="daily_backup", instance="server01"} 1

5.2 Python脚本

数据处理任务完成后,将关键指标主动推送到Prometheus的Pushgateway,从而实现对短生命周期批处理任务的监控。(让一次性的Python批处理任务,在结束后主动告诉监控系统:我干了多少活,成没成功。)

import requests
import time

def push_metrics(job, instance, records_processed, success):
    metrics = f"""
    # HELP data_records_processed Number of records processed
    # TYPE data_records_processed gauge
    data_records_processed {records_processed}

    # HELP data_job_success Job success status (1 = success, 0 = failure)
    # TYPE data_job_success gauge
    data_job_success {int(success)}
    """
    url = f"http://localhost:9091/metrics/job/{job}/instance/{instance}"
    response = requests.post(url, data=metrics.encode('utf-8'))
    if response.status_code == 202:
        print("Metrics pushed successfully.")
    else:
        print(f"Failed to push metrics: {response.status_code}")

# 模拟任务
start = time.time()
try:
    # 模拟处理 1500 条数据
    records = 1500
    time.sleep(2)
    success = True
except Exception as e:
    records = 0
    success = False

push_metrics(
    job="data_pipeline",
    instance="worker-node-01",
    records_processed=records,
    success=success
)

执行该脚本:

python3 1.py

执行后,访问 http://ip:9091 可看到:

image-20260129162756241

推送后,Prometheus采集Pushgateway数据,你会看到如下指标:

data_records_processed{job="data_pipeline", instance="worker-node-01"} 1500
data_job_success{job="data_pipeline", instance="worker-node-01"} 1

在实际运维中,我们常常遇到这样的困境:监控系统(如Prometheus + Pushgateway)部署在公司内网或私有云环境中,没有公网IP,也无法随意开放防火墙端口。但与此同时,部署在公有云上的CI/CD流水线、边缘设备或临时脚本却需要将执行结果(如备份状态、任务耗时)上报到这套内网监控体系中——传统网络架构下,这几乎无法实现。Cpolar正是为解决这类“内网穿透”问题而生。它通过一条加密隧道,将内网的Pushgateway服务安全地映射到一个公网可访问的HTTPS地址,无需改动现有网络策略,也无需暴露服务器真实IP。无论是远程调试、跨环境指标上报,还是临时打通监控链路,Cpolar都能以极低的成本和极高的安全性,让内网服务“走出去”,真正实现监控无边界。

6.安装cpolar实现随时随地开发

6.1 什么是cpolar?

cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。

6.2 部署cpolar

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

7.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,本例使用了:pushgateway,注意不要与已有的隧道名称重复
  • 协议:http
  • 本地地址:9091
  • 域名类型:随机域名
  • 地区:选择China Top

image-20260129164903931

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

image-20260129165126489

访问成功。

image-20260129165119393

8.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

image-20250918151358733

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我使用的是pushgateway,大家可以自定义。填写备注信息,点击保留。

image-20260129165330734

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑

image-20260129165357459

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

image-20260129165431322

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

image-20260129165454882

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

image-20260129165514857

总结

在Prometheus基于“拉取”(Pull)模型的监控体系中,长期运行的服务易于被采集,但短生命周期、离线或批量型任务(如定时脚本、CI/CD流水线、数据迁移作业等)因其瞬时性而无法被直接监控——它们执行完毕即退出,Prometheus根本来不及抓取指标。为解决这一痛点,Prometheus官方提供了Pushgateway——一个专为临时任务设计的“指标收件箱”。它允许这些任务在运行结束时,主动将关键指标(如执行状态、耗时、处理记录数等)推送(Push)到Pushgateway;随后,Prometheus按常规方式从Pushgateway拉取这些数据,从而完成对非持久化任务的完整监控闭环。本文通过以下实践路径,系统阐述了Pushgateway的落地方法:

  • 部署与管理:以systemd服务方式稳定运行Pushgateway,并配置权限、日志与持久化;
  • 多语言上报示例:提供Shell与Pytho 脚本模板,展示如何结构化推送自定义指标;
  • 安全与扩展:通过Cpolar内网穿透技术,安全打通内外网监控链路,支持远程任务向内网Pushgateway上报;

通过合理使用Pushgateway,运维与开发团队能够将监控覆盖延伸至系统的每一个角落,构建更健壮、更透明的可观测性基础设施。