Prometheus的PromQL纪要

Posted gavin11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prometheus的PromQL纪要相关的知识,希望对你有一定的参考价值。

1、字符串

字符串可以用单引号、双引号或反引号指定为文字常量。

2、标量

标量浮点值可以字面上写成 [-](digits)[.(digits)] 的形式。

3、时间序列过滤器

  • 瞬间向量过滤器   瞬时向量过滤器允许在指定的时间戳内选择一组时间序列和每个时间序列的单个样本值。在最简单的形式中,近指定指标(metric)名称。这将生成包含此指标名称的所有时间序列的元素的瞬时向量。

     PromQL支持两种匹配模式:完全匹配和正则匹配

     标签匹配运算符:

  • =:选择与提供的字符串完全相同的标签
  •             !=:选择与提供的字符串不相同的标签
  •              =~:选择正则表达式与提供的字符串(或子字符串)相匹配的标签

  •            !~:选择正则表达式与提供的字符串(或子字符串)不匹配的标签

  • 区间向量过滤器  区间向量与瞬时向量的工作方式类似,唯一的差异在于在区间向量表达式中我们需要定义时间选择的范围,时间范围通过时间范围选择器 [] 进行定义,以指定应为每个返回的区间向量样本值中提取多长的时间范围。

      时间范围通过数字来表示,单位可以使用以下其中之一的时间单位:

  • s - 秒

  • m - 分钟

  • h - 小时

  • d - 天

  • w - 周

  • y - 年

时间位移操作   在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准。而如果我们想查询,5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? 这个时候我们就可以使用位移操作,位移操作的关键字为 offset

http_requests_total offset 5m    #返回相对于当前查询时间过去 5 分钟的 http_requests_total 值
rate(http_requests_total[5m] offset 1w)   #该操作同样适用于区间向量。以下表达式返回指标 http_requests_total 一周前的 5 分钟之内的 HTTP 请求量的增长率:

 

操作符

  • 算术运算
    • + 加法

    • - 减法

    • * 乘法

    • / 除法

    • %

    • ^ 幂等

  • 布尔运算
    • == (相等)

    • != (不相等)

    • > (大于)

    • < (小于)

    • >= (大于等于)

    • <= (小于等于)

  • 集合运算
    • and (并且)
    • or (或者)
    • unless (排除)
 

 

匹配模式

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

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

  • 一对一匹配

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

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>
  • 多对一和一对多

多对一和一对多两种匹配模式指的是“一”侧的每一个向量元素可以与"多"侧的多个元素匹配的情况。在这种情况下,必须使用 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 修饰符来排除或者限定匹配的标签列表。

 

聚合操作

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

  • sum (求和)

  • min (最小值)

  • max (最大值)

  • avg (平均值)

  • stddev (标准差)

  • stdvar (标准差异)

  • count (计数)

  • count_values (对 value 进行计数)

  • bottomk (样本值最小的 k 个元素)

  • topk (样本值最大的k个元素)

  • quantile (分布统计)

这些操作符被用于聚合所有标签维度,或者通过 without 或者 by 子语句来保留不同的维度(without 不包含的标签,by与whithou相反)

 

以上是关于Prometheus的PromQL纪要的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus/PromQL 减去两个量规指标

PromQL/prometheus 查询 label_replace() 多个

Prometheus:PromQL 减法,相同的标签,不同的值

在 Prometheus/PromQL 中合并/加入两个指标

PromQL

Prometheus 查询 promql 以在同一字段上进行平均