时间序列
node_cpu_guest_seconds_total{cpu="0"}
#{}外的是监控项(指标数据)
#{}内的是标签
#node使用cpu的描述统计,符合标签cpu=0的时间序列,查询出的结果
#指标项+标签就是Prometheus的时间序列
_address_
#双下划线标签是Prometheus系统的默认标签,不显示在页面上,只有把光标移动到字段上才会显示
node_cpu_seconds_total{mode="iowait",cpu="0"}
#查看状态时iowait的且cpu是0的数据
匹配标签值的操作符
=
#表示完全相等
!
#表示不等于,取反
=~
#正则表达式匹配
!~
#正则表达式取反
数学运算符:
+
#加法
-
#减法
*
#乘法
/
#除法
%
#取余
^
#幂运算
通配符:
.
#任意单个字符
.*
#任意多个字符
.+
#一个或多个任意字符
时长的单位:
s
#seconds 秒
m
#minutes 分
h
#hour 小时
d
#day 天
w
#weeks 周
y
#years 年
数据类型
1、 瞬时向量:表示一组时序,每个时序只有单独的一个采量值
node_cpu_seconds_total{mode="iowait",cpu="0"}
2、 区间向量:表示一组时序,每个时序包含一段时间内的多个采样值。具有时间范围
rate(container_cpu_load_average_10s{instance="node01"}[5m])
#展示container_cpu_load_average_10s指标过去每5分钟的采样值。对应的标签是instance="node01"
3、 标量数据:表示浮点数
4、 字符串类型:表示一个字符串
5、 counter类型:表示一个总数。promql语句当中没有直接作用,借助一些函数,rate topk increase irate通过这些函数来生成样本数据的变化情况。
topk(3,node_cpu_seconds_total)
#_total:一般表示counter类型的数据
#展示当前数据中排名前3的数据
increase:要结合区间向量一起使用,时间序列在一定范围内的增量
increase(node_cpu_seconds_total[5m])
#5分钟之内增量的趋势
irate:是高灵敏度函数,计算指标的瞬时速率,基于样本范围内的最后两个样本进行计算。取范围内的最后两个值进行比较,比较出一个比率。 irate更适用于短时间内的变化速率分析
irate(node_cpu_seconds_total[5m])
#每5分钟之内取一个趋势图
6、 gauge类型:用于存储可增可减的指标样本数据。一般用于求和,求平均数,取最小值和最大值。也会结合两个特殊的函数一起使用:delta和predict_linear
delta:用于计算范围向量中的每个时间序列的第一个值和最后一个值相减的差。展示不同时间点上样本值的差值。
delta(container_memory_cache{instance="node01"}[5m])
#在每5分钟内变化的差值
predict_linear:可以预测时间序列在v这个点以及在t这个秒之后的变化趋势,对样本数据的变化趋势做出预测。
predict_linear(node_filesystem_files{instance="master01"}[2h],4*3600)
#predict_linear计算统计指标,统计在node节点上创建的文件数。
#{instance="master01"}:选择的指标是master01
#[2h]:过去两个小时
#4*3600:未来4个小时
#统计过去2个小时的样本数据变化,根据过去2个小时的数据变化,预测未来4个小时的数据变化
将过去的数据带到未来的数据趋势当中
例如:过去2个小时吃了12个苹果。那么它将会预测未来4个小时可能会吃24个苹果
7、 historgram类型:对一定时间范围内的数据进行采样,通常是请求持续的时长和响应大小的类型这一类,计入一个可配的桶中(bucket)通过区间样本进行筛选。也可以统计求和。
node_authorizer_graph_actions_duration_seconds_bucket{instance="20.0.0.32:6443",le="0.0002"}
#le="0.0002":观测桶的上边界,样本的统计区间,表示所有的样本值小于等于0.0002
node_authorizer_graph_actions_duration_seconds_bucket{instance="20.0.0.32:6443",le="+Inf"}
#le="+Inf":表示最大区间,包含的所有样本数量
apiserver_current_inqueue_requests{instance="20.0.0.32:6443"} >=1
#快速了解监控样本的分布情况。
#某个时间点产生的样本值
8、 summary类型:分位数计算,类似于historgram。在客户端于一段时间内(默认10分钟)每个采样点及进行统计,计算并存储了分位数的值,服务端可以直接抓取相应的值
quantile="0.5"
#样本的值必须在0-1的范围之内
通过分位数给取值做分位排列
中位数可以理解为中间项的指标。作为一个中间值,取值比他小的在它下面,比它大就在它上面
将按照序列进行排列取一个中位数。每个数值都和中位数轮流进行比较。在0-1的区间进行浮动。这样可以展示样本在一段时间之内的分布情况
聚合操作符
sum
#求和
min
#最小值
max
#最大值
avg
#平均值
stddev
#标准差:算数平均数。标准差是方差的平方根
stdvar
#方差:标准差的一种。方差越小,数据组越稳定。
count
#元素个数
count_calues
#等于某个值的元素个数
topk
#最大的元素个数
bottomk
#最小的元素个数
quantile
#分位数
在使用topk和bottomk时需要带入数值。表示是取前几位还是后几位
求和
sum(container_cpu_usage_seconds_total)
#将值累加
最小值
bottomk(3,container_cpu_usage_seconds_total)
#取最小的3个值
分位数
quantile(0.65,container_cpu_usage_seconds_total)
业务中常用的语句
计算某个节点的所有容器使用内存的时间序列
sum(container_memory_usage_bytes{instance="node01"})/1024/1024/1024
#计算某个节点的所有容器使用内存的时间序列
某个节点上最近1分钟之内所有容器使用cpu的使用率
sum(rate(container_cpu_usage_seconds_total{instance="node01"}[1m]))
#node1节点上所有容器最近1分钟之内所有容器使用cpu的使用率
最近1分钟所有容器的cpu使用率
sum by (id) (rate(container_cpu_system_seconds_total{id!="/"}[1m]))
#最近1分钟所有容器的cpu使用率
查询k8s集群当中最近1分钟每个pod的cpu使用率
sum by (name) (rate(container_cpu_system_seconds_total{image!="",name!=""}[1m]))
#查询k8s集群当中最近1分钟每个pod的cpu使用率
每台主机 CPU 在最近 5 分钟内的平均使用率
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100
#每台主机 CPU 在最近 5 分钟内的平均使用率
查询 1 分钟的 load average 的时间序列是否超过主机 CPU 数量 2 倍
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode="idle"}) by (instance)
计算主机内存使用率可用内存空间:空闲内存、buffer、cache 指标之和
node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes
已用内存空间:总内存空间减去可用空间
node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)
使用率:已用空间除以总空间
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100
计算所有 node 节点所有容器总计内存:
sum by (instance) (container_memory_usage_bytes{instance=~"node*"})/1024/1024/1024
#container_cpu_usage_seconds_total 代表容器占用CPU的时间总和
计算最近 5m 每个容器 cpu 使用情况变化率
sum (rate(container_cpu_usage_seconds_total[5m])) by (container_name)
#container_cpu_usage_seconds_total 代表容器占用CPU的时间总和
查询 K8S 集群中最近 1m 每个 Pod 的 CPU 使用情况变化率
sum (rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m])) by (pod_name)
#由于查询到的数据都是容器相关的,所以最好按照 Pod 分组聚合