【云原生学习】PromQL学习以及Node Exporter常用查询语句

PromQL学习以及Node Exporter常用查询语句

一、PromQL学习

1.1 表达式数据类型

Instant vector - 一组时间序列,其中包含每个时间序列的一个样本,它们共享相同的时间戳

Range vector - 一组时间序列,其中包含每个时间序列随时间变化的一系列数据点

Scalar - 一个简单的数值浮点值

String - 一个简单的字符串值;

1.1.1 Instant vector selectors

例如:

http_requests_total

{}表示过滤
http_requests_total{job="prometheus",group="canary"}

支持以下操作

=: 完全相等

!=: 不相等

=~:正则匹配字符串或子串

!~: 正则不匹配字符串或子串

vector selectors必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。下面的表达式是非法的。
{job=~".*"} # Bad!

应该改为
{job=~".+"}              # Good!
{job=~".*",method="get"} # Good!

__name__ 标签

http_requests_total 等价于 {__name__="http_requests_total"}

以下可以查找job开头的所有指标
{__name__=~"job:.*"}

1.1.2 区间vector selectors

时间单位

s - seconds m - minutes h - hours

d - days w - weeks y - years

以下表示最后5分钟内匹配标签的指标
http_requests_total{job="prometheus"}[5m]


offset modifier

偏移修改器允许更改查询中的单个瞬间和范围向量的时间偏移量

以下表示与当前时间相隔5分钟的指标
http_requests_total offset 5m

1.2 符合运算
1.2.1 操作符
+ 
- 
* 
/% 取模
^
1.2.2 比较符
==
!= 
> 
< 
>= 
<= 
1.2.3 逻辑运算符
and 交集
or  并集
unless 补集
1.2.4 集合匹配
常见11,和多对一/一对多

一对一匹配
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m

一对多和多对一
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m

1.2.5 聚合操作
sum 
min
max
avg
stddev 计算总体标准差除以维数
stdvar 计算总体标准方差除以维度
count
count_values 计算具有相同值的元素的数量
bottomk 最小k个元素的样本值
topk 最大k个元素的样本值
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) 分位数(分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等)
1.2.6 优先级
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or


然而 ^ 从右开始, 所以 2 ^ 3 ^ 2 = 2 ^ (3 ^ 2)
1.3 内置函数
abs(v instant-vector) 绝对值

absent(v instant-vector) 判断指标数据是否存在,在预警时非常有用

  absent(nonexistent{job="myjob"})
  # => {job="myjob"}

  absent(nonexistent{job="myjob",instance=~".*"})
  # => {job="myjob"}

  absent(sum(nonexistent{job="myjob"}))
  # => {}

ceil(v instant-vector) 大于等于当前的最小整数

changes(v range-vector) 返回给定时间范围内改变值的数量

clamp_max(v instant-vector, max scalar) max的上限

clamp_min(v instant-vector, min scalar) min的下限

day_of_month(v=vector(time()) instant-vector) 一个月中的日,返回值1-31

day_of_week(v=vector(time()) instant-vector) 一礼拜的星期几,0-60是礼拜天

days_in_month(v=vector(time()) instant-vector) 一月的天数,28-31

delta(v range-vector)
  以下返回现在和2个小时之前cpu的温度差
  delta(cpu_temp_celsius{host="zeus"}[2h])

deriv(v range-vector) 计算距离向量中时间序列的二阶导数
  使用线性表达式 具体查看 https://en.wikipedia.org/wiki/Simple_linear_regression

exp(v instant-vector) 指数
Exp(+Inf) = +Inf
Exp(NaN) = NaN

floor(v instant-vector) 小于当前的最近整数

histogram_quantile()
直方图(P-浮点,B瞬时矢量)从柱状图B的直方图中计算出(01之间)的π-分位数。(参阅直方图和摘要,详细解释了PH-分位数和直方图度量类型的用法。)B中的样本是每个桶中的观测值。每个样本必须有标签LE,其中标签值表示桶的包含上限。(没有这种标签的样本被忽略)。直方图度量类型自动提供与桶桶后缀和适当标签的时间序列。

holt_winters(v range-vector, sf scalar, tf scalar)
  根据V的范围产生时间序列的平滑值,平滑因子SF越低,对旧数据的重要性就越大。趋势因   子TF越高,数据的趋势越大。SF和TF必须在01之间

hour(v=vector(time()) instant-vector) 小时,0-23

idelta(v range-vector) 计算最后两个之间的区别

increase(v range-vector) 计算向量范围内,时间序列的增长值。increase只能用计数器

irate(v range-vector) 计算每秒的速率。基于最后两个数据点。irate和聚合操作一起时, irate优先,然后聚合
label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...) 标签加入

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) 标签替换

ln(v instant-vector) 自然对数
 ln(+Inf) = +Inf
 ln(0) = -Inf
 ln(x < 0) = NaN
 ln(NaN) = NaN

log2(v instant-vector) 二进制对数计算的所有元素

log10(v instant-vector) 十进制对数计算的所有元素

minute(v=vector(time()) instant-vector) 分钟,0-59

month(v=vector(time()) instant-vector) 月,1-12

predict_linear(v range-vector, t scalar)
  预测线性(V范围向量,T标量)基于距离向量V,利用简单线性回归预测从现在开始的时间序列T秒的值。

rate(v range-vector) 计算每秒的增加的平均速率。用于计数器

resets(v range-vector)
 返回计数器reset的数量,两个样本之间值变小,作为一个计数器reset

round(v instant-vector, to_nearest=1 scalar)在所有的样本值在元素v到最近的整数。to_nearest参数允许指定的最近倍数 ,对采样值进行舍入

