简介
有效的监控不仅仅是收集指标,更重要的是在出现问题时能够及时收到通知。Prometheus 拥有强大的内置告警系统,允许你使用与绘图查询相同的 PromQL 语言来定义告警条件。当告警条件满足时,它会进入「触发(Firing)」状态。
在本实验中,你将学习 Prometheus 告警的基础知识。你将从一个预配置好的环境开始,该环境运行着 Prometheus 和 Node Exporter。你的任务是创建一个独立的告警规则文件,定义一条用于检测 CPU 高负载的规则,配置 Prometheus 加载该文件,最后通过模拟高 CPU 负载来观察告警在 Prometheus UI 中的触发过程。
了解告警环境
在这一步中,你将熟悉实验环境。设置脚本已经为你启动了两个 Docker 容器:一个用于 Prometheus,另一个用于 Node Exporter。
首先,让我们验证两个容器是否都在运行。打开终端并执行 docker ps 命令:
docker ps
你应该会看到类似下面的输出,显示 prometheus 和 node-exporter 容器处于「Up」状态。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
... prom/prometheus "/bin/prometheus --c…" 15 seconds ago Up 14 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
... prom/node-exporter "/bin/node_exporter …" 16 seconds ago Up 15 seconds 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp node-exporter
node-exporter 容器暴露了关于宿主系统(我们的实验虚拟机)的指标,而 prometheus 容器则被配置为抓取(收集)这些指标。
现在,让我们检查 Prometheus UI。访问方式如下:
- 在 LabEx 界面中,点击顶部导航栏的
+(新建标签页)按钮 - 从下拉菜单中选择 Web Service
- 在端口号处输入
9090 - 点击 Open 启动 Prometheus Web 界面
当新标签页打开时,你应该会看到 Prometheus 表达式浏览器(Expression Browser)的着陆页。从顶部导航菜单导航至 Status -> Targets。你应该能看到 node_exporter 任务处于绿色的「UP」状态,这确认了 Prometheus 已成功从它那里收集数据。这种连接是我们告警规则的基础。

为 CPU 高负载告警创建 alert-rules.yml
在这一步中,你将为告警规则创建一个专用文件。为了更好地组织配置,将规则与 Prometheus 主配置文件分开存放是一种最佳实践。
我们将在项目目录中创建一个名为 alert-rules.yml 的文件。使用 nano 编辑器创建并编辑该文件:
nano ~/project/alert-rules.yml
现在,将以下 YAML 内容复制并粘贴到 nano 编辑器中。这定义了一个包含单个告警的规则组,当 CPU 使用率过高时会触发该告警。
groups:
- name: node_alerts
rules:
- alert: HighCpuLoad
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 10
for: 1m
labels:
severity: warning
annotations:
summary: "High CPU load on {{ $labels.instance }}"
description: "CPU load is > 10% (current value: {{ $value }}%)"
让我们解析一下这条规则:
groups:规则被组织在组中。组内的所有规则按顺序进行评估。alert:告警的名称,即HighCpuLoad。expr:被评估的 PromQL 表达式。如果它返回结果,告警就会被触发。在这里,我们计算了过去一分钟内非空闲 CPU 时间的百分比。如果大于 10%,则满足条件。for:该子句指定条件必须持续满足一段时间(1 分钟)后,告警才会变为「触发(Firing)」状态。这可以防止因短暂的峰值而误报。annotations:这些为告警添加了人类可读的信息。summary和description是标准注解。你可以使用模板变量(如{{ $labels.instance }}和{{ $value }})在告警消息中包含动态数据。
粘贴内容后,按 Ctrl+X,然后按 Y,最后按 Enter 保存文件并退出 nano。
运行挂载了规则文件的 Prometheus 容器
在这一步中,你将告知 Prometheus 加载你的新规则文件,并使用更新后的配置重启容器。
首先,你需要编辑主配置文件 prometheus.yml,以包含对规则文件的引用。使用 nano 打开它:
nano ~/project/prometheus.yml
在文件的顶层添加 rule_files 指令,注意不要放在 global 块内。修改后的文件应如下所示:
global:
scrape_interval: 15s
rule_files:
- "alert-rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "node_exporter"
static_configs:
- targets: ["node-exporter:9100"]
保存文件并退出 nano(Ctrl+X,Y,Enter)。
配置更新后,你必须重启 Prometheus 容器以应用更改。首先,停止并删除旧容器:
docker stop prometheus
docker rm prometheus
最后,运行一个新的 Prometheus 容器。此命令与设置脚本中的命令类似,但增加了一个 -v 标志,用于将你的 alert-rules.yml 文件挂载到容器中。
docker run -d --name prometheus -p 9090:9090 \
--network monitoring \
-v /home/labex/project/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /home/labex/project/alert-rules.yml:/etc/prometheus/alert-rules.yml \
prom/prometheus
此命令确保主配置文件和告警规则在 Prometheus 容器内均可用。
在 Prometheus UI 中验证告警规则是否已加载
在这一步中,你将确认 Prometheus 已成功加载你的新告警规则。
回到浏览器中的 Prometheus UI 标签页(如果需要,可以打开一个新的 9090 端口 Web Service 标签页)。如果页面无法加载,请等待几秒钟让新容器启动,然后刷新页面。
在顶部导航栏中,点击 Alerts 菜单项。
现在你应该能看到列出的 HighCpuLoad 告警。该告警将处于 Inactive(非活跃)部分,并以绿色背景显示。这是预期的状态,因为系统当前的 CPU 负载较低,所以告警表达式(expr)的评估结果为假。

