Basics

即时矢量选择器

=:匹配与标签相等的内容
!=:不匹配与标签相等的内容
=~: 根据正则表达式匹配与标签符合的内容
!~:根据正则表达式不匹配与标签符合的内容

示例:

http_requests_total{environment=~"staging|testing|development",method!="GET"} #这将匹配method不等于GET,environment匹配到staging,testing或development的http_requests_total请求内容。

向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。以下表达式是非法的
{job=~".*"} # Bad!
相反,这些表达式是有效的,因为它们都有一个与空标签值不匹配的选择器。
{job=~".+"} # Good!
{job=~".*",method="get"} # Good!

范围矢量选择器

持续时间仅限于数字,接下来是以下单位之一:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
在此示例中,我们选择在过去5分钟内为度量标准名称为http_requests_total且标签设置为job=prometheus的所有时间序列记录的所有值:
http_requests_total{job="prometheus"}[5m]

偏移量修改器

偏移修改器允许更改查询中各个即时和范围向量的时间偏移。
例如,以下表达式相对于当前查询5分钟前的http_requests_total值:
http_requests_total offset 5m
注意,偏移修改器需要立即跟随选择器,即以下内容是正确的:
sum(http_requests_total{method="GET"} offset 5m) // GOOD.
以下内容是不正确的:
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
同样适用于范围向量。这将返回http_requests_total一周前的5分钟增长率:
rate(http_requests_total[5m] offset 1w)

OPERATORS

二元运算符

算术二元运算符

Prometheus中存在以下二进制算术运算符:
+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (modulo)
^ (power/exponentiation)

比较二元运算符

== (equal)
!= (not-equal)
> (greater-than)
< (less-than)
>= (greater-or-equal)
<= (less-or-equal)

逻辑/集二进制运算符

and (intersection)
or (union)
unless (complement)

一对一矢量匹配

一对一从操作的每一侧找到唯一的条目对。在默认情况下,这是格式为vector1 <operator> vector2之后的操作。如果两个条目具有完全相同的标签集和相应的值,则它们匹配。 ignore关键字允许在匹配时忽略某些标签,而on关键字允许将所考虑的标签集减少到提供的列表:
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
Example input:

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
Example query:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
这将返回一个结果向量,其中包含每个方法的状态代码为500的HTTP请求部分,在过去5分钟内测量。在不忽略(代码)的情况下,由于度量标准不共享同一组标签,因此不会匹配。方法put和del的条目没有匹配,并且不会显示在结果中:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120

多对一和一对多矢量匹配

多对一和一对多匹配指的是"一"侧的每个向量元素可以与"多"侧的多个元素匹配的情况。必须使用group_left或group_right修饰符明确请求,其中left/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>
Example query:

method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
在这种情况下,左向量每个方法标签值包含多个条目。因此,我们使用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
多对一和一对多匹配是高级用例,应该仔细考虑。通常正确使用忽略(<labels>)可提供所需的结果。

聚合运算符

Prometheus支持以下内置聚合运算符,这些运算符可用于聚合单个即时向量的元素,从而生成具有聚合值的较少元素的新向量:
sum (calculate sum over dimensions) #范围内求和
min (select minimum over dimensions) #范围内求最小值
max (select maximum over dimensions) #范围内求最大值
avg (calculate the average over dimensions) #范围内求最大值
stddev (calculate population standard deviation over dimensions) #计算标准偏差
stdvar (calculate population standard variance over dimensions) #计算标准方差
count (count number of elements in the vector) #计算向量中的元素数量
count_values (count number of elements with the same value) #计算向量中相同元素的数量
bottomk (smallest k elements by sample value)#样本中最小的元素值
topk (largest k elements by sample value)#样本中最大的元素值
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) #计算 0-1 之间的百分比数量的样本的最大值
这些运算符可以用于聚合所有标签维度,也可以通过包含without或by子句来保留不同的维度。
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
parameter仅用于count_values,quantile,topk和bottomk。without从结果向量中删除列出的标签,而所有其他标签都保留输出。 by相反并删除未在by子句中列出的标签,即使它们的标签值在向量的所有元素之间是相同的
例:如果http_requests_total具有按application,instance和group标签列出的时间序列,我们可以通过以下方式计算每个应用程序和组在所有实例上看到的HTTP请求总数:
sum(http_requests_total) without (instance)
等于:

