首先我们先来了解一下什么是PromQL。
{
。PromQL的数据类型有如下四种:
瞬时向量 (Instant vector): 一组时序,每个时序只有一个采样值
区间向量 (Range vector): 一组时序,每个时序包含一段时间内的多个采样值
标量 (Scalar): 一个简单的数字浮点值
字符串 (String): 一个简单的字符串值
(1)瞬时向量选择器
瞬时向量选择器用来选择一组时序在某个采样点的采样值。最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。比如这个表达式:go_info
可以通过在后面添加用大括号包围起来的一组标签键值对来对时序进行过滤。筛选出job为mysql的采样值。
匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符:
=:完全相等
!=: 不相等
=~: 正则表达式匹配
!~: 正则表达式不匹配
下面我们采用=~
来选出job为mysql和prometheus的采样值。
go_info{job=~"mysql|prometheus"}
(2)区间向量选择器
区间向量选择器类似于瞬时向量选择器,不同的是它选择的是过去一段时间的采样值。可以通过在瞬时向量选择器后面添加包含在 [] 里的时长来得到区间向量选择器。比如下面的表达式选出了所有度量指标为apiserver_request_total且resource是pod的时序在过去1 分钟的采样值。
这个不支持Graph,需要选择Console,才会看到采集的数据。
go_info{job=~"mysql|prometheus"}[1m]
时间范围通过时间范围选择器 [ ]进行定义,支持多种时间单位。
s - 秒
m - 分钟
h - 小时
d - 天
w - 周
y - 年
(3)偏移向量选择器
前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用 offset 来指定要偏移的量。比如下面的表达式选择度量名称为:go_info的所有时序在 5 分钟前的采样值。
go_info offset 5m
(4)聚合操作符
数学运算符
布尔运算符
PromQL 内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。
sum (求和) min (最小值)
max (最大值) avg (平均值)
stddev (标准差) stdvar (标准方差)
count (计数) count_values (对value进行计数)
bottomk (后n条时序) topk (前n条时序)
quantile (分位数)
统计当前机器的可用内存。
可用内存等于:free + buff + cache
可用内存表达式 node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes
计算服务器的CPU的使用率(1分钟)
指标 node_cpu_seconds_total 用来统计 CPU 每种模式下所花费的时间,不加条件则是CPU使用时间总和,比如用户态使用时间、空闲时间、中断时间、内核态使用时间等等。
#过滤出CPU空闲的时间
node_cpu_seconds_total{mode="idle"}
#统计idle状态时长
sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
#统计总时长
#sum函数是将所有CPU核数时间相加,没有按照主机进行聚合,就需要引入 by (instance) 函数
#by (instance) 它会把sum求和到一起的数值按照指定方式进行拆分,instance代表的是机器名
#如果不写by (instance)的话就需要在{ }中写明需要哪个实例的数据
sum(increase(node_cpu_seconds_total[1m])) by (instance)
#计算出idle时长和总时长,CPU使用率的表达式
(1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100
(5)内置函数
Prometheus 内置了一些函数来辅助计算,下面介绍一些典型的函数。
abs():绝对值
sqrt():平方根
exp():指数计算
ln():自然对数
ceil():向上取整
floor():向下取整
round():四舍五入取整
delta():计算区间向量里每一个时序第一个和最后一个的差值
sort():排序
rate(): 计算整个时间范围内区间向量中时间序列的每秒平均增长率
irate(): 仅使用时间范围中的最后两个数据点来计算区间向量中时间序列的每秒平均增长率, irate 只能用于绘制快速变化的序列,在长期趋势分析或者告警中更推荐使用 rate 函数
increase(): 计算所选时间范围内时间序列的增量,它基本上是速率乘以时间范围选择器中的秒数
查看prometheus_http_requests_total ,平均数据向下取整:floor(avg(prometheus_http_requests_total{code=“200”}))
查看prometheus_http_requests_total 5分钟内,平均每秒数据:rate(prometheus_http_requests_total{code=“200”}[5m])
(6)常用 PromQL语句
Node 节点内存使用量
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100
Node 节点CPU使用率:
100-avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100
Node 节点启动状态,up == 1为启动,0为停止
Node 节点IO性能:
100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100)
Node 节点网卡出访流量
((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) * 100)
Node 节点 TCP 会话处于established状态
node_netstat_Tcp_CurrEstab
Node 节点磁盘使用量
100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100)
Ok,好啦 ,到这里关于Promethus的查询PromQL详解就讲到这里啦,记得三连➕关注啊!