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

Prometheus监控系统(3)Prometheus数据类型与常用函数

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

一、Prometheus数据类型(metrics)

· Gauges:最简单、使用最多的指标,获取一个返回值,这个返回值没有变化规律,不能肯定它一定是增长或是减少的状态,采集回来是多少就是多少。比如硬盘容量、CPU内存使用率都适合使用Gauges数据类型。

· Counters:计数器。数据从0开始累计,理想状态下应该是永远增长或者是不变。适合统计机器开机时间、HTTP访问量

· Histograms:和summary一样属于高级指标,用于统计数据的分布情况。比如最小值、最大值、中间值。这个类型不太好理解,比如说统计一天的日志,大部分用户响应时间都是正常的,只有少量用户异常,如果这个时候取平均值的话,这少量用户的异常情况就会被掩盖过去,而Histograms可以分别统计出全部用户的响应时间,比如0-1秒的用户有多少、1-2秒的用户有多少(其实有点像Kibana)


二、Prometheus函数介绍

Prometheus之所以灵活是因为可以根据计算公式结合内置的许多函数获取需要的数据。正因为涉及到了计算公式,这也是它的难点所在,比如在Zabbix中要获取CPU使用率是一件很简单的事情,而在Prometheus中却需要使用计算公式来完成。以统计CPU使用率为例,node_exporter会抓取CPU常用的8种状态的累计工作时间,再用(所有非空闲状态的CPU时间总和)/(所有状态的CPU时间总和)= CPU使用率这样类似公式进行计算。而如果想要获取中间某一分钟的CPU平均时间还需要用到Counter数据类型。由于Counter的数据一直是增量,所以需要依靠函数去截取其中一段增量值,然后再拿这个数值去套用公式进行计算。Prometheus为不同数据类型提供了不同的计算函数。下面是一些常用的函数介绍:

· increase函数:获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以一定时间就可以获取该时间内的平均增长率。该函数需配合计数器类型数据(counter)一起使用,遇到counter数据类型,在做任何操作之前先套rate()或者increase()函数

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


· rate()函数:获取指定时间段的平均量。比如监控网络接受字节数的情况,在9:10到9:20期间累计量增加了1000bytes,加入rate([1m])函数后就会使用1000除以60秒,计算出数据大约为16bytes。该函数需配合计数器类型数据(counter)一起使用,遇到counter数据类型,在做任何操作之前先套rate()或者increase()函数

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   #根据最近1小时的数据计算未来4小时的磁盘使用情况,负数就会报警


三、PromQL语法

PromQL(Prometheus Query Language) 是 Prometheus专用的查询语言,支持条件查询、算术运算、比较操作符、正则表达式、聚合操作符、逻辑操作符,组装非常灵活

360截图20201126215519368.jpg



下面是一个使用PromQL查询CPU使用情况的分解示例:

1、首先找出CPU使用率相关的Key,比如node_cpu


2、在node_cpu这个key的基础上把CPU idle时间和CPU时间过滤出来,在PromQL中使用{}做过滤,多个条件用逗号分隔,

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


3、使用increase()函数并结合[ ]时间范围查询可以把指定时间内的数据获取出来,时间范围支持m,h,s这样的时间单位。这个时候取出来的是每个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/20674 人参与

评论:

老部落运维 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运维技术学习站点

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