先唠唠:为啥我们需要 “给业务装个监控眼睛”?
做运维 / 开发的朋友大概率都遇过这事儿:公司服务器上跑着业务,比如订单队列、文件处理目录,明明系统 CPU / 内存都正常,但业务卡成狗 —— 等用户投诉了才发现,是待处理任务堆了几百个,文件积了上千个,早该告警了!
传统监控只看 “机器活没活”,但业务的 “健康度” 藏在这些自定义数据里。就像看病只测心跳,不管喉咙痛,根本找不着病根。Prometheus 就是干这个的:把 “待处理任务数”“文件积压量” 这些看不见的业务状态,变成能看、能告警的数字;而 cpolar 则是补最后一块短板 —— 哪怕你在家、在高铁上,也能随时看这些数据,不用非得蹲公司机房。
Prometheus+cpolar:到底能解决啥实际问题?
举个真实例子:朋友在做本地数据处理业务,每天有大量文件传到 /data/incoming 目录,处理程序偶尔会卡死,文件越堆越多,等发现时已经积压了上千个,客户要的报表晚了半天。
用 Prometheus 做了自定义监控后:
- 写个简单的 Python 脚本(Exporter),每 30 秒数一遍目录里的文件数;
- 配置告警规则:文件数超 100 个持续 5 分钟,自动触发提醒;
- 再用 cpolar 把 Prometheus 的监控页面映射到公网,他在家刷手机就能看到 “文件积压数”,不用半夜跑公司。
实测下来,从发现问题到解决的时间,从原来的 “几小时(等用户投诉)” 缩到了 “5 分钟(告警触发)”,客户投诉直接少了 80%。
Prometheus 的出色功能
Prometheus 最牛的不是 “监控 CPU 内存”,而是 “自定义一切你想监控的东西”:
- 写几行 Python 就能做个 Exporter,把任意数据(文件数、队列长度、API 成功率)变成标准监控指标;
- 告警规则能精准控制:比如 “待处理任务超 50 个持续 2 分钟才告警”,避免偶尔波动误报;
- 可视化查询页面,不用复杂报表,直接看数据趋势,哪里出问题一眼就能揪出来。
它不挑系统,Linux、Windows 都能装,哪怕是个人搭的小服务,也能低成本实现企业级的监控。
实用场景
场景 1:电商小厂监控订单积压
- 痛点:订单系统偶尔卡顿,待处理订单数堆积,客服接投诉才发现,损失订单;
- 爽点:用 Prometheus 监控订单队列长度,超阈值(比如 100 单)就告警,cpolar 让运营在家也能看实时数据,不用等技术岗上班。
场景 2:个人开发者监控私活脚本
- 痛点:给客户做的本地数据处理脚本,跑在自家 NAS 上,出门后不知道是否正常运行;
- 爽点:用 Prometheus 监控脚本运行状态和处理文件数,cpolar 映射公网地址,在外面打开手机就能看 “今天处理了多少文件”,出问题及时改,不用等客户催。
cpolar 内网穿透技术带来的便利
说白了,Prometheus 再好用,要是只能在公司内网看,那等于 “半夜出问题,还得爬起来去公司”——cpolar 就是把这个 “地域限制” 给拆了:
- 不用买云服务器、不用配公网 IP,一键安装后,几分钟就能把本地 Prometheus 的监控页面、Exporter 的 /metrics 接口映射到公网;
- 支持固定二级子域名,不用每次重启都换地址,配置到 Prometheus 里一次,永久能用;
- 跨系统适配,不管你是 Linux 服务器、Windows 电脑还是 NAS,都能装,甚至手机端也能访问映射后的地址;
- 异地监控时,数据走加密通道,不用怕内网服务暴露的安全问题,比自己搭 VPN 简单 10 倍;
- 哪怕是在家监控公司的自定义指标,只需要在公司机器装个 cpolar,配置好隧道,在家打开浏览器输入公网地址,就能和在公司看一模一样的监控数据,加班都能在沙发上搞定。
举个实际体验:之前帮朋友配置,从安装 cpolar 到拿到公网地址,总共花了 8 分钟,配置到 Prometheus 里重启服务,在家就能看到公司服务器上的 “待处理文件数”,他说 “再也不用周末跑公司,就为了看一眼监控”。
总结
Prometheus 不是 “高大上的大厂专属工具”,普通开发者、中小厂运维也能把它用起来,核心是把 “业务数据” 变成可监控的指标;而 cpolar 则是给这份监控加了 “远程翅膀”,打破内网的墙。
两者组合起来,成本低、上手快,不用复杂的网络知识,也不用写大量代码,就能实现 “业务状态可度量、异地访问无限制、告警及时不遗漏”—— 说白了,就是把 “被动救火” 变成 “主动监控”,把 “必须蹲公司” 变成 “随时随地看数据”。
不管你是监控订单、文件、队列,还是自己写的小脚本,这套组合都能搞定,关键是真的能落地,不是纸上谈兵的技术。
要是前面的介绍吸引了你,就赶紧去安装吧。好东西,早用早HAPPY!
1.配置自定义参数监控(入门)
😎场景
想监控一个自定义业务指标,比如:
- “当前系统中待处理的任务数量”
1.1 下载必要工具
建立一个专门为研究“自定义参数”的目录:
mkdir /ceshi
验证是否有python,我这里使用的是python3:
python3 --version
python3 -c "import prometheus_client; print('OK')"
若是没有,可以先执行这两条命令:
sudo yum install epel-release -y
sudo yum install python3-pip -y
从Python官方软件仓库下载并安装prometheus_client这个第三方库:
pip install prometheus_client
1.2 创建自定义Exporter
编写一个暴露自定义指标的Web服务(Exporter):
vi my_app.py
# -*- coding: utf-8 -*-
from prometheus_client import start_http_server, Gauge
import time
pending_tasks = Gauge('app_pending_tasks', 'Number of pending tasks in the system')
def update_metrics():
pending_tasks.set(42)
if __name__ == '__main__':
start_http_server(8001) # ← 改成 8001 或其他端口
print("Metrics server running on http://localhost:8001/metrics")
while True:
update_metrics()
time.sleep(10)
1.3 运行Exporter
运行这个服务:
python my_app.py
访问 http://ip:8001/metrics,你会看到:
# HELP app_pending_tasks Number of pending tasks in the system
# TYPE app_pending_tasks gauge
app_pending_tasks 42.0
这是prometheus可以识别到的格式:
1.4 配置prometheus
找prometheus安装目录,修改配置文件:
vi prometheus.yml
添加下面信息:
- job_name: 'my-app'
static_configs:
- targets: ['localhost:8001']
保存退出后,重启prometheus服务:
systemctl restart prometheus
打开 Prometheus Web UI(通常是 http://ip:9090),搜索:
app_pending_tasks
就能看到值 42,并可做告警、绘图等操作。
2.配置自定义参数监控(进阶)
用Prometheus监控你主机上某个动态变化的自定义参数(不是固定值),当它超过阈值时,通过Alertmanager发出告警。
2.1 场景介绍
😎场景示例:监控“待处理任务数”(动态变化)
假设你的业务系统会不断产生任务:
- 存放在 /tmp/pending_tasks.txt 文件中,内容是一个数字(如 42)。这个数字每分钟可能变化。
你希望:
- 当pending_tasks > 50持续2分钟 → 触发告警;
😎整体架构
[你的脚本]
↓ (暴露 /metrics)
[Prometheus] ← 抓取指标
↓ (评估规则)
[Alertmanager] ← 发送告警
↓
[你收到通知]
2.2 创建自定义Exporter
创建/tmp/pending_tasks.txt文件:
echo 42 > /tmp/pending_tasks.txt
创建文件task_exporter.py:
# -*- coding: utf-8 -*-
from prometheus_client import start_http_server, Gauge
import time
import os
# 定义指标
pending_tasks = Gauge('app_pending_tasks', 'Number of pending tasks from /tmp/pending_tasks.txt')
def read_pending_tasks():
"""从文件读取当前待处理任务数"""
try:
with open('/tmp/pending_tasks.txt', 'r') as f:
value = int(f.read().strip())
return value
except Exception as e:
print(f"Error reading file: {e}")
return 0 # 文件不存在或格式错误时返回 0
def update_metrics():
count = read_pending_tasks()
pending_tasks.set(count)
print(f"Updated pending_tasks = {count}")
if __name__ == '__main__':
start_http_server(8002)
print("Task Exporter running on :8002/metrics")
while True:
update_metrics()
time.sleep(15) # 每15秒更新一次
2.3 运行Exporter
执行命令:
python3 task_exporter.py &
验证指标:
# 先模拟数据
echo 60 > /tmp/pending_tasks.txt
# 查看指标
curl http://localhost:9100/metrics | grep app_pending_tasks
访问 http://ip:8002/metrics,你会看到:
app_pending_tasks 60.0
2.4 配置Prometheus抓取及告警
编辑prometheus.yml:
- job_name: 'task'
static_configs:
- targets: ['localhost:8002']
创建告警文件:
vi alert_rules.yml
groups:
- name: task_alerts
rules:
- alert: HighPendingTasks
expr: app_pending_tasks > 50
for: 2m # 持续 2 分钟超过 50 才触发
labels:
severity: warning
annotations:
summary: "待处理任务过多"
description: "当前待处理任务数为 {{ $value }},超过阈值 50"
配置prometheus添加告警文件:
保存退出后,重启prometheus服务:
systemctl restart prometheus
打开 Prometheus Web UI(通常是 http://ip:9090),前面我们编辑的文件是60,系统识别到比50大,所以一直在告警:
3.配置自定义参数监控(高级)
3.1 场景介绍
监控指定目录下“积压文件数量”并告警:
😎你的系统有一个数据处理流程:
- 外部程序不断向 /data/incoming/ 目录写入新文件(如 .json、.csv);
- 另一个消费者程序会读取并处理这些文件,处理完后移动到 /data/archived/;
- 如果消费者挂了或变慢,/data/incoming/ 中的文件会不断堆积。
😎你希望:
-
实时监控 /data/incoming/ 目录下的待处理文件数量;
-
当 文件数 > 100持续5分钟 → 触发告警;
-
告警信息包含当前文件数和目录路径。
-
这个指标的特点:动态变化(随业务实时增减);
-
非系统指标(CPU/内存等无法反映此问题);
-
高业务价值(直接反映数据处理是否健康);
-
可扩展(可监控多个目录、按文件类型过滤等)。
3.2 创建自定义Exporter
创建文件file_queue_exporter.py:
# -*- coding: utf-8 -*-
# file_queue_exporter.py
from prometheus_client import start_http_server, Gauge
import os
import time
import glob
# 自定义指标:带标签(directory)
pending_files = Gauge(
'file_queue_pending_count',
'Number of pending files in a directory',
['directory']
)
# 要监控的目录列表(可扩展)
WATCHED_DIRS = [
"/data/incoming",
"/logs/upload_queue"
]
def count_pending_files():
for dir_path in WATCHED_DIRS:
if not os.path.exists(dir_path):
count = 0
else:
# 只统计普通文件(不含子目录)
files = [f for f in glob.glob(os.path.join(dir_path, "*")) if os.path.isfile(f)]
count = len(files)
pending_files.labels(directory=dir_path).set(count)
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {dir_path} → {count} files")
if __name__ == '__main__':
start_http_server(8003)
print("File Queue Exporter running on :8003/metrics")
while True:
count_pending_files()
time.sleep(30) # 每30秒采集一次
3.3 运行Exporter
创建/data/incoming文件并启动脚本:
mkdir -p /data/incoming /logs/upload_queue python3 file_queue_exporter.py &
3.4 配置prometheus监控
进入prometheus配置文件:
- job_name: 'file'
static_configs:
- targets: ['localhost:8003']
3.5 配置alertmanager告警
编写告警文件:
groups:
- name: file-queue-alerts
rules:
- alert: HighFileQueuePending
expr: file_queue_pending_count{directory="/data/incoming"} > 100
for: 5m
labels:
severity: warning
annotations:
summary: "待处理文件积压过多"
description: "目录 {{ $labels.directory }} 中有 {{ $value | printf \"%.0f\" }} 个待处理文件,超过阈值 100"
把告警规则加入到prometheus监控中:
如图所示,加入指定位置:
重启prometheus服务:
systemctl restart prometheus
systemctl status prometheus
打开 Prometheus Web UI(通常是 http://ip:9090),可以看到告警规则了。
3.6 模拟积压
确保目标目录已创建:
ls /data/incoming
生成 150 个测试文件:
使用Shell循环快速创建一批 .json 文件,模拟数据流入:
for i in {1..150}; do
touch /data/incoming/data_${i}.json
done
使用命令查看是否成功:
ls -l /data/incoming
运行以下命令检查Prometheus指标是否已更新:
curl http://localhost:8003/metrics | grep file_queue_pending_count
打开 Prometheus Web UI(通常是 http://ip:9090),我们可以看到已经告警(默认大于100就告警)。
那么我们整个过程就暂时结束啦,过程还是很有趣的,那么我现在有一个问题,倘若我们想在家里监控公司的自定义参数,我们如何监控到呢?
别急,cpolar来解决你这个问题!
4.安装cpolar实现随时随地开发
cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh
安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar
Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://192.168.42.101:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。
5.配置公网地址
本文使用8001端口测试。
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,本例使用了:ceshi,注意不要与已有的隧道名称重复
- 协议:http
- 本地地址:8001
- 域名类型:随机域名
- 地区:选择China Top
点击创建:
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。
这回,我们在prometheus配置文件下,配置监控公网地址:
- job_name: 'my-app'
static_configs:
- targets: ['e0950bc.r2.cpolar.top']
监控成功:
6.保留固定公网地址
使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。
点击左侧的预留,选择保留二级子域名,地区选择china top,然后设置一个二级子域名名称,我这里演示使用的是ceshii,大家可以自定义。填写备注信息,点击保留。
登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道prometheus,点击右侧的编辑。
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新
更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。
最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。
这样,我们就可以随时随地监控,不用担心,在家无法监控设备!
总结
文章总结:如何让Prometheus监控你自己的数据?—— 自定义指标全解析Prometheus默认监控系统级指标,但真正的业务洞察来自自定义指标。本文详解了从零实现自定义监控的完整路径:
- 定义业务指标(如待处理文件数、API成功率、任务队列长度);
- 开发Exporter,通过 /metrics接口以标准格式暴露指标;
- 配置Prometheus抓取目标,并使用PromQL 查询与告警;
- 解决网络限制:若服务位于内网,借cpolar等内网穿透工具,安全暴露端口,实现远程监控。
通过自定义指标,Prometheus不再只是“看机器是否活着”,而是真正回答:“业务是否正常运行?”——这才是可观测性的核心价值。