sum(http_requests_total) by (application, group)
如果我们只对我们在所有应用程序中看到的HTTP请求总数感兴趣,我们可以简单地写:
sum(http_requests_total)
要计算运行每个构建版本的二进制文件的数量,我们可以编写:
count_values("version", build_version)
要在所有实例中获取5个最大的HTTP请求计数,我们可以编写:
topk(5, http_requests_total)

FUNCTIONS

abs(v instant-vector) #返回其绝对值
absent() # 如果传递给它的向量具有该元素,则返回空向量;如果传递给它的向量没有元素,则返回传入的元素。

Example query:
nginx_server_connections
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="accepted"} 89061
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="handled"} 2

absent(nginx_server_connections{job="nginx-vts"}) => {}
absent(nginx_server_connections{job="nginx-vts123"}) => {job="nginx-vts123"}

ceil(v instant-vector) #返回向量中所有样本值(向上取整数)
round(v instant-vector, to_nearest=1 scalar) #返回向量中所有样本值的最接近的整数,to_nearest是可选的,默认为1,表示样本返回的是最接近1的整数倍的值, 可以指定任意的值(也可以是小数),表示样本返回的是最接近它的整数倍的值
floor(v instant-vector) #返回向量中所有样本值(向下取整数)
changes(v range-vector) #对于每个输入时间序列,返回其在时间范围内(v range-vector)更改的次数
clamp_max(v instant-vector, max scalar) #限制v中所有元素的样本值,使其上限为max
clamp_min(v instant-vector, min scalar) #限制v中所有元素的样本值,使其下限为min
year(v=vector(time()) instant-vector) #返回UTC中给定时间的年份
day_of_month(v=vector(time()) instant-vector) #返回UTC中给定时间的月中的某一天,返回值为1到31
day_of_week(v=vector(time()) instant-vector) #返回UTC中给定时间的当周中的某一天,返回值为0到6
days_in_month(v=vector(time()) instant-vector) #返回UTC中给定时间的一个月的天数,返回值28到31
hour(v=vector(time()) instant-vector) #返回UTC中给定时间的当天中的某一小时,返回值为0到23
minute(v=vector(time()) instant-vector) #返回UTC中给定时间的小时中的某分钟,返回值为0到59
delta(v range-vector) #返回一个即时向量,它计算每个time series中的第一个值和最后一个值的差别
deriv(v range-vector) #计算每个time series的每秒的导数(derivative)
exp(v instant-vector) #计算v中所有元素的指数函数
histogram_quantile(φ float, b instant-vector) #从buckets类型的向量中计算φ(0 ≤ φ ≤ 1)百分比的样本的最大值
holt_winters(v range-vector, sf scalar, tf scalar) #根据范围向量中的范围产生一个平滑的值
idelta(v range-vector) #计算最新的2个样本值之间的差别
increase(v range-vector) #计算指定范围内的增长值, 它会在单调性发生变化时(如由于目标重启引起的计数器复位)自动中断
irate(v range-vector) #计算给定时间窗口内的每秒瞬时增加速率, 基于的是最新的2个数据点
rate(v range-vector) #计算给定时间窗口内的每秒的平均值
resets(v range-vector) #对于每个 time series , 它都返回一个 counter resets的次数
sort(v instant-vector) #对向量按元素的值进行升序排序
sort_desc(v instant-vector) #对向量按元素的值进行降序排序
sqrt(v instant-vector) #返回v中所有向量的平方根
time() #返回从1970-1-1起至今的秒数,UTC时间

