Prometheus监控盲区:Pushgateway如何收拢离线任务指标
前言Prometheus 用的是拉模型——监控目标起个 HTTP 服务、暴露个 /metrics 端点Prometheus 按时来抓。这是业内标准的做法好处是简单、可靠、不需要给监控中心开权限。但实际场景远比这个理想模型复杂。凌晨跑的备份脚本执行完了进程就消失了Prometheus 下次来抓的时候连个影都见不着。CI/CD 流水线里的测试任务活了可能还不到一分钟。批量数据处理作业跑完即退出连 IP 都不一定固定。这类****短命任务****偏偏是系统里最需要监控的环节之一——备份成没成功、数据处理了多少条、测试漏了没有这些信息直接关系到业务稳定性。但 Prometheus 的拉模型确实抓不到它们因为等 Prometheus 来的时候任务早就不在了。Prometheus 官方其实早就意识到这个问题给出的解法是*Pushgateway*。它的定位是指标收件箱——短生命周期任务在退出前主动把指标推到这个中间节点Prometheus 再按正常方式从 Pushgateway 拉取这样就完成了对非长期运行任务的监控闭环。这篇文章就把这几个环节拆开来细说附带 Shell 和 Python 的真实上报脚本拿去改改就能用。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点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问的页面这样一个永久不会变化的二级子域名公网网址即设置好了。总结Pushgateway 这个组件在 Promethues 生态里不算新但实际用起来有些细节需要注意。*它解决的是真问题。*备份脚本、CI/CD 任务、批量调度作业这类任务天生不适合长期暴露 metrics 端点但又确实需要被监控。Pushgateway 填补了这个空白上报链路打通了后续在 Grafana 里做看板、配置告警都能正常走。*但 Pushgateway 不是万能的。*它本质上是指标的临时中转站不是长久存储。Prometheus 从 Pushgateway 拉到的指标instance 标签默认不会自动消失——同一个 job/instance 的指标会一直保留直到你手动清理。这意味着定期清理旧数据是必要的运维动作否则 Pushgateway 这边会累积大量过时指标。*推数据的任务脚本建议统一规范。*job 名称要有意义、instance 要能区分来源、指标类型gauge/counter要选对。这些细节决定了后续 Grafana 做查询时的体验埋得好后面少踩坑。cpolar 穿透这套属于锦上添花适合没有公网 IP 又需要异地触发上报的场景。生产环境建议还是走内网 VPN 或者专线安全边际更高。整体来说这套方案不复杂按步骤走半小时内能跑通第一个 demo。适合有 Prometheus 基础设施、想补齐短生命周期任务监控盲区的团队。