03.6PromQL查询语言基础

分类: Prometheus安装与配置

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"}
。这会返回所有 method 为 GET 的指标。

第三种方式:多标签过滤。 使用多个标签来过滤,例如

http_requests_total{method="GET", status="200"}
。这会返回所有 method 为 GET 且 status 为 200 的指标。

第四种方式:标签匹配操作符。 使用不同的匹配操作符:

  • =
    :完全匹配,例如
    {method="GET"}
  • !=
    :不等于,例如
    {method!="GET"}
  • =~
    :正则匹配,例如
    {status=~"2.."}
    ,匹配所有以 2 开头的三位数
  • !~
    :正则不匹配,例如
    {status!~"2.."}
    ,不匹配所有以 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):
    http_requests_total{status=~"2.."}
    。这里使用正则匹配,匹配所有以 2 开头的三位数。
  • 查询所有错误状态码(非 2xx):
    http_requests_total{status!~"2.."}
    。这里使用正则不匹配,不匹配所有以 2 开头的三位数。

这就是 PromQL 基本查询语法。

PromQL 聚合操作符

PromQL 支持哪些聚合操作符呢?

  • sum()
    :求和。计算所有值的总和。
  • avg()
    :平均值。计算所有值的平均值。
  • min()
    :最小值。找出所有值中的最小值。
  • max()
    :最大值。找出所有值中的最大值。
  • count()
    :计数。计算时间序列的数量。
  • stddev()
    :标准差。计算所有值的标准差。
  • stdvar()
    :方差。计算所有值的方差。

聚合示例:

  • 计算总请求数:
    sum(http_requests_total)
    。这会计算所有 HTTP 请求的总数。
  • 按 method 分组求和:
    sum(http_requests_total) by (method)
    。这会按 method 标签分组,计算每组的总请求数。
  • 计算平均请求延迟:
    avg(http_request_duration_seconds)
    。这会计算所有请求的平均延迟。
  • 计算最大请求延迟:
    max(http_request_duration_seconds)
    。这会找出所有请求中的最大延迟。
  • 计算请求数(按状态码分组):
    count(http_requests_total) by (status)
    。这会按 status 标签分组,计算每组的请求数。

聚合语法:

<聚合函数>(<指标>) [by|without] (<标签列表>)
  • by
    :按指定标签分组。例如
    sum(...) by (method)
    ,按 method 分组。
  • without
    :排除指定标签后分组。例如
    sum(...) without (instance)
    ,排除 instance 标签后分组。

这就是 PromQL 聚合操作符。

PromQL 时间范围查询

PromQL 支持哪些时间范围选择器呢?

  • [5m]
    :最近 5 分钟
  • [1h]
    :最近 1 小时
  • [1d]
    :最近 1 天
  • [1w]
    :最近 1 周

范围查询示例:

  • 查询最近 5 分钟的请求数:
    http_requests_total[5m]
    。这会返回最近 5 分钟内的所有数据点。
  • 计算最近 1 小时的请求速率:
    rate(http_requests_total[1h])
    。这会计算最近 1 小时内的每秒请求速率。
  • 计算最近 5 分钟的平均速率:
    avg_over_time(http_requests_total[5m])
    。这会计算最近 5 分钟内的平均值。
  • 计算最近 1 小时的最大值:
    max_over_time(http_requests_total[1h])
    。这会找出最近 1 小时内的最大值。

速率计算函数:

  • rate()
    :每秒速率(适用于 Counter)。例如
    rate(http_requests_total[1h])
    ,计算每秒请求速率。
  • irate()
    :瞬时速率(适用于 Counter)。例如
    irate(http_requests_total[5m])
    ,计算瞬时请求速率。
  • increase()
    :增量(适用于 Counter)。例如
    increase(http_requests_total[1h])
    ,计算最近 1 小时的增量。

rate() vs irate():

  • rate()
    计算平均速率。更平滑,适用于长期趋势分析。
  • irate()
    计算瞬时速率。更敏感,适用于短期波动分析。

这就是 PromQL 时间范围查询。

PromQL 常用函数

PromQL 支持哪些函数呢?

第一个是数学函数。

  • abs()
    :绝对值。例如
    abs(cpu_usage_percent - 50)
    ,计算 CPU 使用率与 50% 的差的绝对值。
  • round()
    :四舍五入。例如
    round(cpu_usage_percent * 100, 2)
    ,将 CPU 使用率四舍五入到小数点后两位。
  • ceil()
    :向上取整。例如
    ceil(cpu_usage_percent * 100)
    ,将 CPU 使用率向上取整。
  • floor()
    :向下取整。例如
    floor(cpu_usage_percent * 100)
    ,将 CPU 使用率向下取整。

第二个是时间函数。

  • time()
    :当前时间戳。返回当前 Unix 时间戳。
  • hour()
    :小时。返回时间的小时部分。
  • minute()
    :分钟。返回时间的分钟部分。

第三个是标签函数。

  • label_replace()
    :替换标签。例如
    label_replace(http_requests_total, "env", "$1", "environment", "(.*)")
    ,将 environment 标签替换为 env 标签。
  • label_join()
    :连接标签。例如
    label_join(http_requests_total, "full_name", "-", "service", "instance")
    ,将 service 和 instance 标签连接为 full_name 标签。

函数示例:

  • 计算 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)
按 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()
函数,0.95 表示 95 分位数。

示例 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 高级查询。学习更复杂的查询技巧,例如多指标关联、子查询、标签操作等。