理解告警的三种状态非常重要:
- Inactive(绿色): 告警条件为假。
- Pending(黄色): 告警条件已变为真,但尚未持续达到
for指定的时长。Prometheus 正在观察该条件是否持续。 - Firing(红色): 告警条件已持续满足了整个
for时长。在生产环境中,此时 Prometheus 会将告警发送给 Alertmanager。
你的告警目前处于非活跃状态,这是正确的。在下一步中,我们将触发它。
模拟负载以测试告警触发
在最后一步中,你将有意增加系统的 CPU 负载,以测试告警是否能正确触发。
我们可以使用一个简单的无限 shell 循环来生成 CPU 负载。在终端中运行以下命令。末尾的 & 会让进程在后台运行,这样你就可以继续使用终端。
while true; do true; done &
此命令启动了一个消耗 100% 单核 CPU 的进程。现在,快速切换回 Prometheus UI 中的 Alerts 页面(通过 9090 端口的 Web Service 标签页访问)。
你将观察到 HighCpuLoad 告警状态的变化:
- 在 15-30 秒内,告警表达式将变为真。告警将移动到 Pending 部分并变为黄色。这意味着 Prometheus 已经检测到高 CPU 负载,但正在等待
for子句中指定的1m时长。 - 在 Pending 状态持续一分钟后,告警将移动到 Firing 部分并变为红色。这证实了你的告警规则按预期工作!你可以展开告警查看你定义的注解,其中包含了当前的值。

看到告警触发后,你可以停止负载生成。回到终端并运行以下命令来终止后台循环进程:
重要提示: 为了节省 LabEx 虚拟机服务器资源,请务必运行以下命令停止负载生成。
kill $!
停止负载后,再次观察 Prometheus UI。告警很快会回到 Inactive(绿色)状态,从而完成测试周期。
总结
恭喜!你已经成功配置并测试了一个 Prometheus 告警。
在本实验中,你学习了如何:
- 在独立的 YAML 文件中组织告警规则。
- 编写 PromQL 表达式来定义 CPU 高负载的告警条件。
- 使用注解创建有意义、人类可读的告警消息。
- 配置 Prometheus 加载规则文件并重启以应用更改。
- 在 Prometheus UI 中观察告警的生命周期,从 Inactive 到 Pending 再到 Firing。
- 模拟条件来触发并测试你的告警。
这是告警体系的第一部分。下一个合乎逻辑的步骤(超出本实验范围)是设置一个 Alertmanager 实例。Prometheus 会将触发的告警发送给 Alertmanager,由其负责去重、分组,并将告警路由到实际的通知渠道,如电子邮件、Slack 或 PagerDuty。



