前言Prometheus 在监控领域几乎已经成为标准配置。无论是服务器、数据库、中间件还是各种业务系统只要暴露 Metrics 接口Prometheus 就能通过定期抓取的方式收集指标数据。这种 Pull 模式简单、稳定也让监控系统的维护成本大幅降低。不过实际使用过程中总会遇到一些让人头疼的场景。比如每天凌晨执行一次的数据库备份脚本、CI/CD流水线中的自动构建任务或者定时同步数据的批处理程序。这些任务往往运行几秒钟到几分钟就结束了等 Prometheus 下一次开始抓取指标时它们可能早已退出监控系统甚至不知道它们来过。偏偏这类任务又非常重要。一次备份失败可能影响数据恢复一次同步异常可能导致业务数据缺失而一次构建失败则会直接阻塞版本发布。如果无法掌握这些任务的执行情况那么整个监控体系实际上始终存在一块盲区。为了解决这个问题Prometheus 官方提供了 Pushgateway。它相当于 Prometheus 体系中的一个“收件箱”允许短生命周期任务主动上报自己的执行结果再由 Prometheus 统一采集。这样即使任务已经结束相关指标依然能够被保留下来从而实现对批处理任务、定时任务以及离线任务的持续监控。本文将通过部署实践和实际案例带大家了解 Pushgateway 的工作方式以及具体使用方法。1.安装条件本次演示环境我是在虚拟机上安装Linux系统来执行操作以下是安装的软件及版本Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)System: entOS Linux release 7.9.2009 (Core)Docker: 26.1.4Prometheus: v3.5.0PushGateway: 1.0.0没有prometheus的小伙伴可以去cpolar官网参考这篇文章哦~监控不再局域网Cpolar 让 Prometheus 走出内网限制 - cpolar 极点云官网2.PushGateway安装配置2.1 二进制包安装访问PushGateway官网下载二进制包下载linux版本的下载完成后上传到/app目录下上传成功后我们为它解压tar-zxvfpushgateway-1.11.2.linux-amd64.tar.gz我这里为它重命名并删除压缩文件mvpushgateway-1.11.2.linux-amd64 pushgatewayrm-rfpushgateway-1.11.2.linux-amd64.tar.gz创建systemd服务文件:sudovim/etc/systemd/system/pushgateway.service[Unit]DescriptionPushgatewayforPrometheusDocumentationhttps://github.com/prometheus/pushgatewayAfternetwork-online.target[Service]TypesimpleUserprometheusGroupprometheusExecStart/app/pushgateway/pushgateway\--web.listen-address:9091\--web.enable-admin-api\--log.levelinfoWorkingDirectory/app/pushgatewayRestarton-failureRestartSec5StandardOutputjournalStandardErrorjournalSyslogIdentifierpushgateway[Install]WantedBymulti-user.target设置文件权限确保二进制文件可执行且属主正确sudochown-Rprometheus:prometheus /app/pushgatewaysudochmodx /app/pushgateway/pushgateway重载systemd并启动服务# 重载配置sudosystemctl daemon-reexecsudosystemctl daemon-reload# 启动并设置开机自启sudosystemctl start pushgatewaysudosystemctlenablepushgateway# 查看状态sudosystemctl status pushgateway验证服务是否正常# 检查进程psaux|greppushgateway# 访问指标端点本地curlhttp://localhost:9091/metrics# 查看日志journalctl-upushgateway-f可选配置防火墙放行端口如需外部访问:# CentOS 7 使用 firewalldsudofirewall-cmd--permanent--add-port9091/tcpsudofirewall-cmd--reload此时浏览器访问http://ip:9091即可访问 UI 页面只不过默认Metrics上没有任何数据展示那是因为我们还没有往 PushGateway 上推送任何数据。不过PushGateway服务本身是带了一些Metrics的可以通过访问http://ip:9091/metrics地址来获取可以看到里边包含了go、process等相关的一些监控指标。2.2 docker安装使用prom/pushgateway的Docker镜像dockerpull prom/pushgateway接下来启动Push Gatewaydockerrun-d\--namepg\-p9091:9091\prom/pushgateway访问urlhttp://ip:9091/3.prometheus中配置pushgateway要使Push Gateway正常工作必须要在prometheus中配置对应的job才行。找到prometheus配置文件vi/app/prometheus/prometheus.yml- targets:[localhost:9091]labels: app:pushgateway重新启动prometheus服务systemctl restart prometheus systemctl status prometheus通过浏览器访问“ip:9090”就可以看见pushgateway服务已经添加监控成功4.推送数据到pushgateway我们要Push数据到PushGateway中可以通过其提供的API标准接口来添加。默认URL地址为http://:9091/metrics/job/{/LABEL_NAME/LABEL_VALUE}。其中 是必填项为job标签值后边可以跟任意数量的标签对一般我们会添加一个instance/INSTANCE_NAME 实例名称标签来方便区分各个指标。接下来可以Push一个简单的指标数据到PushGateway中测试一下。echotest_metric 123456|curl--data-binary - http://192.168.42.140:9091/metrics/job/test_job回到pushgateway页面就可以看见test_job啦除了test_metric外同时还新增了push_time_seconds和push_failure_time_seconds两个指标这两个是PushGateway系统自动生成的相关指标。此时我们在Prometheus UI页面上Graph页面可以查询的到该指标了。添加更多更复杂数据通常数据会带上instance, 表示来源位置catEOF|curl--data-binary - http://192.168.42.140:9091/metrics/job/some_job/instance/some_instance# TYPE some_metric counter some_metric{labelval1} 42 # TYPE another_metric gauge # HELP another_metric Just an example. another_metric 2398.283 EOF删除某个组下的某实例的所有数据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_job5.真实场景上演推送指标5.1 shell脚本模拟一个备份任务的执行过程并将任务的关键指标耗时和成功状态主动推送到Prometheus的Pushgateway以便被Prometheus采集和监控。#!/bin/bashJOB_NAMEdaily_backupINSTANCEserver01PUSHGATEWAY_URLhttp://localhost:9091start_time$(date%s)# 模拟备份操作echoStarting backup...sleep3backup_success1# 1 表示成功0 表示失败实际可由命令返回值决定end_time$(date%s)duration$((end_time-start_time))# 构建指标catEOF|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_successEOFechoMetrics pushed to Pushgateway.执行后访问 http://ip:9091 可看到最终在Prometheus中看到的指标形如backup_duration_seconds{jobdaily_backup,instanceserver01}3backup_success{jobdaily_backup,instanceserver01}15.2 Python脚本数据处理任务完成后将关键指标主动推送到Prometheus的Pushgateway从而实现对短生命周期批处理任务的监控。(让一次性的Python批处理任务在结束后主动告诉监控系统我干了多少活成没成功。)importrequestsimporttimedef push_metrics(job, instance, records_processed, success): metricsf# HELP data_records_processed Number of records processed# TYPE data_records_processed gaugedata_records_processed{records_processed}# HELP data_job_success Job success status (1 success, 0 failure)# TYPE data_job_success gaugedata_job_success{int(success)} urlfhttp://localhost:9091/metrics/job/{job}/instance/{instance}responserequests.post(url,datametrics.encode(utf-8))ifresponse.status_code202: print(Metrics pushed successfully.)else: print(fFailed to push metrics: {response.status_code})# 模拟任务starttime.time()try:# 模拟处理 1500 条数据records1500time.sleep(2)successTrue except Exception as e: records0successFalse push_metrics(jobdata_pipeline,instanceworker-node-01,records_processedrecords,successsuccess)执行该脚本python31.py执行后访问 http://ip:9091 可看到推送后Prometheus采集Pushgateway数据你会看到如下指标data_records_processed{jobdata_pipeline,instanceworker-node-01}1500data_job_success{jobdata_pipeline,instanceworker-node-01}1在实际运维中我们常常遇到这样的困境监控系统如Prometheus Pushgateway部署在公司内网或私有云环境中没有公网IP也无法随意开放防火墙端口。但与此同时部署在公有云上的CI/CD流水线、边缘设备或临时脚本却需要将执行结果如备份状态、任务耗时上报到这套内网监控体系中——传统网络架构下这几乎无法实现。Cpolar正是为解决这类“内网穿透”问题而生。它通过一条加密隧道将内网的Pushgateway服务安全地映射到一个公网可访问的HTTPS地址无需改动现有网络策略也无需暴露服务器真实IP。无论是远程调试、跨环境指标上报还是临时打通监控链路Cpolar都能以极低的成本和极高的安全性让内网服务“走出去”真正实现监控无边界。6.安装cpolar实现随时随地开发6.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。6.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。7.配置公网地址登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道隧道名称可自定义本例使用了:pushgateway注意不要与已有的隧道名称重复协议http本地地址9091域名类型随机域名地区选择China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用地址访问。访问成功。8.保留固定公网地址使用cpolar为其配置二级子域名cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我使用的是pushgateway大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问的页面这样一个永久不会变化的二级子域名公网网址即设置好了。总结对于长期运行的服务来说Prometheus 的 Pull 模式已经足够优秀。但在实际生产环境中备份脚本、数据同步任务、CI/CD流水线以及各种批处理程序同样需要监控而这些任务往往因为生命周期过短无法被传统监控方式直接覆盖。Pushgateway 的出现正好解决了这个问题。通过让任务主动推送指标再由 Prometheus 统一采集原本无法监控的执行结果、任务耗时、处理记录数等信息都能够纳入统一的监控体系。从运维视角来看这不仅补齐了监控盲区也让整个可观测体系更加完整。本文分别演示了 Pushgateway 的部署方法、Prometheus 配置流程以及 Shell、Python 两种常见任务场景下的指标上报实践。通过这些案例你可以快速将定时任务、离线任务以及自动化流程接入现有监控平台实现任务状态可视化和异常告警。如果你的环境中存在大量备份任务、数据处理任务或自动化流水线那么 Pushgateway 基本属于 Prometheus 生态中不可或缺的一环。再结合 cpolar 提供的公网访问能力即使监控系统部署在内网环境中也能够安全接收来自云服务器、边缘节点或异地设备的指标上报进一步扩展监控覆盖范围。