Prometheus Pushgateway 实战:容器化部署与批量任务监控全攻略

在 Kubernetes 和容器化部署盛行的今天,Prometheus 凭借其强大的指标采集能力成为监控领域的标配。然而,对于备份、数据处理等短生命周期任务,Prometheus 默认的拉取模式往往力不从心。Pushgateway 作为 Prometheus 的配套组件,专门解决这一痛点——它允许瞬时任务主动推送指标,再由 Prometheus 统一拉取,形成完整监控闭环。本文将从容器化部署角度出发,详解 Pushgateway 的安装配置、Prometheus 对接方法,以及多语言脚本推送自定义指标的实操案例,并借助 Cpolar 内网穿透实现公网访问,帮助你彻底解决临时任务监控难题。

1. 环境准备与容器化部署方案

本次演示基于以下环境:Oracle VirtualBox 5.1.20、CentOS Linux 7.9.2009、Docker 26.1.4、Prometheus v3.5.0 以及 Pushgateway 1.0.0。如果你尚未部署 Prometheus,可以参考 Cpolar 官网的相关文章进行快速搭建。

容器化部署的优势:借助 Docker 或 Kubernetes,我们可以将 Pushgateway 打包为轻量级容器,实现快速部署、资源隔离和弹性伸缩。相比传统二进制安装,容器化方式更适合现代 CI/CD 流水线和容器编排场景。

0935cd9c73984ad0e7eccad4e28628bc

安装前提:确保系统已安装 Docker 服务,并具备基本的网络连通性。以下步骤将同时展示二进制包安装和 Docker 容器化部署两种方式,满足不同场景需求。

2. Pushgateway 安装配置:二进制与 Docker 双方案

2.1 二进制包安装(传统方式)

访问 Pushgateway 官方 GitHub Releases 页面,下载 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
# 重载配置
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

(可选)配置防火墙放行 9091 端口:

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

浏览器访问 http://<ip>:9091,即可看到 Pushgateway 的 UI 页面,初始状态下 Metrics 为空。

image-20260129145725841

通过 http://<ip>:9091/metrics 可查看 Pushgateway 自带的内置指标(如 Go 运行时、进程信息等)。

image-20260129145754623

2.2 Docker 容器化部署(推荐)

容器化部署 让 Pushgateway 的安装变得极其简洁:

docker pull prom/pushgateway

启动容器,映射 9091 端口:

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

访问

http://ip:9091/
验证:

image-20260129150152620

✅ 容器化方式不仅简化了依赖管理,还便于在 Kubernetes 集群中通过 Deployment 或 DaemonSet 进行容器编排,实现自动扩缩容。

3. Prometheus 对接 Pushgateway 配置

要让 Prometheus 采集 Pushgateway 的数据,需要在 Prometheus 配置文件中添加对应的 job。编辑 prometheus.yml:

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

重启 Prometheus 服务:

systemctl restart prometheus
systemctl status prometheus
image-20260129151727333

在 Prometheus UI(ip:9090)的 Target 页面中,即可看到 pushgateway 服务已成功加入监控列表。

image-20260129152401195

4. 推送指标到 Pushgateway:API 接口详解

Pushgateway 提供标准的 HTTP API 接口,默认地址格式为:http://<pushgateway_ip>:9091/metrics/job/<JOB_NAME>/{<LABEL_NAME>/<LABEL_VALUE>}。其中 <JOB_NAME> 为必填项,可附加任意标签对,通常建议加上 instance/<INSTANCE_NAME> 标签以区分不同来源。

推送一个简单的测试指标:

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

刷新 Pushgateway UI,即可看到新增的 test_job 及其指标。注意,除了推送的指标外,Pushgateway 会自动添加 test_metricpush_time_secondspush_failure_time_seconds 等系统指标。

image-20260129155105272

在 Prometheus 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

删除操作也通过 API 完成——删除某个组下某实例的所有数据:

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. 实战:Shell 与 Python 脚本推送自定义指标

5.1 Shell 脚本示例:备份任务监控

模拟一个备份任务的执行过程,将耗时和成功状态主动推送至 Pushgateway:

#!/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 脚本示例:数据处理任务监控

对于 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

查看推送结果:

image-20260129162756241

Prometheus 采集到的指标:

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

⚠️ 注意事项:推送指标时建议设置合理的超时和重试机制,避免因网络问题导致数据丢失。同时,在 Kubernetes 环境中,可通过 Job 或 CronJob 管理这些脚本,实现容器化编排。

6. 突破网络限制:Cpolar 内网穿透实现公网访问

在实际运维中,监控系统往往部署在内网,而 CI/CD 流水线或边缘设备却需要上报数据。Cpolar 内网穿透工具可以轻松解决这一难题——它通过加密隧道将内网 Pushgateway 映射到公网 HTTPS 地址,无需改动网络策略,安全便捷。

6.1 安装 Cpolar

一键脚本安装:

sudo curl https://get.cpolar.sh | sh
image-20250725104019896

启动服务并检查状态:

sudo systemctl status cpolar
22e5adfaf290a17fc3384bb296055259

浏览器访问 http://虚拟机IP:9200,使用 Cpolar 官网注册的账号登录管理界面。

8a6698b1bf26d64ba3645827fbfb1c29

6.2 配置公网隧道

在 Cpolar Web UI 中,点击左侧“隧道管理” -> “创建隧道”:

  • 隧道名称:自定义(如 pushgateway)
  • 协议:http
  • 本地地址:9091
  • 域名类型:随机域名
  • 地区:China Top
image-20260129164903931

创建成功后,在“在线隧道列表”中即可看到生成的公网地址。

image-20260129165126489

通过该地址即可公网访问 Pushgateway:

image-20260129165119393

6.3 保留固定二级子域名

为避免公网地址随机变化,可保留一个固定二级子域名:

  • 登录 Cpolar 官网,进入“预留”页面,选择“保留二级子域名”
  • 地区:China Top,设置子域名名称(如 pushgateway)
image-20250918151358733image-20260129165330734

回到 Cpolar Web UI,修改隧道信息,将保留的二级子域名填入:

image-20260129165357459

选择“二级子域名”类型,填写 Sub Domain,点击 编辑更新

image-20260129165431322

更新后,在线隧道列表中的地址将变为固定二级子域名:

image-20260129165454882

使用该固定公网地址即可随时访问内网 Pushgateway:

image-20260129165514857 [AFFILIATE_SLOT_1]

总结:构建完整的短任务监控体系

Pushgateway 完美填补了 Prometheus 在短生命周期任务监控上的空白。通过本文的实战,你已掌握从容器化部署、Prometheus 对接,到 Shell/Python 脚本推送自定义指标,再到 Cpolar 内网穿透实现公网访问的全链路方案。合理运用 Pushgateway,无论是定时备份、数据处理还是 CI/CD 任务,都能实现可观测、可追溯,让监控体系覆盖系统运行的每一个环节。

[AFFILIATE_SLOT_2]
posted on 2026-04-30 11:31  ljbguanli  阅读(3)  评论(0)    收藏  举报