Prometheus promQL的语法:
#时间序列
node_cpu_guest_seconds_total{cpu="0"}
监控(指标数据) {标签}
node使用CPU的描述的统计,符合标签CPU=0的时间序列的查询结果
指标+标签生成时间序列
标签:
__address__:双下划线标签,是Prometheus系统的默认标签,不显示在target页面中,只有把光标移动到label的字段上,才能显示默认标签
匹配标签值操作符号:
= 完全相等
!= 不等于,相当于取反
=~ 正则表达式匹配
!~ 正则表达式取反
数学运算符:
+ 加法
- 减法
* 乘法
/ 除法
% 取余
^ 幂运算
常用的通配符:
. 任意单个字符
.* 多个任意字符
.+ 一个或者多个任意字符
时长的单位类型:
s seconds秒
m minute分
h hour时
d day天
w weeks周
y years年
数据类型:
- 瞬时向量:一组时序,每个时序只有一个采样值
- 区间向量:一组时序,每个时序包含一段时间内的多个采样值
- 标量数据:浮点数,小数
- 字符串:一个字符串
- counter:总数,在整个promQL中没有直接作用。通过rate topk increase irate这些函数生成样本数据的变化情况
topk(3,node_cpu_seconds_total)
#展示当前数据前三位的数据
increase要结合区间向量一起使用,展示时间序列在一定范围内的增量
increase(node_cpu_seconds_total[5m])
#在五分钟之内的增量趋势
irate:高灵敏度的函数,计算指标的瞬时速率,基于样本范围内的最后两个样本进行计算
irate更适合于短期范围内的变化速率分析。rate是长时间的
6、gauge:用于存储值,可增可减的指标样本数据,求和,求平均数,取最小值和最大值。也会结合两个特殊的函数:dalta额redict_linear函数一块使用
delta:计算范围向量中每个时间序列元素的第一个和最后一个指相减的差。展示不同时间点上样本的值的差值
delta(container_memory_cache{instance="node01"}[5m])
#5分钟内的差值
predict_linear:可以预测时间序列,V在T秒之后的变化趋势,对样本数据的变化趋势的预测
predict linear(node_filesystem_files{instance="master01"}[2h],4*3600)
node_filesystem_files
#文件数,选择的标签是master01 2h过去两个小时,4*3600未来四个小时
统计过去两个小时的变化,根据这两小时的变化,预测未来4小时的变化
7、historgram:直方图,对一定时间范围内的数据进行采样,通常是请求持续的时长和响应大小的类型这一类,计入一个可配的桶bucket。通过区间对样本进行筛选,也可以统计求和
node_authorizer_graph_action_duration_seconds_bucket{instance="20.0.0.61:6443",le="0.0002"}
#观测桶的上边界,样本的统计区间,表示所有的样本值小于等于上边界的所有样本数量
#le="+Inf",最大区间,包含的所有样本数量
apiserver_current_inqueue_requests{instance="192.168.233.91:6443"} >= 1
#快速的了解监控样本的分布情况
8、summary:分位数计算,类似于historgram,在客户端于一段时间内(默认时间10分钟)
的每个采样点进行统计,计算并且存储了分位数的值。服务端可以直接抓取相应的值
quantile="0.5"
这里的0.5就是分位,他的范围是0<P<1
rate(node_cpu_seconds_total{ instance="node01"}[5m])
#展示的是指标node_cpu_seconds_total,指标是过去每五分钟的一个采样值,对应的标签为 instance="node01"
聚合操作符:
sum 求和
min 最小值
max 最大值
avg 平均值
stdev 标准差
stdvar 方差
count 元素个数
count_values 等于某个值的元素个数
topk 最大的元素个数
bottomk 最小的元素个数
quantile 分位数
业务中常用的语句:
#计算 master01 节点所有容器总计内存:
sum(container_memory_usage_bytes{instance=~"master01"})/1024/1024/1024
#计算 master01 节点最近 1m 所有容器 cpu 使用率:
sum (rate (container_cpu_usage_seconds_total{instance=~"master01"}[1m])) / sum (machine_cpu_cores{ instance =~"master01"}) * 100
#计算最近 1m 所有容器 cpu 使用率
sum by (id)(rate (container_cpu_usage_seconds_total{id!="/"}[1m]))
#查询 K8S 集群中最近 1m 每个 Pod 的 CPU 使用率
sum by (name)(rate (container_cpu_usage_seconds_total{image!="", name!=""}[1m]))
(1)每台主机 CPU 在最近 5 分钟内的平均使用率
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100
(2)查询 1 分钟的 load average 的时间序列是否超过主机 CPU 数量 2 倍
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode="idle"}) by (instance)
(3)计算主机内存使用率
可用内存空间:空闲内存、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
(4)计算所有 node 节点所有容器总计内存:
sum by (instance) (container_memory_usage_bytes{instance=~"node*"})/1024/1024/1024
(5)计算 node01 节点最近 1m 所有容器 cpu 使用率:
sum (rate(container_cpu_usage_seconds_total{instance="node01"}[1m])) / sum (machine_cpu_cores{instance="node01"}) * 100
#container_cpu_usage_seconds_total 代表容器占用CPU的时间总和
(6)计算最近 5m 每个容器 cpu 使用情况变化率
sum (rate(container_cpu_usage_seconds_total[5m])) by (container_name)
(7)查询 K8S 集群中最近 1m 每个 Pod 的 CPU 使用情况变化率
sum (rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m])) by (pod_name)
#由于查询到的数据都是容器相关的,所以最好按照 Pod 分组聚合