Prometheus部署Pushgateway:监控批处理与短生命周期任务 前言摘要本文详细介绍了Prometheus Pushgateway的完整部署与使用流程。首先阐述了Pushgateway在监控短生命周期任务如批处理脚本、CI/CD任务中的重要作用然后分别演示了二进制包和Docker两种安装方式。接着配置Prometheus采集Pushgateway指标并通过curl、Shell脚本和Python脚本三种方式推送自定义指标到Pushgateway。最后使用cpolar内网穿透工具为Pushgateway创建公网访问入口实现跨网络环境指标上报。文章提供了从安装部署到实际应用的全套解决方案适合需要监控一次性任务的运维和开发人员。Prometheus最常见的工作方式是定期访问目标服务的/metrics接口把当前指标拉回来保存。对于Web服务、数据库和各种长期运行的Exporter来说这种方式很自然。但批处理任务不一样。每天只运行几分钟的备份脚本、执行完成就退出的数据处理程序或者CI/CD中的一次性Job可能在下一次Prometheus抓取之前就已经结束。Pushgateway就是用来补充这类场景的。短生命周期任务在结束前主动把执行状态、耗时或处理数量推送到Pushgateway由Pushgateway暂时保存这些指标Prometheus再按照原来的Pull方式定期进行采集。因此真正发生变化的只是任务到Pushgateway这一段任务负责PushPrometheus依然负责Pull。本文将完成Pushgateway的二进制与Docker部署把它加入Prometheus采集目标并分别使用Shell和Python任务推送自定义指标。最后还会通过cpolar为9091端口创建公网入口演示其他网络环境中的任务如何访问这套指标接收服务。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 投入生产环境前了解其设计限制并遵循最佳实践至关重要。以下是一些关键注意事项1. 高可用部署Pushgateway 本身是一个单点服务如果部署为单实例一旦宕机所有短生命周期任务的指标将无法上报导致监控数据丢失。对于生产环境建议采用以下高可用方案多实例部署部署多个 Pushgateway 实例并在前方配置负载均衡器如 Nginx、HAProxy。服务发现在 Prometheus 配置中使用服务发现如 DNS SRV 记录、Consul动态发现所有 Pushgateway 实例。客户端重试与负载均衡推送指标的客户端应实现简单的重试逻辑并在多个 Pushgateway 端点间进行负载均衡。示例 Prometheus 配置片段静态多目标scrape_configs:-job_name:pushgatewaystatic_configs:-targets:-pushgateway-01:9091-pushgateway-02:9091-pushgateway-03:90912. 适用场景与数据留存Pushgateway不是一个长期指标存储系统设计上仅用于暂存短生命周期任务的指标。不适合存储高基数或长期指标避免将高频、高基数如包含用户ID、会话ID等标签或需要长期历史查询的指标推送到 Pushgateway。这会导致 Pushgateway 内存占用过高并可能影响 Prometheus 的抓取性能。数据不会自动过期推送到 Pushgateway 的指标会一直保留直到被手动删除或 Pushgateway 重启。必须建立定期清理机制。主要用途批处理作业、CI/CD 流水线任务、定时脚本、一次性数据处理任务等短生命周期、无法自行暴露/metrics端点的应用。3. 指标与标签规范清晰的指标和标签是有效监控的基础。必须包含job标签这是 Pushgateway 路径中的必填项用于区分不同的任务类型如jobdaily_backup。强烈建议包含instance标签用于区分任务的不同运行实例或来源如instanceserver01。这对于定位具体失败的任务实例至关重要。标签命名规范使用小写字母、数字和下划线。遵循snake_case命名法例如backup_duration_seconds。标签值应保持相对稳定和低基数。避免使用随时间变化的值如时间戳或唯一标识符如请求ID作为标签值。包含 HELP 和 TYPE在推送的指标数据中最好包含# HELP和# TYPE行这能提升 Prometheus 中指标的可读性。示例良好的标签实践# 推送时包含 job 和 instancecatEOF|curl--data-binary - http://pushgateway:9091/metrics/job/data_import/instance/batch_worker_01# HELP records_processed_total Total number of records processed. # TYPE records_processed_total counter records_processed_total 1500 # HELP job_duration_seconds Duration of the job in seconds. # TYPE job_duration_seconds gauge job_duration_seconds 42.7 EOF4. 定期清理过期指标由于 Pushgateway 不会自动清理旧数据需要定期清理已完成的或失效的任务指标以防止数据堆积。通过 API 清理使用 DELETE 接口。这是最推荐的方式可以集成到任务脚本的“清理”阶段。删除特定 job 下特定 instance 的所有指标curl-XDELETE http://pushgateway:9091/metrics/job/JOB_NAME/instance/INSTANCE_NAME删除整个 job 的所有指标慎用curl-XDELETE http://pushgateway:9091/metrics/job/JOB_NAME通过管理界面清理访问 Pushgateway 的 Web UI默认http://pushgateway:9091找到对应的 job 或 job/instance 分组点击Delete按钮。自动化清理脚本可以编写定时任务cron job基于任务完成时间或其他逻辑定期调用 DELETE API 清理过期指标。最佳实践建议在任务脚本的最后无论成功与否都添加一个清理步骤删除本次任务推送的指标组确保 Pushgateway 中只保留“活跃”或“近期”的任务数据。总结完成以上配置后Pushgateway已经可以作为Prometheus与短生命周期任务之间的指标中转点使用。批处理任务不需要持续运行/metrics服务而是在执行过程中或结束前将任务耗时、成功状态、处理数量等指标主动发送到Pushgateway。Pushgateway负责保存这些指标Prometheus则继续按照自身的抓取周期从9091端口采集数据因此整体监控体系仍然保持Prometheus的Pull方式。本文分别使用curl、Shell脚本和Python脚本完成了指标推送并通过Job与Instance区分不同任务和来源。对于已经失效的任务或实例还可以通过Pushgateway提供的DELETE接口清理对应指标组避免旧数据长期保留。通过cpolar为9091端口创建公网隧道后其他网络环境中的任务也可以访问Pushgateway的HTTP接口从而为跨网络指标上报提供一个可访问入口。从Pushgateway部署、Prometheus接入到Shell与Python指标推送以及公网访问本文完成了一套面向批处理和短生命周期任务的指标上报流程。