[toc]
Prometheus的PromeQL查询语句
通过CPU简单认识PQL(PromeQL)
| 12
 3
 4
 
 | node_cpu_seconds_total{job="dong tai fa xian",instance="10.0.0.11:9100"}
 
 node_cpu_seconds_total{job="dong tai fa xian",cpu="0",mode="idle"}
 
 | 

| 12
 
 | node_cpu_seconds_total{instance!="10.0.0.11:9100"}
 
 | 

| 12
 
 | node_cpu_seconds_total{mode=~"i.*"}
 
 | 

| 12
 
 | node_cpu_seconds_total{mode!~"i.*"}
 
 | 

运算符
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | 
 
 =:		精确匹配
 =~:		模糊匹配
 !=:		不等于,取反
 !~:		模糊匹配取反
 >:		大于
 <:		小于
 >=:		大于等于
 <=:		小于等于
 
 
 sum(node_cpu_seconds_total{cpu="0",mode="idle"})
 
 | 

PQL数据类型
PromQL的表达式中支持以下四种数据类型
即时向量(Instant Vector)
- 特定或全部的时间序列集合上,具有相同时间戳的一组样本称为即时向量。 
范围向量(Range Vector)
- 特定或全部的时间序列集合上,在指定的同一范围内的所有样本值。 
标量(Scalar)
字符串(String)
- 支持使用单引号,双引号或反引号进行引用,但反引号中不会转移字符进行转义

Prometheus常用函数
increase 增量函数
| 12
 3
 4
 5
 6
 
 | 在prometheus中是用来针对Counter这种持续增长的数值,截取其中的一段时间的增量。
 
 
 increase(node_cpu_seconds_total[1m]) minute
 increase(node_cpu_seconds_total[1d]) day
 
 | 
sum 求和函数
| 12
 3
 4
 5
 
 | 顾名思义,主要是起到加和的作用
 
 
 sum(increase(node_cpu_seconds_total{instance="10.0.0.11:9100",mode="idle"}[1m]))
 
 | 
by 分组函数
| 12
 3
 4
 5
 
 | 将数据进行分组,类似于MySQL的"group by"
 
 
 sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by(instance)
 
 | 
rate函数
| 12
 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函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | 取前几位的最高值。实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。
 
 举个例子:
 topk(3,rate(node_cpu_seconds_total[1m])):
 获取CPU总使用时间在1分钟内的增加的总量并除以60秒,计算的是每秒的数量。并只查看top3。
 
 温馨提示:
 如下图所示,我们通常使用topk只会关注"Console"中的瞬时结果,不太会关心Graph的出图效果,因为关注他并没有太大意义,存在太多的断点啦!
 下图之所以会出现中断的情况,是因为在20分钟内这一刻的数据其并没有排进top3,自然就会出现断点的状况。
 
 
 topk(3,increase(node_cpu_seconds_total[1m]))
 
 | 
count函数
| 12
 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"})
 
 
 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
 |