别让告警变成噪音:用Prometheus和Alertmanager搭一套可远程查看的监控系统

📅 2026/7/8 1:43:18
别让告警变成噪音:用Prometheus和Alertmanager搭一套可远程查看的监控系统
前言做运维最怕的不是系统出问题而是告警系统本身先把人拖垮。凌晨突然响起的电话、重复推送的异常、已经恢复却还在刷屏的提醒时间久了很容易让人对告警变得麻木。监控系统真正有价值的地方不只是“能不能看到数据”而是能不能在关键问题出现时把正确的信息及时送到正确的人面前。Prometheus负责采集和判断指标异常但如果所有告警都直接抛出来后续仍然会变成一堆噪音。Alertmanager的作用就是让告警处理变得更有秩序。它可以接收Prometheus触发的告警再进行分组、路由、抑制和静默处理。这样一来临时抖动不会轻易变成深夜骚扰重复问题也不会把值班人员淹没。对于刚开始搭建监控体系的用户来说先把Prometheus和Alertmanager跑通是进入告警治理的第一步。Prometheus提供指标采集与规则评估能力Alertmanager负责告警管理两者配合后监控系统才从“只会看数据”进一步变成“能够提醒问题”。本文将以Ubuntu环境为例完成Prometheus安装、systemd服务配置、Alertmanager部署、Prometheus对接Alertmanager以及基础访问验证。最后再通过 cpolar 为Prometheus配置公网访问地址让监控面板不只在本地可见也能在外出时随时查看系统状态。1.配置自定义参数监控入门场景想监控一个自定义业务指标比如“当前系统中待处理的任务数量”1.1 下载必要工具建立一个专门为研究“自定义参数”的目录mkdir/ceshi验证是否有python我这里使用的是python3python3--versionpython3-cimport prometheus_client; print(OK)若是没有可以先执行这两条命令sudoyuminstallepel-release-ysudoyuminstallpython3-pip-y从Python官方软件仓库下载并安装prometheus_client这个第三方库pipinstallprometheus_client1.2 创建自定义Exporter编写一个暴露自定义指标的Web服务Exporter:vimy_app.py# -*- coding: utf-8 -*-from prometheus_clientimportstart_http_server, Gaugeimporttimepending_tasksGauge(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)whileTrue: 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 gaugeapp_pending_tasks42.0这是prometheus可以识别到的格式1.4 配置prometheus找prometheus安装目录修改配置文件viprometheus.yml添加下面信息- job_name:my-appstatic_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文件echo42/tmp/pending_tasks.txt创建文件task_exporter.py# -*- coding: utf-8 -*-from prometheus_clientimportstart_http_server, Gaugeimporttimeimportos# 定义指标pending_tasksGauge(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: valueint(f.read().strip())returnvalue except Exception as e: print(fError reading file: {e})return0# 文件不存在或格式错误时返回 0def update_metrics(): countread_pending_tasks()pending_tasks.set(count)print(fUpdated pending_tasks {count})if__name____main__:start_http_server(8002)print(Task Exporter running on :8002/metrics)whileTrue: update_metrics()time.sleep(15)# 每15秒更新一次2.3 运行Exporter执行命令python3 task_exporter.py验证指标# 先模拟数据echo60/tmp/pending_tasks.txt# 查看指标curlhttp://localhost:9100/metrics|grepapp_pending_tasks访问 http://ip:8002/metrics你会看到app_pending_tasks60.02.4 配置Prometheus抓取及告警编辑prometheus.yml- job_name:taskstatic_configs: - targets:[localhost:8002]创建告警文件vialert_rules.ymlgroups: - name: task_alerts rules: - alert: HighPendingTasks expr: app_pending_tasks50for: 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.pyfrom prometheus_clientimportstart_http_server, Gaugeimportosimporttimeimportglob# 自定义指标带标签directorypending_filesGauge(file_queue_pending_count,Number of pending files in a directory,[directory])# 要监控的目录列表可扩展WATCHED_DIRS[/data/incoming,/logs/upload_queue]def count_pending_files():fordir_pathinWATCHED_DIRS:ifnot os.path.exists(dir_path): count0else:# 只统计普通文件不含子目录files[fforfinglob.glob(os.path.join(dir_path,*))ifos.path.isfile(f)]countlen(files)pending_files.labels(directorydir_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)whileTrue: count_pending_files()time.sleep(30)# 每30秒采集一次3.3 运行Exporter创建/data/incoming文件并启动脚本mkdir-p/data/incoming /logs/upload_queue python3 file_queue_exporter.py3.4 配置prometheus监控进入prometheus配置文件- job_name:filestatic_configs: - targets:[localhost:8003]3.5 配置alertmanager告警编写告警文件groups: - name: file-queue-alerts rules: - alert: HighFileQueuePending expr: file_queue_pending_count{directory/data/incoming}100for: 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 文件模拟数据流入foriin{1..150};dotouch/data/incoming/data_${i}.jsondone使用命令查看是否成功ls-l/data/incoming运行以下命令检查Prometheus指标是否已更新curlhttp://localhost:8003/metrics|grepfile_queue_pending_count打开 Prometheus Web UI通常是 http://ip:9090我们可以看到已经告警默认大于100就告警。那么我们整个过程就暂时结束啦过程还是很有趣的那么我现在有一个问题倘若我们想在家里监控公司的自定义参数我们如何监控到呢别急cpolar来解决你这个问题4.安装cpolar实现随时随地开发cpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机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-appstatic_configs: - targets:[e0950bc.r2.cpolar.top]监控成功6.保留固定公网地址使用cpolar为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china top然后设置一个二级子域名名称我这里演示使用的是ceshii大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道prometheus点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问本地部署的页面这样一个永久不会变化的二级子域名公网网址即设置好了。这样我们就可以随时随地监控不用担心在家无法监控设备总结完成部署后Prometheus和Alertmanager就形成了一套基础告警链路。Prometheus负责持续采集和评估指标Alertmanager负责接收告警并进行后续处理为后续接入邮件、企业微信、钉钉或其他通知渠道打下基础。这套组合的意义不只是“出现异常就报警”而是让告警逐渐变得可管理。哪些告警需要立即处理哪些只是短暂波动哪些可以合并通知哪些在维护期间应该静默都可以通过Alertmanager继续细化。配置 cpolar 后Prometheus监控页面也可以从外部网络访问。随机域名适合临时验证固定二级子域名更适合作为长期入口方便在家、出差或远程值班时查看监控状态。不过监控页面开放公网后安全问题不能忽视。Prometheus本身更偏向内部监控组件不建议毫无限制地暴露给所有人访问。实际使用中应结合账号访问控制、网络限制或额外认证方式避免监控数据和系统信息被无关人员看到。Prometheus负责发现问题Alertmanager负责整理和分发问题cpolar负责把本地监控入口延伸到外部网络。当这几部分组合起来以后监控系统就不再只是服务器上的一个页面而会逐渐变成一套能帮助运维人员减少噪音、聚焦关键异常的告警基础设施。