PromQL类型 字符串 操作符(二)

2. 匹配模式

向量与向量之间进行运算操作时会基于默认的匹配规则:依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。

接下来将介绍在 PromQL 中有两种典型的匹配模式:一对一(one-to-one),多对一(many-to-one)或一对多(one-to-many)。

2.1. 一对一匹配

一对一匹配模式会从操作符两边表达式获取的瞬时向量依次比较并找到唯一匹配(标签完全一致)的样本值。默认情况下,使用表达式:

vector1 <operator> vector2

在操作符两边表达式标签不一致的情况下,可以使用 on(label list) 或者 ignoring(label list)来修改便签的匹配行为。使用 ignoreing 可以在匹配时忽略某些便签。而 on 则用于将匹配行为限定在某些便签之内。

<vector expr> <bin-op> ignoring(<label list>) <vector expr> <vector expr> <bin-op> on(<label list>) <vector expr>

例如当存在样本:

method_code:http_errors:rate5m{method="get", code="500"} 24 method_code:http_errors:rate5m{method="get", code="404"} 30 method_code:http_errors:rate5m{method="put", code="501"} 3 method_code:http_errors:rate5m{method="post", code="500"} 6 method_code:http_errors:rate5m{method="post", code="404"} 21 method:http_requests:rate5m{method="get"} 600 method:http_requests:rate5m{method="del"} 34 method:http_requests:rate5m{method="post"} 120

使用 PromQL 表达式:

method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m

该表达式会返回在过去 5 分钟内,HTTP 请求状态码为 500 的在所有请求中的比例。如果没有使用 ignoring(code),操作符两边表达式返回的瞬时向量中将找不到任何一个标签完全相同的匹配项。

因此结果如下:

{method="get"} 0.04 // 24 / 600 {method="post"} 0.05 // 6 / 120

同时由于 method 为 put 和 del 的样本找不到匹配项,因此不会出现在结果当中。

2.2. 多对一和一对多

多对一和一对多两种匹配模式指的是“一”侧的每一个向量元素可以与"多"侧的多个元素匹配的情况。在这种情况下,必须使用 group 修饰符:group_left 或者 group_right 来确定哪一个向量具有更高的基数(充当“多”的角色)。

<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr> <vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr> <vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr> <vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>

多对一和一对多两种模式一定是出现在操作符两侧表达式返回的向量标签不一致的情况。因此需要使用 ignoring 和 on 修饰符来排除或者限定匹配的标签列表。

例如,使用表达式:

method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m

该表达式中,左向量 method_code:http_errors:rate5m 包含两个标签 method 和 code。而右向量 method:http_requests:rate5m 中只包含一个标签 method,因此匹配时需要使用 ignoring 限定匹配的标签为 code。 在限定匹配标签后,右向量中的元素可能匹配到多个左向量中的元素 因此该表达式的匹配模式为多对一,需要使用 group 修饰符 group_left 指定左向量具有更好的基数。

最终的运算结果如下:

{method="get", code="500"} 0.04 // 24 / 600 {method="get", code="404"} 0.05 // 30 / 600 {method="post", code="500"} 0.05 // 6 / 120 {method="post", code="404"} 0.175 // 21 / 120

提醒:group 修饰符只能在比较和数学运算符中使用。在逻辑运算 and,unless 和 or 操作中默认与右向量中的所有元素进行匹配。

3. 聚合操作

Prometheus 还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个具有较少样本值的新的时间序列。

  • sum (求和)
  • min (最小值)
  • max (最大值)
  • avg (平均值)
  • stddev (标准差)
  • stdvar (标准差异)
  • count (计数)
  • count_values (对 value 进行计数)
  • bottomk (样本值最小的 k 个元素)
  • topk (样本值最大的k个元素)
  • quantile (分布统计)

这些操作符被用于聚合所有标签维度,或者通过 without 或者 by 子语句来保留不同的维度。

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

其中只有 count_values, quantile, topk, bottomk 支持参数(parameter)。

without 用于从计算结果中移除列举的标签,而保留其它标签。by 则正好相反,结果向量中只保留列出的标签,其余标签则移除。通过 without 和 by 可以按照样本的问题对数据进行聚合。

例如:

如果指标 http_requests_total 的时间序列的标签集为 application, instance, 和 group,我们可以通过以下方式计算所有 instance 中每个 application 和 group 的请求总量:

sum(http_requests_total) without (instance)

等价于

sum(http_requests_total) by (application, group)

如果只需要计算整个应用的 HTTP 请求总量,可以直接使用表达式:

sum(http_requests_total)

count_values 用于时间序列中每一个样本值出现的次数。count_values 会为每一个唯一的样本值输出一个时间序列,并且每一个时间序列包含一个额外的标签。这个标签的名字由聚合参数指定,同时这个标签值是唯一的样本值。

例如要计算运行每个构建版本的二进制文件的数量:

count_values("version", build_version)

返回结果如下:

{count="641"} 1 {count="3226"} 2 {count="644"} 4

