[toc]

Prometheus的PromeQL查询语句

通过CPU简单认识PQL(PromeQL)

1
2
3
4
node_cpu_seconds_total{job="dong tai fa xian",instance="10.0.0.11:9100"}

## 查看动态发现的所有机器,CPU第一颗核心的空闲使用率?
node_cpu_seconds_total{job="dong tai fa xian",cpu="0",mode="idle"}

image-20230619213254918

1
2
## 查看除了10.0.0.11意外的实例
node_cpu_seconds_total{instance!="10.0.0.11:9100"}

image-20230619213313403

1
2
## 查看cpu 以i开头的监控项
node_cpu_seconds_total{mode=~"i.*"}

l

1
2
## 查看cpu 除以i开头的监控项
node_cpu_seconds_total{mode!~"i.*"}

image-20230619213434690

运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 按照加粗黑色字段过滤内容

# 运算符
=: 精确匹配
=~: 模糊匹配
!=: 不等于,取反
!~: 模糊匹配取反
>: 大于
<: 小于
>=: 大于等于
<=: 小于等于

## 使用函数求和
sum(node_cpu_seconds_total{cpu="0",mode="idle"})

image-20230620082110971

PQL数据类型

PromQL的表达式中支持以下四种数据类型

即时向量(Instant Vector)

  • 特定或全部的时间序列集合上,具有相同时间戳的一组样本称为即时向量。

范围向量(Range Vector)

  • 特定或全部的时间序列集合上,在指定的同一范围内的所有样本值。

标量(Scalar)

  • 一个浮点型的数据值。

字符串(String)

  • 支持使用单引号,双引号或反引号进行引用,但反引号中不会转移字符进行转义

image-20230620082349247

Prometheus常用函数

increase 增量函数

1
2
3
4
5
6
# increase函数: 计算某一时间段的增量
在prometheus中是用来针对Counter这种持续增长的数值,截取其中的一段时间的增量。

# CPU在一分钟内使用率增长了多少
increase(node_cpu_seconds_total[1m]) minute
increase(node_cpu_seconds_total[1d]) day

sum 求和函数

1
2
3
4
5
# sum函数:
顾名思义,主要是起到加和的作用

# 实例是10.0.0.11机器CPU空闲在1分钟之内增量的两个核心求和
sum(increase(node_cpu_seconds_total{instance="10.0.0.11:9100",mode="idle"}[1m]))

by 分组函数

1
2
3
4
5
# by函数:
将数据进行分组,类似于MySQL的"group by"

# 按照机器分组求出CPU iowait 在1分钟之内增量的所有核心求和
sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by(instance)

rate函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rate函数:
它的功能是按照设置的一个时间段,取counter在这个时间段中的平均每秒的增量。因此是专门搭配counter类型数据使用的函数

举个例子:
rate(node_cpu_seconds_total[1m]):
获取CPU总使用时间在1分钟内的增加的总量并除以60秒,计算的是每秒的增量。
rate(node_network_receive_bytes_total[1m]):
获取一分钟内网络接收的总量。
查看的时间越短,某一瞬间的突起或降低在成图的时候会体现的更细致,更铭感。
rate(node_network_receive_bytes_total[20m])
获取二十分钟内网络接收的总量。
查看的时间越长,那么当发生瞬间的突起或降低时候,会显得平缓一些,因为取得时间段越长会把波峰波谷都给平均消下去了

温馨提示:
在实际工作中,我们取监控频率为1分钟还是5分钟这取决与我们对于监控数据的敏感程度来挑选。

rate(node_cpu_seconds_total[1m])

topk函数

1
2
3
4
5
6
7
8
9
10
11
12
13
# topk函数:
取前几位的最高值。实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。

举个例子:
topk(3,rate(node_cpu_seconds_total[1m])):
获取CPU总使用时间在1分钟内的增加的总量并除以60秒,计算的是每秒的数量。并只查看top3。

温馨提示:
如下图所示,我们通常使用topk只会关注"Console"中的瞬时结果,不太会关心Graph的出图效果,因为关注他并没有太大意义,存在太多的断点啦!
下图之所以会出现中断的情况,是因为在20分钟内这一刻的数据其并没有排进top3,自然就会出现断点的状况。

# cpu一分钟内增量数据为前三的
topk(3,increase(node_cpu_seconds_total[1m]))

count函数

1
2
3
4
5
6
7
8
9
10
11
12
count函数:
把数值符合条件的,输出数目进行累计加和。一般用它进行一些模糊的监控判断。
比如说企业中有100台服务器,那么只有10台服务器CPU使用率高于80%的时候,这个时候不需要报警,当符合80%CPU的服务器数量超过70台的时候那么就触发报警。

举个例子:
count(zls_tcp_wait_conn > 500):
我们假设zls_tcp_wait_conn是咱们自定义的KEY,上述案例是找出当前(或者历史的)当前TCP等待数大于500的机器数量。

count(node_cpu_seconds_total{cpu="1"})

## CPU空闲值大于90的
count(node_cpu_seconds_total{cpu="0",mode="idle"} > 90)

运算示例

计算各节点的CPU的总使用率,参考公式: “100% - (CPU空 闲时间/总时间)”

1
(1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)) * 100