目录
Prometheus promQL查询语言
Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据。表达式的结果既可以显示为图形,也可以在Prometheus的表达式浏览器中作为表格数据查看,或者通过HTTP API由外部系统使用。
在 Prometheus 的表达语言中,一个表达式或子表达式可以计算为以下四种类型之一:
瞬时向量(Instant vector):它是指在同一时刻,抓取所有度量指标数据。这些度量指标数据的key都是相同的,也就是相同的时间戳.
范围向量(Range vector):它是指在任何一个时间范围内,抓取所有度量指标数据.
标量(Scalar):一个简单的数字浮点值。
字符串(String):一个未被使用的简单字符串值.
prometheus实例
环境准备 :
配置文件:
files目录:
直接查询特定的metric_name
如:查进程数、查CPU
node_forks_total node_context_switches_total
带标签查询
如:100.5的进程数、100.6的cpu
也可以多标签查询 ,以“,”分隔
查询两分钟的时序数列值
可以看到两分钟有8个值,平均下来就是15s一个,对应了配置文件中的抓取间隔
正则匹配
正则匹配是模糊查询,需要在=后面加一个~,通俗的说就是(≈)
#意思是查两分钟内instance值是以192.168打头的端口号为20001的进程数的时序数值
node_forks_total{instance=~"192.168.*:20001",job="node"}[2m]
函数
官方提供的函数比较多, 具体可以参考prometheus官方函数
这里主要就常用函数进行演示。
irate
irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同:irate取的是在指定时间范围内的最近两个数据点来算速率,而rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。
例如:通过标签查询,特定实例特定job,特定cpu 在nice状态下的cpu次数速率
irate(node_cpu_guest_seconds_total{cpu="0",instance="192.168.100.5:20001",job="node",mode="nice"}[1m])
子查询
rate(node_cpu_seconds_total{cpu="0",instance="192.168.100.5:20001",job="node"}[5m])[10m:1m]
count_over_time
计算特定的时序数据中的个数。
这个数值个数和采集频率有关, 我们的采集间隔是15s,在一分钟会有4个点位数据。
count_over_time(node_cpu_guest_seconds_total [1m])
复杂查询:
#(总内存-空闲内存) / 总内存 * 100 可以算出内存使用百分比
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) /node_memory_MemTotal_bytes * 100
#也可以 (1 - 空闲内存 / 总内存 ) * 100 也可以算出内存百分比
(1 - node_memory_MemFree_bytes / node_memory_MemTotal_bytes ) * 100
获取所有实例的内存使用百分比前两个
topk(2, node_memory_MemFree_bytes / node_memory_MemTotal_bytes * 100)
实用查询样例
计算所有的实例cpu核心数
count by (instance) ( count by (instance,cpu) (node_cpu_seconds_total{mode="system"}) )
计算单个的实例cpu核心数
计算单个实例的内存使用率
#(1 - (可用内存{IP} / (总内存{IP}))) * 100
(1 - (node_memory_MemAvailable_bytes{instance="192.168.100.5:20001"} / (node_memory_MemTotal_bytes{instance="192.168.100.5:20001"}))) * 100
计算根分区使用率
# (1- 节点可用字节数{条件} / 节点总字节数{条件}) * 100
(1- (node_filesystem_avail_bytes{instance="192.168.100.5:20001",mountpoint="/",fstype=~"xfs|ext4"} / node_filesystem_size_bytes{instance="192.168.100.5:20001",mountpoint="/",fstype=~"xfs|ext4"}) ) * 100
预测磁盘空间
整体分为 2个部分, 中间用and分割, 前面部分计算根分区使用率大于85的, 后面计算根据近6小时的数据预测接下来24小时的磁盘可用空间是否小于0 。
(1- (node_filesystem_avail_bytes{mountpoint="/",fstype=~"xfs|ext4"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"xfs|ext4"}) ) * 100 >= 85 and (predict_linear(node_filesystem_avail_bytes[6h],3600*24)<0)
prometheus常见表达式
内存使用率
node_memory_MemTotal_bytes 主机上的总内存
node_memory_MemFree_bytes 主机上的空闲内存
node_memory_Buffers_bytes 缓冲区缓存上的内存
node_memory_Cached_bytes 页面缓存中的内存
计算使用内存的百分比
(总内存-(空闲内存-缓冲区+缓存))/ 总内存 * 100
round((node_memory_MemTotal_bytes-(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes))/node_memory_MemTotal_bytes * 100)
收集cpu
1 、收集cpu 利用率:使用irate 的函数,用于计算距离向量正宗时间序列每秒瞬时增长率 ,瞬时增长率
irate(node_cpu_seconds_total{instance="$ip"}[5m])
2、avg 平均使用率
avg(irate( node_cpu_seconds_total{job="server",mode="idle"}[5m])) * 100
3 、平均使用百分比
100 - avg(irate( node_cpu_seconds_total{job="server",mode="idle"}[5m])) * 100
磁盘使用率
1、磁盘使用率百分比 ,空闲的
空闲的空间 / 总空间
node_filesystem_files_free{mountpoint="/",device="/dev/mapper/centos-root",job="server"} / node_filesystem_size_bytes{mountpoint="/",device="/dev/mapper/centos-root",job="server"} * 100
2、剩余的磁盘使用率
100 - node_filesystem_files_free{mountpoint="/",device="/dev/mapper/centos-root"}/node_filesystem_size_bytes{mountpoint="/",device="/dev/mapper/centos-root"} * 100
磁盘io
1、io 五分钟的增长率
irate(node_disk_io_time_seconds_total[5m])
2、五分钟之内的平均值
avg(irate(node_disk_io_time_seconds_total[5m])) * 100
3、磁盘io 空闲百分比
100 -(avg(irate(node_disk_io_time_seconds_total[5m])) * 100)
网络
1、网卡 五分钟内的增长率
node_network_receive_bytes_total{device=~"ens160|docker0"}[5m]
2、五分钟之内的平均值
round(irate(node_network_receive_bytes_total{device=~"ens160|docker0"}[5m])/1024)
prometheus常用函数
rate 函数
rate() 是取一段时间增量的 平均每秒的增量数。专门配合 counter 类型数据使用的函数。它的功能是按照设置一个时间段,取 counter 这个时间段中的 平均每秒的增量。
sum() 叠加函数
可以将输出的内容进行合并,同by()一起使用才有意义
by () 拆分函数
by( ) 这个函数可以把 sum 合并到一起的数值,按照指定的方式进行拆分。( ) 内 填写它指定的方式在当前案例,需要按照集群节点进行拆分。所以采用 instance=“机器名”,by(instance)。by(cluster_name) 将服务器进行分组
increase({}[time]) 增量函数
在prometheus 中,用来针对 Counter 这种持续增长的数值,截取其中一段时间的增量。配合时间使用。
increase() 是 取一段时间增量的总量
topk() 函数
定义:取前几位的最高值。格式:topk(number,key)
count() 函数
把数值符合条件的,输出数目进行加和
例:找出当前(或者历史)TCP 等待数大于200的 机器数量
count(count_netstat_wait_connections > 200)
实际应用:
一般用 count( ) 函数进行一些模糊的监控判断
比如说:企业中有100台服务器,那么当只有10台服务器 CPU 高于 80% 的时候,这个时候不需要报警,但是当符合 80% CPU 的服务器数量超过 30台 的时候,就会触发报警。