topk 和 bottomk 则用于对样本值进行排序,返回当前样本值前 n 位,或者后 n 位的时间序列。

获取 HTTP 请求数前 5 位的时序样本数据,可以使用表达式:

topk(5, http_requests_total)

quantile 用于计算当前样本数据值的分布情况 quantile(φ, express) ,其中 0 ≤ φ ≤ 1。

例如,当 φ 为 0.5 时,即表示找到当前样本数据中的中位数:

quantile(0.5, http_requests_total)

返回结果如下:

{} 656

<think>好的,用户想要了解PromQL查询语句的用法、示例和教程。首先,我需要整理PromQL的基础知识,确保覆盖核心概念,比如时间序列选择器、数据类型操作符。然后,根据用户提供的引用内容,需要引用相关部分来支持说明,比如引用[1]提到PromQL用于处理时间序列数据,引用[2]和[3]强调其丰富的功能和实际应用。 接下来,用户可能需要具体的例子,所以准备几个常见的查询示例,比如CPU使用率、请求错误率等,并解释每个部分的作用。同时,要注意语法正确性,比如使用$...$或$$...$$格式,但根据用户的要求,这里可能不需要数学表达式,不过还是需要检查是否有需要的地方。 用户可能还关心如何验证查询的正确性,这时候引用[4]提到的验证方法就派上用场了,可以说明如何通过返回值判断查询是否正确。另外,关于性能优化,引用[5]提到基数管理,需要解释如何减少基数来优化查询性能。 还需要考虑用户的实际应用场景,比如监控、告警或数据分析,结合引用中的信息,说明PromQL在这些场景中的具体应用。最后,生成相关问题,帮助用户进一步学习,比如语法结构、错误排查或性能优化方法。 需要确保回答结构清晰,分步骤讲解,每个部分都引用合适的来源。同时,语言要简洁明了,避免使用过于专业的术语,让新手也能理解。最后检查所有引用是否准确,示例是否正确,以及是否符合用户的中文回答要求。</think>### PromQL 查询语句详解 PromQLPrometheus Query Language)是专为 Prometheus 设计的时间序列数据查询语言,支持实时聚合、筛选和转换监控指标。以下是其核心用法与示例: --- #### 一、基本语法与数据类型 1. **时间序列选择器** - 即时向量选择器:筛选指定时间点的数据 ```promql node_cpu_seconds_total{mode="idle"} # 查询所有CPU的空闲时间[^1] ``` - 范围向量选择器:获取时间段内的数据 ```promql http_requests_total[5m] # 过去5分钟的HTTP请求总量 ``` 2. **数据类型** - 即时向量(Instant Vector):单时间点数据 - 范围向量(Range Vector):时间段内数据 - 标量(Scalar):单一数值 - 字符串(String):文本类型(较少使用) --- #### 、常用操作符与函数 1. **聚合操作** ```promql sum(rate(http_requests_total{status=~"5.."}[5m])) by (service) # 按服务聚合5xx错误率[^3] ``` - `sum`/`avg`/`max`:聚合函数 - `by`/`without`:分组或排除标签 2. **数学运算** ```promql (node_memory_MemFree_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100 # 计算内存使用率 ``` 3. **函数应用** - `rate()`:计算时间序列的增长率 ```promql rate(node_network_receive_bytes_total[2m]) # 网络接收速率[^2] ``` - `irate()`:瞬时增长率(适用于快速变化的指标) --- #### 三、实际应用场景示例 1. **监控CPU使用率** ```promql 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) ``` - 结果:各实例的CPU平均利用率 2. **请求错误率告警** ```promql sum(rate(http_requests_total{status_code="500"}[10m])) / sum(rate(http_requests_total[10m])) > 0.05 ``` - 触发条件:5分钟内错误率超过5%[^3] 3. **磁盘空间预测** ```promql predict_linear(node_filesystem_free_bytes{device="/dev/sda1"}[6h], 3600*24) < 0 ``` - 预测24小时后磁盘是否耗尽 --- #### 四、调试与验证技巧 1. **表达式验证** 使用 `vector(1)` 测试查询是否返回数据: ```promql http_requests_total{job="api"} # 若无数据,可能标签不匹配或数据未采集[^4] ``` 2. **基数控制** 避免高基数标签(如`user_id`),优化查询性能: ```promql sum(rate(api_calls_total[5m])) by (endpoint) # 按接口聚合代替全量标签[^5] ``` --- §§ 1. 如何用PromQL实现多指标联合计算? 2. PromQL查询返回空数据时如何排查? 3. 如何处理高基数时间序列导致的性能问题? 4. PromQL中`histogram_quantile`函数的原理是什么? 5. 如何通过PromQL实现SLO(服务等级目标)监控? --- 参考文献: [^1]: PromQL核心概念与语法结构 [^2]: 时间序列筛选与聚合操作示例 : 告警规则与数据转换实践 [^4]: 查询调试与错误排查方法 : 基数优化与查询性能提升
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值