本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • Prometheus
  • Prometheus监控系统(3)Prometheus的函数与计算公式

Prometheus监控系统(3)Prometheus的函数与计算公式

发布:TangLu2019-6-17 17:17分类: Prometheus 标签: Prometheus

Prometheus强大的地方就在于可以使用很多计算公式去获取自己需要的数据。正因为涉及到了计算公式,这也是它的难点所在,比如在Zabbix中要获取CPU使用率是一件很简单的事情,而在Prometheus中却需要使用计算公式来完成。

比如要统计CPU使用率:node_exporter会抓取CPU常用的8种状态的累计工作时间,然后再用(所有非空闲状态的CPU时间总和)/(所有状态的CPU时间总和)= CPU使用率。而如果想要获取中间某一分钟的CPU平均时间还需要用到Counter数据类型。由于Counter的数据一直是增量,所以需要截取其中一段增量值,然后再拿这个数值去套用公式进行计算。


Prometheus为不同的数据类型提供了非常多的计算函数,有个小技巧就是遇到counter数据类型,在做任何操作之前,先套上一个rate()或者increase()函数。下面介绍一些比较常用的函数帮助理解:

increase函数:该函数配合counter数据类型使用,获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以一定时间就可以获取该时间内的平均增长率

increase(node_cpu[2m]) / 120 #主机节点最近两分钟内的平均CPU使用率

rate()函数:该函数配合counter类型数据使用,取counter在这个时间段中的平均每秒增量。比如监控网络接受字节数的情况,在9:10到9:20期间累计量增加了1000bytes,加入rate([1m])函数后就会使用1000除以60秒,计算出数据大约为16bytes。

rate(node_cpu[2m])  #直接计算区间向量在时间窗口内平均增长速率

sum函数:在实际工作中CPU大多是多核的,而node_cpu会将每个核的数据都单独显示出来,我们其实不会关注每个核的单独情况,而是关心总的CPU情况。使用sum()函数进行求和后可以得出一条总的数据,但sum()是将所有机器的数据都进行了求和,所以还要再使用by (instance)或者by (cluster_name)就可以取出单个服务器或者一组服务器的CPU数据。上面的公式可以进化为:

sum( increase(node_cpu[1m]) )


count函数该函数用于进行一些模糊判断,比如有100台服务器在监控,想实现当CPU使用率大于80%的机器达到N台就进行报警就可以使用它

count(count_netstat_wait_connections > 200)


topk函数:该函数可以从大量数据中取出排行前N的数值,N可以自定义。比如监控了100台服务器的320个CPU,用这个函数就可以查看当前负载较高的那几个,用于报警

topk(3,count_netstat_wait_connections)  #Gauge类型
topk(3,,rate(node_network_receive_bytes[20m]))  #Counter类型


predict_linear函数:对曲线变化速率进行计算,起到一定的预测作用。比如当前这1个小时的磁盘可用率急剧下降,这种情况可能导致磁盘很快被写满,这时可以使用该函数,用当前1小时的数据去预测未来几个小时的状态,实现提前告警

predict_linear( node_filesystem_free_bytes{mountpoint="/"}[1h],4*3600 ) < 0   #如果未来4小时后磁盘使用率为负数就会报警



了解清楚流程之后进行一个CPU使用率的拆分解析:

1、先把key找出来,比如是为了查看CPU的使用率,那么就应该使用node_cpu这个key

2、在node_cpu这个key的基础上把idle的CPU时间和全部CPU时间过滤出来,使用{}做过滤,如下:

node_cpu{ mode='idle' }  #找出空闲CPU的值
node_cpu  #不写其他参数代表ALL


3、使用increase()函数把1分钟的数据抓取出来,这个时候取出来的是每个CPU的数据

increase(node_cpu{mode='idle'}[1m])


4、使用sum()函数求和每个CPU的数据,得到单独一个数据

sum( increase(node_cpu{mode='idle'}[1m]) )


5、sum()函数虽然把每个CPU的数据进行了求和,但是还把每台服务器也进行了求和,所有服务器的CPU数据都相同了,还需要进行一次处理。这里又引出了一个新函数 by (instance)。它会把sum求和到一起的数值按照指定方式进行拆分,instance代表的是机器名。如果不写by (instance)的话就需要在{}中写明需要哪个实例的数据。

sum( increase(node_cpu{mode='idle'}[1m]) ) by (instance)  #空闲CPU一分钟增量


6、最终计算出CPU使用率

1-( sum( increase(node_cpu{mode='idle'}[1m]) ) by (instance) / sum(increase(node_cpu[1m])) by (instance) ) *100


附上三个常用的计算公式:

#CPU使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)
#内存使用率
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
#空闲内存剩余率
100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
#磁盘使用率
100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs"} * 100)


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《Prometheus监控系统(3)Prometheus的函数与计算公式
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-503.html  [生成短网址]

已有 4/3260 人参与

评论:

老部落运维 2019-06-18 08:56
朋友 交换链接吗
TangLu 2019-06-18 11:17
@老部落运维:欢迎交换啊 地址来一发
老部落运维 2019-06-19 09:20
@TangLu:https://www.laobuluo.com/  老部落运维

已添加贵站链接
TangLu 2019-06-19 10:51
@老部落运维:已添加友链

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~