scalar(v instant-vector) 返回样本单个元素值,没有返回NaN 

sort(v instant-vector) 根据值升序排列

sort_desc() 降序排列

sqrt(v instant-vector) 开方

time() 返回从1970 11号到现在的秒数

timestamp(v instant-vector) 返回样本的时间戳

vector(s scalar) 返回标量s作为载体的标签

year(v=vector(time()) instant-vector) 返回年

<aggregation>_over_time()
   avg_over_time(range-vector)平均值 : 所有的点在该指定间隔。
   min_over_time(range-vector): 在所有点的最小值在指定的间隔。
   max_over_time(range-vector)将最大的值 : 在所有点的指定区间。
   sum_over_time(range-vector)所有值的总和 : 在指定的间隔。
   count_over_time(range-vector)计数 : 将所有的值在指定的间隔。
   quantile_over_time(scalar, range-vector)  分位数φ (0 ≤ φ ≤ 1) 的值在指定的间隔。
   stddev_over_time(range-vector) : 标准偏差值在指定的间隔。
   stdvar_over_time(range-vector): 标准方差的值在指定的间隔。
注意,即使在整个区间内的值不是相等的间隔,在指定的间隔中的所有值在聚合中都具有相同的权重

二、Node Exporter常用查询语句

收集到 node_exporter 的数据后,我们可以使用 PromQL 进行一些业务查询和监控,下面是一些比较常见的查询。

注意:以下查询均以单个节点作为例子,如果大家想查看所有节点,将 instance=“xxx” 去掉即可。

2.1 CPU使用率
100 - (avg by (instance) (irate(node_cpu{instance="xxx", mode="idle"}[5m])) * 100)
2.2 CPU各mode占比率
avg by (instance, mode) (irate(node_cpu{instance="xxx"}[5m])) * 100
2.3 机器平均负载
node_load1{instance="xxx"} // 1分钟负载
node_load5{instance="xxx"} // 5分钟负载
node_load15{instance="xxx"} // 15分钟负载
2.4 内存使用率
100-(node_memory_MemFree_bytes{instance="192.168.119.69:9796"}+node_memory_Cached_bytes{instance="192.168.119.69:9796"}+node_memory_Buffers_bytes{instance="192.168.119.69:9796"})/node_memory_MemTotal_bytes{instance="192.168.119.69:9796"}*100
2.5 磁盘使用率
100 - node_filesystem_free_bytes{mountpoint = "/",instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} /
           node_filesystem_size_bytes{mountpoint = "/",instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} * 100
      
或者你也可以直接使用 {fstype="xxx"} 来指定想查看的磁盘信息
2.6 网络IO
// 上行带宽
sum by (instance) (irate(node_network_receive_bytes_total{instance="xxx",device!~"bond.*?|lo"}[5m])/128)

// 下行带宽
sum by (instance) (irate(node_network_transmit_bytes_total{instance="xxx",device!~"bond.*?|lo"}[5m])/128)
2.7 网卡出入包
// 入包量
sum by (instance) (rate(node_network_receive_bytes_total{instance="xxx",device!="lo"}[5m]))

// 出包量
sum by (instance) (rate(node_network_transmit_bytes_total{instance="xxx",device!="lo"}[5m]))
  
2.8 IOPS读写
irate(node_disk_writes_completed_total{instance=~"^192.168.119.68:9796",device=~"[a-z]*[a-z]"}[5m])
   
   
    //IOPS读  查询条件
       String IOPSRead = "sum without(device)  (node_disk_reads_completed_total{instance=~\"^" + instance + "\"})";
node_disk_reads_completed_total/node_disk_read_time_seconds_total

读
irate(node_disk_reads_completed_total{instance=~"^192.168.119.68:9796",device=~"[a-z]*[a-z]"}[5m])
2.9 每秒api请求数
sum by(component) (irate(apiserver_request_total[5m]))
2.10 api平均延时
avg by(component)((sum by(component)(apiserver_request_duration_seconds_sum))/(sum by(component)(apiserver_request_duration_seconds_count)))
2.11 调度器调度次数
sum  (scheduler_schedule_attempts_total)
2.12 调度失败的pod
sum (scheduler_schedule_attempts_total{result!="scheduled"})
2.13 集群CPU使用率
1- (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])))
2.14 集群内存使用率
100 * (1 - sum(node_memory_MemAvailable_bytes) / sum(node_memory_MemTotal_bytes))
2.15 集群磁盘使用率
(sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
    - sum(node_filesystem_free_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
   ) / sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"}) * 100 
2.16 集群总cpu
sum (machine_cpu_cores{node=~"^.*$"})
2.17 集群已经使用的cpu
(1 - (avg(irate(node_cpu_seconds_total{mode="idle",node=~"^.*$"}[5m])))) * sum(machine_cpu_cores{node=~"^.*$"})
2.18 集群总内存
sum (machine_memory_bytes{node=~"^.*$"})
2.19 集群已使用内存
sum(node_memory_MemTotal_bytes{device!~"rootfs|HarddiskVolume.+",node =~"^.*$"}) - sum(node_memory_MemAvailable_bytes{device!~"rootfs|HarddiskVolume.+",node =~"^.*$"})
2.20 集群总磁盘
sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
2.21 集群已使用磁盘
sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
    - sum(node_filesystem_free_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
2.22 集群总pod
sum (kube_node_status_capacity_pods)
   
不用--->  sum(kube_pod_status_phase{namespace=~".*", phase=~".*"})
2.23 集群运行pod
sum(kubelet_running_pod_count)
   
sum(kube_pod_status_phase{namespace=~".*", phase="Running"})
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值