PromQL 基础

DockerBeginner
立即练习

介绍

欢迎来到本关于 PromQL 基础的实操实验。Prometheus 是一个强大的开源监控和告警工具集,而其查询语言 PromQL 是其核心力量。PromQL 允许你实时选择和聚合时间序列数据。

在本实验中,你将使用一个预先配置好的环境,该环境包含一个 Prometheus 服务器,它正在积极地从 Node Exporter 收集指标。你的目标是学习 PromQL 的基本语法来查询这些数据,从简单的指标选择开始,逐步过渡到使用函数和过滤器进行更高级的查询。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

理解提供的环境

在此步骤中,你将熟悉实验环境。设置过程已经为你启动了两个 Docker 容器。你无需执行任何设置。

这两个容器是:

  • node-exporter: 此容器的目的是公开其运行所在主机的大量硬件和内核相关指标。
  • prometheus: 这是 Prometheus 服务器本身。它被配置为从 node-exporter "抓取" (收集) 指标,并将其存储在其时间序列数据库中。

你可以通过在终端执行 docker ps 命令来验证两个容器是否正在运行。

docker ps

你应该会看到类似以下的输出,列出了 prometheusnode-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 UI 中的表达式浏览器

在此步骤中,你将访问 Prometheus Web UI 并找到表达式浏览器 (Expression Browser),这是运行 PromQL 查询的主要工具。

Prometheus 容器的 Web 服务器运行在端口 9090 上,实验环境会自动为你提供访问权限。

  1. 点击 LabEx 界面中的 + 按钮,然后选择 Web Service
  2. 为端口输入 9090,然后打开出现的新标签页。

此操作会在你的实验环境中打开一个单独的标签页,显示 Prometheus UI。默认情况下,你将进入 Graph 页面。在此页面上,你将看到一个标有 Expression 的文本输入字段。这就是表达式浏览器,你将在其中输入并执行本实验的所有 PromQL 查询。

Prometheus Expression Browser

现在你已经知道在哪里执行查询了,可以开始编写你的第一个查询了。

执行基础查询,例如 node_cpu_seconds_total

在此步骤中,你将执行你的第一个基本 PromQL 查询来选择一个指标。PromQL 中最简单的查询就是指标的名称。这将选择所有具有此指标名称的时间序列。

导航到你在上一步中打开的 Prometheus UI 中的表达式浏览器。

  1. Expression 输入字段中,键入以下指标名称:
node_cpu_seconds_total
  1. 点击 Execute 按钮。

执行后,查看图表下方 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 函数和标签过滤器

在此步骤中,你将使用标签过滤器和 rate() 函数来优化你的查询,以获取更有意义的数据。计数器 (counter) 的原始值通常没有太大用处;我们通常更关心它的变化率。

首先,让我们过滤结果,只查看在 idle 模式下花费的 CPU 时间。你可以通过在查询中添加花括号 {} 中的标签选择器 (label selector) 来实现这一点。

  1. 在表达式浏览器中输入以下查询并执行:
node_cpu_seconds_total{mode="idle"}

此查询现在只返回 mode 标签精确匹配 idle 的时间序列。

接下来,让我们计算此计数器的每秒变化率。为此,我们使用 rate() 函数。rate() 函数需要知道在哪个时间段内计算速率。我们使用 范围向量选择器 (range vector selector) 来指定,例如 [5m] 表示最近 5 分钟。

  1. 现在,修改你的查询,将其包装在 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 实例,并将原始数据转换为了有意义的信息。

在这个实验中,你学会了如何:

  • 导航到 Prometheus UI 中的表达式浏览器。
  • 执行基本查询来选择一个指标的所有时间序列。
  • 理解时间序列的结构,包括其指标名称和唯一的标签集。
  • 使用标签选择器 ({...}) 过滤时间序列。
  • 使用 rate() 函数和范围向量选择器 ([5m]) 计算计数器的变化率。

这些是使用 Prometheus 的基本构建块。从这里开始,你可以探索 PromQL 提供的许多其他函数和运算符,以构建强大且富有洞察力的监控仪表板和警报。