大家好,今天想和大家聊一聊“可观测性”以及围绕它展开的 Monitor 监控体系。很多团队在做系统建设时,都会遇到两个典型的困惑:一是已经部署了监控系统,但线上出故障时还是需要靠人工逐个 SSH 进服务器查看日志;二是看到 Prometheus、Grafana、Alertmanager 这些组件时,CPU 指标、内存指标、请求数指标都采集了,告警也配了,但告警内容却常常让值班同学一头雾水。这些问题的背后,往往不是“监控不够多”,而是“可观测性建设不够体系化”。
本文将围绕可观测性与 Monitor 这个主题展开,先梳理清楚概念边界,再带大家用 Prometheus 全家桶从零搭建一套可以落地的最小监控告警系统。内容覆盖核心原理、配置文件、PromQL 查询、Grafana 可视化、Alertmanager 告警,以及生产环境常见坑点和最佳实践。不管是刚开始接触监控的新手,还是已经在项目里使用监控但未形成体系的后端、运维同学,都可以在这篇文章里找到可以参考的内容。
1. 可观测性与 Monitor 的概念边界
1.1 什么是可观测性
“可观测性”这个词最早来自控制理论,指的是系统能够从外部输出信息推断出其内部状态的程度。放到互联网软件工程语境下,可观测性就是:一个系统运行得好不好、为什么不好,我们能否通过它暴露出来的数据准确判断出来。
想象一个非常朴素的场景:服务突然变慢了,用户开始投诉。如果团队只有“服务是活的”这个信息,那么面对故障时基本无从下手。但如果此时我们有请求耗时曲线、错误率曲线、CPU 和内存用量、依赖中间件的延迟数据,甚至每一次请求的完整调用链,那么定位问题就会从容很多。
这就引出了业界常说的可观测性三大支柱(Three Pillars of Observability):
- Metrics(指标):以数值形式周期性采集的数据,如 QPS、响应时间、错误数、CPU 使用率。它的特点是存储成本低、查询效率高,适合衡量系统的整体健康状态和触发告警。
- Logging(日志):离散的、带时间戳的事件记录,详细描述某个时间点发生了什么。它的信息最丰富,但数据量通常最大,适合事后分析和故障根因定位。
- Tracing(链路追踪):记录一次请求从入口到下游各个服务的完整调用路径和耗时。它用于回答“这个慢请求到底慢在哪个环节”。
三大支柱之间不是替代关系,而是互补关系。指标告诉你哪里出了问题,日志告诉你具体报了什么错,链路追踪告诉你是哪个下游调用导致的延迟。一个真正具备可观测性的系统,需要把这三类数据协同起来。
1.2 Monitor 在不同技术语境下的含义
“Monitor”这个词在不同技术领域里指的东西差别很大,这里做一个简单区分,避免后面阅读时产生混淆。
本文讨论的 Monitor,是作为“监控体系”来理解的,包括指标采集、数据存储、可视化、告警通知等一整套方案。这也是最常见、最通用的理解。
在一些硬件或嵌入式场景中,Monitor 也可能指显示设备上的“菜单叠加层”。例如 mstar(晨星半导体)的 monitor 方案中经常提到的 OSD 菜单制作,就是在视频输出画面上叠加图形化菜单。这类方案主要面向电视、显示器、机顶盒类产品,与互联网后端监控体系属于完全不同的技术栈。
再比如 UE 插件里的 hardware monitor plugin,它属于游戏引擎或图形应用侧的“硬件状态监控”工具,用来采集 CPU、GPU、显存占用等信息,帮助开发者做性能优化。这类工具通常是单机的、面向开发者自测的。
所以如果你在搜索引擎里看到“Monitor”,需要先判断它所在的语境是服务器监控、嵌入式显示,还是游戏引擎开发。本文后续内容全部围绕互联网后端及基础设施的监控体系展开。
1.3 监控与可观测性的区别
很多人会把“监控”和“可观测性”划等号,但实际上它们侧重点不同。
监控(Monitoring)更偏向“已知问题的发现”。它关注的是:我们提前定义好一批关键指标和阈值,当指标超过阈值时发出告警。监控解决的是“系统是否还健康”的问题。它的前提是团队知道自己需要盯哪些数字。
可观测性(Observability)更偏向“未知问题的探索”。它关注的是:当系统出现一个没有预料到的故障时,我们能否基于已有的数据快速推断出根因。可观测性解决的是“系统为什么变成这样”的问题。
一个直观的例子:监控能告诉你“CPU 使用率 95%,触发告警”,但可观测性会进一步帮你在 Trace 数据中看到 CPU 飙高是因为某个新上线的接口逻辑存在死循环。换句话说,监控告诉你“有问题”,可观测性帮你“定位问题”。两者是递进关系,监控系统是构建可观测性的基础设施,可观测性是监控系统建设的更高目标。
2. 环境准备与组件说明
在开始搭建之前,先说明本文示例所用的实验环境。软件版本更新比较快,具体小版本号请以官方发布为准。
| 组件 | 说明 |
|---|---|
| 操作系统 | Linux,CentOS 7 或 Ubuntu 20.04 均可,本文以 Ubuntu 20.04 为例 |
| Prometheus | 2.x 系列,负责指标采集、存储和 PromQL 查询 |
| Node Exporter | 1.x 系列,负责采集主机层的 CPU、内存、磁盘、网络等指标 |
| Grafana | 10.x 系列或更高,负责指标可视化展示 |
| Alertmanager | 0.2x 系列,负责接收 Prometheus 告警并做消息路由、去重和通知 |
如果你的项目使用的是 Docker 环境,也可以全部用容器部署,便于隔离和快速重建。本文采用二进制方式部署,目的是让读者更清楚地看到每个组件的数据流和配置文件,理解原理之后再考虑容器化也会更轻松。
建议操作系统最少为 2 核 CPU、2GB 内存,磁盘预留 20GB。生产环境中磁盘容量需要根据指标数量和保留周期单独评估,后面会在最佳实践部分详细说明。
3. 核心原理拆解:Prometheus 是怎么工作的
3.1 Prometheus 的架构与数据模型
Prometheus 是一款开源的服务监控系统和时序数据库。它的工作流程可以简化描述为:
- Prometheus 通过 HTTP 接口周期性“拉取”(Pull)被监控目标的指标数据。
- 被监控目标通过 Exporter 把内部状态转换成 Prometheus 能识别的指标格式,并通过 HTTP 暴露出来。
- Prometheus 把拉取到的指标按时间序列方式存储到本地 TSDB。
- 用户通过 PromQL 查询数据,或通过 Grafana 可视化展示。
- 用户预先定义告警规则,Prometheus 定期计算规则,当满足触发条件时把告警推给 Alertmanager。
在 Prometheus 中,一条时间序列由三个要素唯一确定:
- 指标名称:例如
node_cpu_seconds_total,表示 CPU 累计使用秒数。 - 标签:一组 key-value 对,用于区分同一指标的不同维度。例如
cpu="0"、instance="192.168.1.10:9100"。 - 样本值:由时间戳和数值组成。
用下面的示例来表示一条数据:
node_memory_MemAvailable_bytes{instance="192.168.1.10:9100", job="node-exporter"} 8388608000其中node_memory_MemAvailable_bytes是指标名,{instance="...", job="..."}是标签集合,8388608000是当前值,采样时自动附带时间戳。
标签非常重要,因为 PromQL 的聚合、分组、过滤都依赖标签。设计标签时如果滥用高基数标签(每个样本取值特别多的标签,例如把用户 ID 作为标签),会导致时序数据膨胀,拖垮查询性能和存储空间。这一点在最佳实践章节会展开讲。
3.2 Prometheus 的四种指标类型
Prometheus 客户端库支持四种核心指标类型:
| 类型 | 特点 | 典型使用场景 |
|---|---|---|
| Counter | 只增不减的计数器,重启后可清零 | 请求总数、错误总数、CPU 累计时间 |
| Gauge | 可增可减的瞬时值 | 当前 CPU 使用率、内存使用量、在线连接数 |
| Histogram | 观测值分布统计,可计算分位数 | 请求耗时分布、响应体大小 |
| Summary | 类似 Histogram,但分位数由客户端计算 | 请求耗时百分位、需要精确分位数时 |
以 Counter 为例,因为它是“只增不减”,所以查询“每秒请求数”时不能直接看原始值,而要使用 rate 函数计算变化速率:
rate(http_requests_total[5m])这条语句表示统计最近 5 分钟内请求数的每秒平均增量。这个思路在监控里面很常见,如果没有理解 Counter 的语义,很容易拿原始值去做判断,导致结果偏差。
3.3 Pull 模型与 Push 模型对比
Prometheus 默认采用 Pull 模型,也就是由 Prometheus 主动去目标地址抓取指标,而不是由业务主动上报。这样做的好处是:
- Prometheus 可以随时通过
/targets页面看到哪些目标在线、哪些离线。 - 采集目标不需要感知监控系统的存在,解耦了业务与监控。
- 更容易做采集质量控制和问题排查。
与之对应的 Push 模型则适用于一次性任务、短生命周期任务、无法被轮询的网络环境。Prometheus 提供了 Pushgateway 在中间层接收此类指标,但生产环境要谨慎使用,因为它会增加指标管理复杂度,且容易造成指标长期不更新但仍在展示的问题。
本文的监控对象是主机,Node Exporter 天然支持 Pull,所以我们直接按照 Pull 模型搭建即可。
3.4 PromQL 基础
PromQL 是 Prometheus 的查询语言,是后续写仪表盘和告警表达式的基础。这里只列出最常用的几个操作,帮助读者先能读懂示例。
选择指定指标:
node_memory_MemTotal_bytes通过标签过滤:
node_cpu_seconds_total{cpu="0", mode="idle"}使用正则匹配:
node_disk_io_time_seconds_total{device=~"sd.*"}计算速率:
rate(node_cpu_seconds_total{mode="idle"}[5m])聚合计算:
sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)聚合表达式在生产中非常常用,尤其是 CPU 使用率指标,通常会按照模式维度做分组聚合后再进行计算。具体表达式会在后面的实战演练中完整给出。
4. 完整实战:搭建一套可落地的监控告警系统
下面进入本文的实战部分。我们将逐步搭建一套能够采集主机基础指标、展示 Grafana 仪表盘、并在服务异常时发送告警的完整系统。
4.1 下载并启动 Node Exporter
打开 Prometheus 官网 Downloads 页面,找到 node_exporter 的下载链接,复制 Linux amd64 版本的 tarball 地址。
cd /opt/ wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz tar xvf node_exporter-1.8.2.linux-amd64.tar.gz cd node_exporter-1.8.2.linux-amd64版本号请以官网实际发布为准,上述命令中的1.8.2仅是一个示例版本。解压后直接运行二进制文件:
./node_exporter --web.listen-address=":9100"启动成功后,可以访问:
http://<服务器IP>:9100/metrics在浏览器中可以看到大量以node_开头的指标,例如:
node_cpu_seconds_total{cpu="0",mode="idle"} 1.234567e+06 node_memory_MemTotal_bytes 8.44e+09 node_filesystem_avail_bytes{device="/dev/sda1",mountpoint="/"} 6.78e+09这些指标已经是 Prometheus 标准格式,不需要做任何转换,Prometheus 可以直接抓取。
实际生产环境中,不建议直接在前台运行 node_exporter,更推荐使用 systemd 或 supervisor 托管进程,实现开机自启、崩溃自动拉起和日志管理。以 systemd 为例:
[Unit] Description=Node Exporter After=network.target [Service] User=prometheus ExecStart=/opt/node_exporter-1.8.2.linux-amd64/node_exporter --web.listen-address=":9100" Restart=always RestartSec=5 [Install] WantedBy=multi-user.target将文件保存为/etc/systemd/system/node_exporter.service,然后执行:
systemctl daemon-reload systemctl enable --now node_exporter这样即使机器重启,Node Exporter 也会自动运行。
4.2 安装并配置 Prometheus
创建 Prometheus 数据目录和配置目录:
mkdir -p /opt/prometheus/data mkdir -p /etc/prometheus cd /opt/ wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz tar xvf prometheus-2.53.0.linux-amd64.tar.gz cd prometheus-2.53.0.linux-amd64同样地,版本号请以官网为准。接下来编写核心配置文件/etc/prometheus/prometheus.yml:
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "node-exporter" static_configs: - targets: ["localhost:9100"]配置说明:
scrape_interval:Prometheus 每隔多长时间抓取一次指标,默认 15 秒。evaluation_interval:Prometheus 每隔多长时间计算一次告警规则。job_name:一组采集任务的名称,会作为标签job写入每条时序数据。targets:需要被抓取的地址列表,可以写多个。
启动 Prometheus:
/opt/prometheus-2.53.0.linux-amd64/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/opt/prometheus/data也可以添加--web.listen-address=:9090指定监听端口。启动后访问http://<服务器IP>:9090,能看到 Prometheus 自带的查询页面。
点击顶部导航栏的 Status -> Targets,可以看到node-exporter任务处于 UP 状态,这代表采集正常。
4.3 通过 PromQL 查询主机核心指标
在 Prometheus 查询页面输入以下表达式,点击 Execute 查看结果。
CPU 使用率:
100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100这里的逻辑是:先计算 5 分钟内 CPU 空闲时间的每秒变化率,取平均值后得到空闲比例,再用 100 减去它,得到 CPU 使用率。
内存使用率:
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100磁盘使用率:
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100节点在线状态:
upup是 Prometheus 自动生成的指标,值为 1 时表示采集目标在线,值为 0 时表示离线。这个指标非常适合用作主机存活告警。
如果以上查询都能返回正常数值,说明监控采集链路已经打通。
4.4 安装 Grafana 并配置仪表盘
Grafana 负责把 Prometheus 中的数据变成可视化图表。
Ubuntu 下可以通过 apt 安装:
sudo apt-get install -y software-properties-common sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main" wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - sudo apt-get update sudo apt-get install -y grafana安装完成后启动:
sudo systemctl enable --now grafana-server访问http://<服务器IP>:3000,默认用户名和密码均为admin,首次登录会要求修改密码。
登录后按以下步骤配置数据源:
- 左侧菜单栏点击 Connections -> Data sources。
- 点击 Add data source,选择 Prometheus。
- 在 HTTP URL 一栏填写
http://localhost:9090。 - 点击底部的 Save & test,提示 Success 即表示连接成功。
数据源配置完成后,可以手动创建一个 Dashboard,也可以导入官方现成的仪表盘模板。以 Node Exporter Full 模板为例,在 Grafana 左侧 Dashboards 页面点击 Import,输入模板 ID,点击 Load,然后选择刚才配置的 Prometheus 数据源并导入。导入完成后就能看到包含 CPU、内存、磁盘、网络等图表的完整主机监控面板。
如果想自己手动创建一个面板,在 Dashboard 中点击 Add -> Visualization,选择 Prometheus 数据源,在查询框中输入上面的 PromQL 表达式,例如 CPU 使用率表达式,图表类型选择 Time series,即可看到实时曲线。手动创建面板的好处是能更深入理解每个指标的计算逻辑。
4.5 配置 Alertmanager 实现告警通知
监控数据可视化只是第一步,真正让监控产生价值的是告警通知。当指标异常时,值班人员需要及时收到消息。Alertmanager 负责处理告警的接收、去重、分组和路由。
下载并解压 Alertmanager:
cd /opt/ wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz tar xvf alertmanager-0.27.0.linux-amd64.tar.gz cd alertmanager-0.27.0.linux-amd64创建配置文件/etc/prometheus/alertmanager.yml,下面是一个使用 Webhook 通知的简化示例:
route: group_by: ['alertname', 'instance'] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: 'webhook' receivers: - name: 'webhook' webhook_configs: - url: 'http://localhost:8080/alert'配置说明:
group_by:告警分组字段,相同 instance 上的告警会合并成一条通知。group_wait:组内第一条告警等待多久再发送,用于缓冲短时间内的告警风暴。repeat_interval:同一条告警重新通知的间隔,避免不断骚扰。receivers:定义告警被发送到哪个渠道,Webhook、邮件、钉钉、企业微信等都可以。
启动 Alertmanager:
/opt/alertmanager-0.27.0.linux-amd64/alertmanager \ --config.file=/etc/prometheus/alertmanager.yml默认监听端口为9093。
接下来在 Prometheus 中定义告警规则。创建目录并新建规则文件/etc/prometheus/rules/host.yml:
groups: - name: host-monitoring rules: - alert: HostDown expr: up == 0 for: 1m labels: severity: critical annotations: summary: "主机 {{ $labels.instance }} 已离线" description: "主机 {{ $labels.instance }} 已经超过 1 分钟无法采集到指标。" - alert: HighCpuUsage expr: 100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 90 for: 5m labels: severity: warning annotations: summary: "主机 {{ $labels.instance }} CPU 使用率过高" description: "CPU 使用率已持续超过 90%,当前值为 {{ $value }}%。"规则说明:
alert:告警规则名称。expr:触发条件表达式,当计算结果大于阈值时进入 Pending 状态。for:条件持续多长时间才触发告警,用于过滤瞬时抖动。labels:为告警附加标签。annotations:告警通知里展示的摘要和详情内容。
修改 Prometheus 配置文件,在末尾加入 rules 路径:
rule_files: - /etc/prometheus/rules/*.yml重启 Prometheus:
pkill -f prometheus /opt/prometheus-2.53.0.linux-amd64/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/opt/prometheus/data重启后访问 Prometheus 的 Alerts 页面,可以看到刚才定义的两条规则已经加载。此时如果直接停掉 Node Exporter 或者使用压测工具拉高 CPU,等待一段时间后就能看到告警状态从 Inactive 变为 Pending,再变为 Firing,并推送到 Alertmanager。Alertmanager 最终会按配置的 Webhook 地址发出 HTTP 请求。
如果本地没有配置 Webhook 接收端,可以使用邮件方式验证。在 Alertmanager 配置中增加一个 email 接收器即可,但生产环境更推荐使用办公即时通讯工具的机器人 Webhook,例如钉钉或企业微信自定义机器人,这类方式配置简单、到达率高,且不需要维护邮箱服务器。
5. 常见问题与排查思路
监控系统搭好后,经常会遇到一些看起来不起眼但很影响使用体验的问题。下面把高频问题整理成表格,再补充详细排查思路。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| Targets 页面显示 DOWN | Exporter 未启动;端口不通;防火墙拦截 | 检查进程、端口、防火墙 |
| 指标为空,查询无数据 | Job 名或标签写错;数据源选择错误 | 检查 PromQL 标签过滤条件;检查 Grafana 数据源 |
| 告警一直不触发 | 表达式写错;for 持续时间未满足 | 先在 Prometheus 查询页手动执行表达式 |
| 告警风暴频繁 | 阈值调整成固定值,未结合业务周期 | 使用动态阈值、增加 for 时长、按业务周期分组 |
| 磁盘占用快速增长 | 指标数量过多、保留周期过长 | 调整 storage 保留时间;减少高基数标签;对历史数据做归档 |
| Grafana 数据显示时区不正确 | 浏览器与时区设置不一致 | 在 Grafana 默认设置中调整时区为 Asia/Shanghai |
5.1 Node Exporter 未启动导致 DOWN
如果在 Prometheus Targets 页面看到目标状态是 DOWN,第一步先在本机访问 Exporter 的 metrics 地址:
curl http://localhost:9100/metrics如果连接拒绝,说明 Node Exporter 进程没有运行或端口配置不对。检查进程和监听端口:
ps -ef | grep node_exporter ss -lntp | grep 9100如果 curl 正常返回,但 Prometheus 依然显示 DOWN,需要检查 Prometheus 所在机器能否访问到该地址,以及服务器防火墙是否放行了 9100 端口。
5.2 查询结果为空
PromQL 返回空数据时,优先检查指标名称和标签是否匹配。例如写了node_memory_MemFree_bytes但当前 Exporter 指标名实际是node_memory_MemAvailable_bytes,就会查不到数据。可以在 Prometheus 的查询页输入node_memory_MemTotal_bytes不带任何标签看是否有结果,再逐步添加过滤条件。
5.3 告警不触发
告警表达式写完后,先在 Prometheus 查询页手动执行一遍,确认表达式结果能达到阈值。如果表达式本身输出为空,那告警自然也不会触发。另外注意for字段,只有当条件持续满足指定时间后,告警才会从 Pending 转为 Firing,刚开始测试时建议把 for 设短一些,比如 10s,确认整套链路通后再调整成生产值。
5.4 告警重复通知
告警重复通知通常由repeat_interval设置过短引起。生产环境建议设置为 4 小时以上,避免一个故障持续期间值班人员收到大量重复消息。同时配合group_wait和group_interval做分组聚合,把同一时间的相关告警合并成一条通知。
6. 最佳实践与工程建议
6.1 指标命名与标签设计
指标命名最好遵循统一规范。Prometheus 社区的经验是使用“命名空间_子系统_单位_描述”的格式,例如node_cpu_seconds_total、http_request_duration_seconds。如果公司内部有统一的指标规范,优先遵守团队规范,而不是自己另搞一套。
标签设计要重点控制基数。不要把请求 ID、用户 ID、订单 ID 这类取值无限的字段放进标签里。高基数标签会显著增加时序数据量,拖慢监控系统整体性能。如果需要按用户维度分析,建议把这类数据放到日志系统里,通过日志检索来定位,而不是放进 Prometheus 指标中。
6.2 告警设计要“可行动”
告警不是越多越好,也不是越灵敏越好。好的告警应该满足两个条件:第一,收到告警的人不需要再花大量时间排查才能判断问题严重性;第二,告警对应一个明确的响应动作。
一条告警通知里至少要包含以下信息:
- 发生了什么问题,指标名和当前值。
- 影响范围,哪台机器、哪个服务、哪个地域。
- 已经持续多久。
- 应该找谁来处理,是否有可用的应急预案。
很多团队把全部监控项都配上告警,结果就是告警风暴让值班同学麻木,最终真正重要的告警也被忽略。建议每一条告警规则都经过评审,持续修不好的“狼来了”告警应该被优化或关闭。
6.3 使用 Systemd 管理监控组件
不要用nohup或者直接在 Shell 里后台运行监控组件,推荐使用 systemd 全部托管。这样能保证进程崩溃后自动重启,开机后自动拉起,同时journalctl -u prometheus也能方便地查看日志。生产环境还要考虑监控组件自身的可用性,有条件的话监控节点也应该做高可用,避免监控系统单点。
6.4 控制数据保留周期与磁盘容量
Prometheus 默认将数据保存在本地磁盘,默认保留 15 天。这个参数可以启动时用--storage.tsdb.retention.time修改。数据保留时间越长,磁盘开销越大,查询性能也会受到影响。本文演示环境指标量很小,但生产环境如果管理几万台机器的指标,需要认真做容量规划。
一个简单的估算方式是:每天新增指标数据量约等于采样指标总数乘以每个样本的平均大小再乘以每天采样次数。可以先运行一段时间观察磁盘增长速率,再反推合适的保留周期和磁盘规格。
6.5 安全边界
Prometheus、Grafana、Alertmanager 都提供了 Web 管理页面,默认没有鉴权时任何人都可以访问,这是很大的安全隐患。至少应该做到:
- 将监控组件部署在内网或专有网络。
- 对 Grafana 配置强口令,并开启登录鉴权。
- 通过反向代理或防火墙对 Prometheus 管理端口做访问控制。
- 如果必须暴露到外网,配置 HTTPS 和认证。
- 对 Exporter 的访问地址做白名单限制,避免被恶意采集或信息泄露。
6.6 监控系统自身的测试
监控系统上线后,要定期做“故障演练”。例如主动停掉一个 Node Exporter,确认告警能否在预期时间内到达;主动拉高 CPU 使用率,确认告警内容和阈值是否符合预期。很多团队在搭建监控时花了很多精力,但从来没有真正验证过告警链路是否可用,直到线上故障发生时才发现问题,这种教训代价很高。
7. 总结与下一步学习方向
这篇文章从可观测性的基本概念讲起,梳理了 Metrics、Logging、Tracing 三大支柱的定位,也区分了“监控”和“可观测性”的差异,然后通过完整的手把手实操,搭建了一套基于 Prometheus + Node Exporter + Grafana + Alertmanager 的主机监控告警系统。现在你应该已经掌握了:
- Prometheus 的数据模型和四种指标类型。
- Pull 模型与 Push 模型的核心区别。
- 通过 PromQL 查询 CPU、内存、磁盘等核心指标。
- 编写 prometheus.yml 和告警规则。
- Alertmanager 的分组、路由和通知配置。
- 监控系统开发过程中容易踩的常见坑。
如果接下来想继续深入,可以考虑以下几个方向:
一是把监控对象从主机扩展到应用层。可以接入 Spring Boot Actuator、Gin、Django 等框架的指标端点,采集 JVM、线程池、HTTP 接口 QPS 和响应时间等业务指标。二是引入日志采集系统,例如 Loki 或 ELK,并尝试把日志、指标、告警联动起来,形成完整的故障定位闭环。三是学习 Kubernetes 场景下的监控方案,理解 kube-state-metrics、cAdvisor、Prometheus Operator 的工作原理。
最后建议读者不要停留在“把监控搭起来”这个阶段,而是持续打磨监控指标体系,把每个告警都优化到“收到消息就能直接知道该干什么”的程度。看完文章后可以亲手做一遍实验,尝试停掉进程、模拟高负载、修改告警阈值,真正跑通整个故障发现与通知流程。这样在遇到线上问题时,你才能从“看谁先发现”变成“系统第一时间告诉你发生了什么”。