文章目录
PromQL简介
PromQL是prometheus自己开发的数据查询DSL语言,语言表现力非常丰富,支持条件查询、操作符、并且内建了大量内置函数,供我们针对监控数据的各种维度进行查询。
数据类型
PromQL 表达式计算出来的值有以下几种类型:
- 瞬时向量 (Instant vector):一组时序,每个时序只有一个采样值
- 区间向量 (Range vector):一组时序,每个时序包含一段时间内的多个采样值
- 标量数据 (Scalar):一个浮点数
- 字符串 (String):一个字符串
1、瞬时数据 (Instant vector)
定义:瞬时数据表示的是当前时刻的数据
示例:查询CPU的使用时间 (node_cpu_seconds_total)
2、区间数据 (Range vector)
定义:区间数据表示的是在某一个时间范围内的数据,可以分为以下几种:
➢ Time Durations
表示持续时间,计量单位包含毫秒(ms)、秒(s)、分钟(m)、小时(h)、天(d)、周(w)、年(y)等。
示例:查询CPU1分钟内的使用时间 (node_cpu_seconds_total[1m])
可以看到1分钟内,每个指标有4个值,采样周期是15s。
➢ Offest modifier
Offset modifier 表示偏移量修饰符,允许更改查询中单个瞬间和范围向量的时间偏移量。
示例:查询CPU使用时间在5分钟以前的数据 (node_cpu_seconds_total offset 5m)
➢ @modifier
@修饰符 后面加上一个Unix时间戳,可以查询改时间点的数据。
注意:这种用法需要在prometheus启动时添加参数 --enable-feature=promql-at-modifier ,并且以前老版本的prometheus可能不支持这种用法。
示例:查询2022.01.25 00:00:00这个时刻CPU的使用时间 (node_cpu_seconds_total@1643040000)
3、标量数据 (Scalar)
定义:标量数据没有时间属性,每个时间点数值一致。
示例:查询CPU使用时间,所有标签的个数 (count(node_cpu_seconds_total) )
4、字符串 (String)
定义:字符串在PromQL中用于表示文本数据。
示例:可以用单引号(‘’)、双引号(“”)或反引号(``)来指定。在PromQL中,字符串通常用于标签匹配或作为函数参数。
条件匹配
promQL支持各种条件匹配,条件匹配符有:= 、!= 、=~ 、!~
- =:选择与提供的字符完全相同的数据
- !=:选择不等于提供的字符串的数据
- =~:选择与提供的字符串进行正则表达式匹配的数据
- !~:选择与提供的字符串不匹配的数据
1、完全匹配
示例1:查询CPU第一个核的使用时间 (node_cpu_seconds_total{cpu=“0”})
示例2:查询CPU除第一个外其他核的使用时间 (node_cpu_seconds_total{cpu!=“0”} )
示例3:查询CPU第一个、第二个核的使用时间 (node_cpu_seconds_total{cpu=~“0|1”})
示例4:查询CPU除第一个、第二个外其他核的使用时间 (node_cpu_seconds_total{cpu!~“0|1”})
2、正则匹配
示例:查询CPU第一个核,且mode是i开头的使用时间 (node_cpu-seconds_total{cpu=“0”,mode=~“i.*”})
运算符
PromQL支持各种运算符,并对结果数据进行运算和过滤。
1、比较运算符
比较运算符有:== 、!= 、> 、< 、>= 、<=
比较运算符与数学中和其他语言的含义是一样的
示例:查询CPU使用时间等于0的标签 (node_cpu_seconds_total == 0)
示例:查询CPU使用时间不等于0的标签 (node_cpu_seconds_total != 0)
其他比较运算符的用法与上面类似,就不举例了。
2、算数运算符
算术运算符有:加+ 、减- 、乘* 、除/ 、取余% 、幂次方^等
示例:计算主机CPU使用时间和主机上面虚拟机使用时间的和 (node_cpu_seconds_total + node_cpu_guest_seconds_total)
其他算数运算符的用法与上面类似,就不举例了。
3、逻辑运算符
逻辑运算符有:和(and)、或(or)、非(unless)
示例:查询CPU的时间大于0且小于10的标签 (node_cpu_seconds_total > 0 and node_cpu_seconds_total < 10)
其他逻辑运算符的用法与上面类似,就不举例了。
4、聚合运算符
➢ 求和 (sum)
示例:计算CPU所有核的总使用时间 (sum(node_cpu_seconds_total))
➢ 计数 (count)
示例:计算CPU的核数 (count(node_cpu_seconds_total{mode=“system”}))
➢ 最大值 (max)
示例:查询CPU第一个核中使用时间最大值 (max(node_cpu_seconds_total{cpu=“0”}))
➢ 最小值 (min)
示例:查询CPU第一个核中使用时间最小值 (min(node_cpu_seconds_total{cpu=“0”}) )
➢ 求平均值 (avg)
示例:查询CPU所有核的平均使用时间 (avg(node_cpu_seconds_total))
➢ 取前x个值 (topk)
示例:查询CPU所有核中排名前两个的核 (topk(2,node_cpu_seconds_total))
➢ 取后x个值 (bottomk)
示例:查询CPU所有核中排名后两个的核 (bottomk(2,node_cpu_seconds_total))
5、匹配运算
➢ 关联标签 (on)
定义:将两个指标进行算数运算时,如果两个指标的标签不完全相同,可以匹配相同的标签进行计算。
示例:计算CPU每个核系统态和用户态的总使用时间 (node_cpu_seconds_total{mode=“system”} + on(instance,cpu) node_cpu_seconds_total{mode=“user”})
➢ 忽略标签 (ignoring)
定义:将两个指标进行算数运算时,如果两个指标的标签不完全相同,可以忽略不一样的标签进行计算忽略运行状态。
示例:计算CPU每个核系统态和用户态的总使用时间 (node_cpu_seconds_total{mode=“system”} + ignoring(mode) node_cpu_seconds_total{mode=“user”})
➢ 以某个标签进行计算 (by)
示例:计算每个CPU核的各个状态的总使用时间 (sum(node_cpu_seconds_total) by (cpu)))
➢ 舍弃某个标签后进行计算 (without)
示例:计算每个CPU核的各个状态的总使用时间 (sum(node_cpu_seconds_total) without (cpu))