参考链接:https://prometheus.io/docs/prometheus/latest/querying/basics/

promql查询表达式的更多相关文章

  1. 如何使用 Entity Framework 构造动态查询表达式

    一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...

  2. Linq查询表达式

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  3. 《C#本质论》读书笔记(15)使用查询表达式的LINQ

    15.1 查询表达式的概念 简单的查询表达式 private static void ShowContextualKeywords1() { IEnumerable<string> sel ...

  4. lambda表达式和查询表达式

    (1)Lambda表达式定义: Lambda是创建匿名函数的另一种形式.它比对应的匿名方法更加的简化.因此,所有的情况都推荐使用Lambda表达式.   它可以包括表达式和语句,并且用于创建委托和事件 ...

  5. LINQ 查询表达式(C# 编程指南)

    语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在 ...

  6. Linq专题之创建Linq查询表达式

    本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...

  7. LinQ实战学习笔记(三) 序列,查询操作符,查询表达式,表达式树

    序列 延迟查询执行 查询操作符 查询表达式 表达式树 (一) 序列 先上一段代码, 这段代码使用扩展方法实现下面的要求: 取进程列表,进行过滤(取大于10M的进程) 列表进行排序(按内存占用) 只保留 ...

  8. LINQ之路 5:LINQ查询表达式

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...

  9. C# 标准查询表达式

    一.标准查询运算符 1.C#提供了标准查询运算符,例如我想选择专利一系列(pantents)中以年份19开头的专利,可以用如下语句: IEnumerable<Patent> pantent ...

随机推荐

  1. Github Pages 搭建网站

    参考网站: https://pages.github.com/ http://gitbeijing.com/pages.html 搬进github:http://gitbeijing.com

  2. rosetta mpi编译时出现 MPI has not been declared 错误

    安装openmpi2.1.0版本,编译mpi rosetta时出现 MPI has not been declared 错误,经过一系列的摸索发现安装openmpi-1.6.5就可以顺利编译,降低版本 ...

  3. Selenium基础知识(五)多窗口切换

    说到多窗口切换必须想到driver.switch_to.window()方法 driver.switch_to.window() 实现在不同窗口之间切换 driver.current_window_h ...

  4. 巧用CurrentThread.Name来统一标识日志记录

    ▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...

  5. php实现记住密码下次自动登陆

    这篇博客里面还写到 实现“记住我的登录状态”的功能方法,简言之,就是对首先对session进行用户信息赋值,检测session,失效后,利用cookie对其赋值: 在实现过程中,根据网上一些代码贴,整 ...

  6. sqli-labs(十四)(宽字节注入)

    数据库使用gbk编码的时候,会将两个字符合并成一个中文. 写在前面吧,对php的代码审计也会有帮助 直接使用 set character_set_client=gbk 或者是常见的mysql_quer ...

  7. c#winform,知道图像路径,怎么在程序运行时往image里面添加图片

    貌似可以直接添加啊 ,要改变显示的图片,就是将图片的路径赋值给picturebox即可pictureBox1.ImageLocation="图片路径"动态的改变这个值就行了.

  8. Python记录7:函数3,函数对象

    #函数对象指的是:函数的内存地址可以像变量值一样去使用,如何使用?def func(): print('from func')#1. 可以被引用# f=func# print(f)# f() #2. ...

  9. mac快捷键留存查看

    基本的快捷键 Command是Mac里最重要的修饰键,在大多数情况下相当于Windows下的Ctrl.所以以下最基本操作很好理解: Command-Z 撤销 Command-X 剪切 Command- ...

  10. linux整理

    文件查看命令 cat [OPTION]... [FILE]...  - E: 显示行结束符$ -n: 对显示出的每一行进行编号 -A:显示所有控制符 -b:非空行编号 -s:压缩连续的空行成一行 he ...