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