https://www.live400.com/newsdetail/id/34.html PromQL基础使用和案例解析-江苏立维-专注监控、运维服务(Zabbix|Prometheus|APM|日志|数据库)
  首页     >     新闻动态     >     PromQL基础使用和案例解析

PromQL基础使用和案例解析

发布日期:2025-01-08    阅读数:176

0

1

PromQL简介




PromQL是prometheus自己开发的数据查询DSL语言,语言表现力非常丰富,支持条件查询、操作符、并且内建了大量内置函数,供我们针对监控数据的各种维度进行查询。

0

2

数据类型



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中,字符串通常用于标签匹配或作为函数参数。


0

3

条件匹配




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.*"})


0

4

运算符

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)

示例1:查询CPU的时间大于0且小于10的标签 (node_cpu_seconds_total > 0 and node_cpu_seconds_total < 10)

or、unless的用法与上面类似,就不举例了。

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))

新闻搜索

相关新闻

云安全风险发现,从现在开始
返回顶部-立维
公众号
关注微信公众号
电话咨询
服务热线:400-006-8618
项目咨询
项目合作,欢迎发邮件咨询
liveserver@live400.com