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

一、Prometheus数据类型(metrics)

  • · Gauges:最简单、使用最多的指标,获取一个返回值,这个返回值没有变化规律,不能肯定它一定是增长或是减少的状态,采集回来是多少就是多少。比如硬盘容量、CPU内存使用率都适合使用Gauges数据类型。
  • · Counters:计数器类型。数据在理想状态下应该是从0开始永远递增或者是不变。比如系统运行时间、HTTP访问量等。这类型的数据通常要借助rate、irate、topk、increase等函数来获取一个变化状态,如增长率。
  • · 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专用的查询语言,支持条件查询、算术运算、比较操作符、正则表达式、聚合操作符、逻辑操作符,组装非常灵活

下面是一个使用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)

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值