Prometheus 告警

DockerBeginner
立即练习

简介

有效的监控不仅仅是收集指标,更重要的是在出现问题时能够及时收到通知。Prometheus 拥有强大的内置告警系统,允许你使用与绘图查询相同的 PromQL 语言来定义告警条件。当告警条件满足时,它会进入「触发(Firing)」状态。

在本实验中,你将学习 Prometheus 告警的基础知识。你将从一个预配置好的环境开始,该环境运行着 Prometheus 和 Node Exporter。你的任务是创建一个独立的告警规则文件,定义一条用于检测 CPU 高负载的规则,配置 Prometheus 加载该文件,最后通过模拟高 CPU 负载来观察告警在 Prometheus UI 中的触发过程。

了解告警环境

在这一步中,你将熟悉实验环境。设置脚本已经为你启动了两个 Docker 容器:一个用于 Prometheus,另一个用于 Node Exporter。

首先,让我们验证两个容器是否都在运行。打开终端并执行 docker ps 命令:

docker ps

你应该会看到类似下面的输出,显示 prometheusnode-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。访问方式如下:

  1. 在 LabEx 界面中,点击顶部导航栏的 +(新建标签页)按钮
  2. 从下拉菜单中选择 Web Service
  3. 在端口号处输入 9090
  4. 点击 Open 启动 Prometheus Web 界面

当新标签页打开时,你应该会看到 Prometheus 表达式浏览器(Expression Browser)的着陆页。从顶部导航菜单导航至 Status -> Targets。你应该能看到 node_exporter 任务处于绿色的「UP」状态,这确认了 Prometheus 已成功从它那里收集数据。这种连接是我们告警规则的基础。

Prometheus Targets UI

为 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:这些为告警添加了人类可读的信息。summarydescription 是标准注解。你可以使用模板变量(如 {{ $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"]

保存文件并退出 nanoCtrl+XYEnter)。

配置更新后,你必须重启 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)的评估结果为假。

Prometheus Inactive Alert

理解告警的三种状态非常重要:

  • 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 告警状态的变化:

  1. 在 15-30 秒内,告警表达式将变为真。告警将移动到 Pending 部分并变为黄色。这意味着 Prometheus 已经检测到高 CPU 负载,但正在等待 for 子句中指定的 1m 时长。
  2. 在 Pending 状态持续一分钟后,告警将移动到 Firing 部分并变为红色。这证实了你的告警规则按预期工作!你可以展开告警查看你定义的注解,其中包含了当前的值。

Prometheus Firing Alert

看到告警触发后,你可以停止负载生成。回到终端并运行以下命令来终止后台循环进程:

重要提示: 为了节省 LabEx 虚拟机服务器资源,请务必运行以下命令停止负载生成。

kill $!

停止负载后,再次观察 Prometheus UI。告警很快会回到 Inactive(绿色)状态,从而完成测试周期。

总结

恭喜!你已经成功配置并测试了一个 Prometheus 告警。

在本实验中,你学习了如何:

  • 在独立的 YAML 文件中组织告警规则。
  • 编写 PromQL 表达式来定义 CPU 高负载的告警条件。
  • 使用注解创建有意义、人类可读的告警消息。
  • 配置 Prometheus 加载规则文件并重启以应用更改。
  • 在 Prometheus UI 中观察告警的生命周期,从 Inactive 到 Pending 再到 Firing。
  • 模拟条件来触发并测试你的告警。

这是告警体系的第一部分。下一个合乎逻辑的步骤(超出本实验范围)是设置一个 Alertmanager 实例。Prometheus 会将触发的告警发送给 Alertmanager,由其负责去重、分组,并将告警路由到实际的通知渠道,如电子邮件、Slack 或 PagerDuty。