介绍
欢迎来到本关于 PromQL 基础的实操实验。Prometheus 是一个强大的开源监控和告警工具集,而其查询语言 PromQL 是其核心力量。PromQL 允许你实时选择和聚合时间序列数据。
在本实验中,你将使用一个预先配置好的环境,该环境包含一个 Prometheus 服务器,它正在积极地从 Node Exporter 收集指标。你的目标是学习 PromQL 的基本语法来查询这些数据,从简单的指标选择开始,逐步过渡到使用函数和过滤器进行更高级的查询。
欢迎来到本关于 PromQL 基础的实操实验。Prometheus 是一个强大的开源监控和告警工具集,而其查询语言 PromQL 是其核心力量。PromQL 允许你实时选择和聚合时间序列数据。
在本实验中,你将使用一个预先配置好的环境,该环境包含一个 Prometheus 服务器,它正在积极地从 Node Exporter 收集指标。你的目标是学习 PromQL 的基本语法来查询这些数据,从简单的指标选择开始,逐步过渡到使用函数和过滤器进行更高级的查询。
在此步骤中,你将熟悉实验环境。设置过程已经为你启动了两个 Docker 容器。你无需执行任何设置。
这两个容器是:
node-exporter: 此容器的目的是公开其运行所在主机的大量硬件和内核相关指标。prometheus: 这是 Prometheus 服务器本身。它被配置为从 node-exporter "抓取" (收集) 指标,并将其存储在其时间序列数据库中。你可以通过在终端执行 docker ps 命令来验证两个容器是否正在运行。
docker ps
你应该会看到类似以下的输出,列出了 prometheus 和 node-exporter 两个容器,状态均为 "Up"。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
486db39ca176 prom/prometheus "/bin/prometheus --c…" 9 seconds ago Up 8 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
3f02110c8fde prom/node-exporter "/bin/node_exporter" 11 seconds ago Up 8 seconds 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp node-exporter
这证实了你的监控堆栈已准备就绪。在下一步中,你将访问 Prometheus 用户界面以开始查询这些指标。
在此步骤中,你将访问 Prometheus Web UI 并找到表达式浏览器 (Expression Browser),这是运行 PromQL 查询的主要工具。
Prometheus 容器的 Web 服务器运行在端口 9090 上,实验环境会自动为你提供访问权限。
+ 按钮,然后选择 Web Service。9090,然后打开出现的新标签页。此操作会在你的实验环境中打开一个单独的标签页,显示 Prometheus UI。默认情况下,你将进入 Graph 页面。在此页面上,你将看到一个标有 Expression 的文本输入字段。这就是表达式浏览器,你将在其中输入并执行本实验的所有 PromQL 查询。

现在你已经知道在哪里执行查询了,可以开始编写你的第一个查询了。
在此步骤中,你将执行你的第一个基本 PromQL 查询来选择一个指标。PromQL 中最简单的查询就是指标的名称。这将选择所有具有此指标名称的时间序列。
导航到你在上一步中打开的 Prometheus UI 中的表达式浏览器。
node_cpu_seconds_total
执行后,查看图表下方 Table 视图中的结果。你将看到一个时间序列列表。
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node", mode="idle"} 3456.78
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node", mode="iowait"} 12.34
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node", mode="system"} 56.78
...
让我们来分析一下这个结果:
node_cpu_seconds_total: 这是指标名称。它代表一个 counter,用于跟踪 CPU 在各种模式下花费的总秒数。{cpu="0", mode="idle", ...}: 这些是标签 (labels)。标签是键值对,用于唯一标识一个时间序列。在这里,你可以看到每个 CPU 核心 (cpu="0") 和每种模式 (mode="idle", mode="system" 等) 的不同序列。3456.78: 这是为该特定时间序列记录的最新值。由于它是一个计数器 (counter),这个值只会随着时间推移而增加。注意: 如果你没有看到 latest value,请点击页面右下角的 Labby 对话框并暂时关闭它。
你已成功地使用 Prometheus 查询了特定指标的所有时间序列。
在此步骤中,你将使用标签过滤器和 rate() 函数来优化你的查询,以获取更有意义的数据。计数器 (counter) 的原始值通常没有太大用处;我们通常更关心它的变化率。
首先,让我们过滤结果,只查看在 idle 模式下花费的 CPU 时间。你可以通过在查询中添加花括号 {} 中的标签选择器 (label selector) 来实现这一点。
node_cpu_seconds_total{mode="idle"}
此查询现在只返回 mode 标签精确匹配 idle 的时间序列。
接下来,让我们计算此计数器的每秒变化率。为此,我们使用 rate() 函数。rate() 函数需要知道在哪个时间段内计算速率。我们使用 范围向量选择器 (range vector selector) 来指定,例如 [5m] 表示最近 5 分钟。
rate() 函数中,并添加一个 5 分钟的范围选择器。执行最终查询:rate(node_cpu_seconds_total{mode="idle"}[5m])
让我们来分析一下这个高级查询:
node_cpu_seconds_total{mode="idle"}: 这是 即时向量选择器 (instant vector selector),用于过滤我们想要的指标和标签。[5m]: 这是 范围选择器 (range selector),它告诉 Prometheus 获取所选时间序列在最近 5 分钟内的所有数据点。rate(...): 这是该函数,它接收 5 分钟的数据范围,并计算计数器增加的每秒平均速率。结果不再是一个大的计数器值,而是一个通常在 0 到 1 之间(对于单个 CPU 核心)的值。0.95 的值意味着在过去的 5 分钟内,CPU 平均有 95% 的时间处于空闲状态。这是监控中更有用的信息。
恭喜你完成了这个关于 PromQL 基础知识的实验!你已成功查询了一个实时 Prometheus 实例,并将原始数据转换为了有意义的信息。
在这个实验中,你学会了如何:
{...}) 过滤时间序列。rate() 函数和范围向量选择器 ([5m]) 计算计数器的变化率。这些是使用 Prometheus 的基本构建块。从这里开始,你可以探索 PromQL 提供的许多其他函数和运算符,以构建强大且富有洞察力的监控仪表板和警报。