03.6、PromQL查询语言基础
PromQL 查询语言基础
本节将学习:PromQL 基本查询语法、聚合操作符、时间范围查询,以及常用函数的使用。这些是使用 Prometheus 的核心技能。
什么是 PromQL
PromQL 是什么? PromQL(Prometheus Query Language)是 Prometheus 的查询语言。
PromQL 有什么用途呢?
- 查询时间序列数据。 可以用 PromQL 查询时间序列数据。例如查询 CPU 使用率、内存使用量。
- 聚合和分析数据。 可以用 PromQL 聚合和分析数据。例如计算平均值、求和、最大值。
- 创建告警规则。 可以用 PromQL 创建告警规则。例如当 CPU 使用率超过 80% 时告警。
- 构建 Dashboard。 可以用 PromQL 构建 Dashboard。例如在 Grafana 中使用 PromQL 查询数据。
PromQL 有什么特点呢?
第一个特点:功能强大。 支持复杂的查询和聚合,支持数学运算和函数。
第二个特点:易于使用。 语法简洁直观,支持标签过滤。
第三个特点:灵活高效。 支持实时查询,支持范围查询。
这就是 PromQL。它是 Prometheus 的核心功能之一。
PromQL 基本查询语法
PromQL 基本查询有哪些方式呢?
第一种方式:查询指标名称。 直接输入指标名称,例如
http_requests_total第二种方式:使用标签过滤。 使用花括号
{}http_requests_total{method="GET"}第三种方式:多标签过滤。 使用多个标签来过滤,例如
http_requests_total{method="GET", status="200"}第四种方式:标签匹配操作符。 使用不同的匹配操作符:
- :完全匹配,例如
={method="GET"} - :不等于,例如
!={method!="GET"} - :正则匹配,例如
=~,匹配所有以 2 开头的三位数{status=~"2.."} - :正则不匹配,例如
!~,不匹配所有以 2 开头的三位数{status!~"2.."}
查询示例:
- 查询所有 HTTP 请求:
http_requests_total - 查询 GET 请求:
http_requests_total{method="GET"} - 查询状态码为 200 的请求:
http_requests_total{status="200"} - 查询 GET 且状态码为 200 的请求:
http_requests_total{method="GET", status="200"} - 查询所有成功状态码(2xx):。这里使用正则匹配,匹配所有以 2 开头的三位数。
http_requests_total{status=~"2.."} - 查询所有错误状态码(非 2xx):。这里使用正则不匹配,不匹配所有以 2 开头的三位数。
http_requests_total{status!~"2.."}
这就是 PromQL 基本查询语法。
PromQL 聚合操作符
PromQL 支持哪些聚合操作符呢?
- :求和。计算所有值的总和。
sum() - :平均值。计算所有值的平均值。
avg() - :最小值。找出所有值中的最小值。
min() - :最大值。找出所有值中的最大值。
max() - :计数。计算时间序列的数量。
count() - :标准差。计算所有值的标准差。
stddev() - :方差。计算所有值的方差。
stdvar()
聚合示例:
- 计算总请求数:。这会计算所有 HTTP 请求的总数。
sum(http_requests_total) - 按 method 分组求和:。这会按 method 标签分组,计算每组的总请求数。
sum(http_requests_total) by (method) - 计算平均请求延迟:。这会计算所有请求的平均延迟。
avg(http_request_duration_seconds) - 计算最大请求延迟:。这会找出所有请求中的最大延迟。
max(http_request_duration_seconds) - 计算请求数(按状态码分组):。这会按 status 标签分组,计算每组的请求数。
count(http_requests_total) by (status)
聚合语法:
<聚合函数>(<指标>) [by|without] (<标签列表>)
- :按指定标签分组。例如
by,按 method 分组。sum(...) by (method) - :排除指定标签后分组。例如
without,排除 instance 标签后分组。sum(...) without (instance)
这就是 PromQL 聚合操作符。
PromQL 时间范围查询
PromQL 支持哪些时间范围选择器呢?
- :最近 5 分钟
[5m] - :最近 1 小时
[1h] - :最近 1 天
[1d] - :最近 1 周
[1w]
范围查询示例:
- 查询最近 5 分钟的请求数:。这会返回最近 5 分钟内的所有数据点。
http_requests_total[5m] - 计算最近 1 小时的请求速率:。这会计算最近 1 小时内的每秒请求速率。
rate(http_requests_total[1h]) - 计算最近 5 分钟的平均速率:。这会计算最近 5 分钟内的平均值。
avg_over_time(http_requests_total[5m]) - 计算最近 1 小时的最大值:。这会找出最近 1 小时内的最大值。
max_over_time(http_requests_total[1h])
速率计算函数:
- :每秒速率(适用于 Counter)。例如
rate(),计算每秒请求速率。rate(http_requests_total[1h]) - :瞬时速率(适用于 Counter)。例如
irate(),计算瞬时请求速率。irate(http_requests_total[5m]) - :增量(适用于 Counter)。例如
increase(),计算最近 1 小时的增量。increase(http_requests_total[1h])
rate() vs irate():
- 计算平均速率。更平滑,适用于长期趋势分析。
rate() - 计算瞬时速率。更敏感,适用于短期波动分析。
irate()
这就是 PromQL 时间范围查询。
PromQL 常用函数
PromQL 支持哪些函数呢?
第一个是数学函数。
- :绝对值。例如
abs(),计算 CPU 使用率与 50% 的差的绝对值。abs(cpu_usage_percent - 50) - :四舍五入。例如
round(),将 CPU 使用率四舍五入到小数点后两位。round(cpu_usage_percent * 100, 2) - :向上取整。例如
ceil(),将 CPU 使用率向上取整。ceil(cpu_usage_percent * 100) - :向下取整。例如
floor(),将 CPU 使用率向下取整。floor(cpu_usage_percent * 100)
第二个是时间函数。
- :当前时间戳。返回当前 Unix 时间戳。
time() - :小时。返回时间的小时部分。
hour() - :分钟。返回时间的分钟部分。
minute()
第三个是标签函数。
- :替换标签。例如
label_replace(),将 environment 标签替换为 env 标签。label_replace(http_requests_total, "env", "$1", "environment", "(.*)") - :连接标签。例如
label_join(),将 service 和 instance 标签连接为 full_name 标签。label_join(http_requests_total, "full_name", "-", "service", "instance")
函数示例:
- 计算 CPU 使用率百分比:。将小数转换为百分比。
cpu_usage_percent * 100 - 四舍五入:。四舍五入到小数点后两位。
round(cpu_usage_percent * 100, 2) - 向上取整:。向上取整。
ceil(cpu_usage_percent * 100) - 向下取整:。向下取整。
floor(cpu_usage_percent * 100) - 替换标签:。替换标签名称。
label_replace(http_requests_total, "env", "$1", "environment", "(.*)")
这就是 PromQL 常用函数。
PromQL 实际查询示例
示例 1:计算 QPS(每秒请求数)
sum(rate(http_requests_total[5m])) by (method)
这个查询计算每秒请求数,按 method 分组。使用
rate()sum()by (method)示例 2:计算错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
这个查询计算错误率。分子是所有 5xx 错误的速率,分母是所有请求的速率,然后乘以 100 转换为百分比。
示例 3:计算 P95 延迟
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
这个查询计算 P95 延迟。使用
histogram_quantile()示例 4:计算 CPU 使用率
100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
这个查询计算 CPU 使用率。CPU 使用率 = 100 - 空闲率。使用
rate()avg()这就是 PromQL 实际查询示例。
本节小结
在本节中,我们学习了 PromQL 查询语言基础:
第一个是基本查询。 指标名称、标签过滤、匹配操作符。这些是 PromQL 的基础。
第二个是聚合操作符。 sum、avg、min、max、count 等。这些是分析数据的重要工具。
第三个是时间范围查询。 范围选择器、速率计算函数。这些是分析趋势的重要工具。
第四个是常用函数。 数学函数、时间函数、标签函数。这些是处理数据的重要工具。
PromQL 查询结构: PromQL 查询由基本查询、聚合操作、时间范围、函数组成。这些可以组合使用,构建复杂的查询。
这就是 PromQL 查询语言基础。掌握这些基础知识,是使用 Prometheus 的关键。
在下一节,我们将学习 PromQL 高级查询。学习更复杂的查询技巧,例如多指标关联、子查询、标签操作等。