PromQL 基础查询

LinuxBeginner
立即练习

介绍

现在,Prometheus 已经从 Node Exporter 收集指标,你可以开始针对这些数据提出问题。

Prometheus 有自己的查询语言,称为 PromQL(Prometheus Query Language)。

PromQL 很重要,因为只有在能够筛选、组合并计算原始指标,从中得到有意义的答案时,原始指标才真正有用。

从这里开始,监控就不再只是收集数据,而是进一步分析数据。Prometheus 的价值不仅在于存储数字,还在于 PromQL 能将这些数字转换成问题和答案。

在本实验中,你将提出三类问题:

  1. 简单事实:「有多少可用内存?」
  2. 速率:「CPU 工作得有多快?」
  3. 数学计算:「内存已使用了百分之多少?」

你将使用 Prometheus Web Interface(Web Service)输入这些问题并查看答案。

查询可用内存

在本步骤中,你将查询可用内存的字节数,并保存响应。

先从一个简单事实开始:我们想知道还有多少可用内存(RAM)。

先打开 Prometheus 界面:

点击 LabEx 界面左上角菜单中的 Prometheus 标签,打开仪表板。

界面加载后,找到醒目的搜索栏。你将在这里输入要向 Librarian 提出的问题。

在搜索栏中输入以下查询:

node_memory_MemFree_bytes

这段文本是表示「可用内存」的数据点名称。输入后,点击 Execute 按钮。

查询可用内存

查看结果:

你应该会在「Value」列中看到一个数字。这个数字可能大得出乎意料,例如 5204746240。这是正常的,因为计算机使用 Bytes 统计内存,而 Bytes 是非常小的单位。

注意:有时「Value」列中的数字可能会被 Labby 聊天窗口遮挡。如果看不到该值,可以暂时关闭 Labby 对话框来查看数字,查看完成后再重新打开。

为了确认查询结果正确(因为我们无法看到你的屏幕),请在终端中运行以下命令,将答案保存到文件:

curl "http://localhost:9090/api/v1/query?query=node_memory_MemFree_bytes" > ~/project/free_memory.json
cat ~/project/free_memory.json
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"node_memory_MemFree_bytes","instance":"localhost:9100","job":"node_exporter"},"value":[1768698428.127,"4001128448"]}]}}

查询 CPU 速率

在本步骤中,你将使用 rate() 查询 CPU 计数器增长的速率。

现在来看一个更难的问题。

汽车的速度表不会显示「行驶总里程」,而是显示「每小时行驶的英里数」(速度)。

CPU 使用率的情况类似。Prometheus 会记录「CPU 从启动以来工作的总秒数」。这个数字会不断增大。

这类指标称为计数器(counter),因为它们会随着时间累积。要了解当前的运行情况,通常需要使用 rate() 这样的函数,将累计增长转换为按时间计算的信号。

要查看「CPU 当前工作得有多繁忙」,我们需要计算 速率(速度)。

问题:

rate(node_cpu_seconds_total[1m])

分解说明:

  • node_cpu_seconds_total:原始数据(总秒数)。
  • [1m]:「查看最近 1 分钟的数据。」
  • rate(...):「计算这个数字在该分钟内增长的速度。」

在 Web UI 中尝试:

将查询 rate(node_cpu_seconds_total[1m]) 粘贴到搜索栏中,然后点击 Execute。你很可能会看到许多行数字,因为计算机通常有多个 CPU 核心!

保存答案(用于验证):

curl -g "http://localhost:9090/api/v1/query?query=rate(node_cpu_seconds_total[1m])" > ~/project/cpu_rate.json

-g(--globoff)选项禁用 curl 的 URL 通配扩展,使 curl 原样发送 [1m] 中的方括号,而不会将它们解释为 URL 范围。Shell 引号使完整的查询 URL 保持为一个参数。

计算百分比

在本步骤中,你将把内存指标组合成百分比。

「有 5 亿 Bytes 可用」不容易理解,而「剩余 50%」就很直观。

Prometheus 可以帮你完成数学计算。

正是这种算术能力让 PromQL 在运维场景中非常强大。你可以将多个底层指标组合起来,生成更高层次的健康指标,方便人们理解。

我们想知道:内存已使用了百分之多少?

计算公式为:$$ \text{已使用百分比} = \frac{\text{总内存} - \text{可用内存}}{\text{总内存}} \times 100 $$

PromQL 查询:

(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100

在 Web UI 中尝试:

将这条较长的数学表达式粘贴到搜索栏中,然后点击 Execute。你应该会看到一个数字,例如 45.2。这表示你的内存已使用 45.2%。

保存答案:

curl "http://localhost:9090/api/v1/query?query=(node_memory_MemTotal_bytes-node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100" > ~/project/memory_usage.json

将数据可视化

在本步骤中,你将绘制内存查询的图表,并理解坐标轴的含义。

最后,用图表查看数据比直接看数字更直观。

保持数学查询仍在搜索栏中,然后查看结果区域上方的标签。你会看到 Graph 标签,通常位于用于显示简单文本结果的 Table 标签旁边。

点击 Graph 标签。你将看到一条表示内存使用情况随时间变化的折线。

  • X 轴:时间
  • Y 轴:已使用百分比

如果看到一条直线,说明内存使用情况比较稳定。如果你运行了占用资源较多的程序,就会看到一个峰值!

最后检查一次:

由于你现在只是查看图表,我们再确认服务器仍在后台运行:

ps aux | grep prometheus

总结

在本实验中,你学习了如何使用 PromQL 向 Librarian 提出问题。

你学习了:

  1. 简单事实:node_memory_MemFree_bytes
  2. 速率(速度):rate(... [1m])
  3. 数学计算:(Total - Free) / Total * 100
  4. 绘图:使用 Graph 标签。

现在你已经能够查看数据,下一步就是在出现问题时让 Prometheus 主动提醒你。这称为 告警(Alerting)。