https://awesome-prometheus-alerts.grep.to/rules#elasticsearch 相关文档javascript
Prometheus强大的地方就在于可使用不少计算公式去获取本身须要的数据。正由于涉及到了计算公式,这也是它的难点所在,好比在Zabbix中要获取CPU使用率是一件很简单的事情,而在Prometheus中却须要使用计算公式来完成。html
好比要统计CPU使用率:node_exporter会抓取CPU经常使用的8种状态的累计工做时间,而后再用(全部非空闲状态的CPU时间总和)/(全部状态的CPU时间总和)= CPU使用率。而若是想要获取中间某一分钟的CPU平均时间还须要用到Counter数据类型。因为Counter的数据一直是增量,因此须要截取其中一段增量值,而后再拿这个数值去套用公式进行计算。java
Prometheus为不一样的数据类型提供了很是多的计算函数,有个小技巧就是遇到counter数据类型,在作任何操做以前,先套上一个rate()或者increase()函数。下面介绍一些比较经常使用的函数帮助理解:node
rate()函数:这是一个很是重要的函数,专门配合counter类型数据,取counter在这个时间段中的平均每秒增量。好比监控网络接受字节数的状况,在9:10到9:20期间累计量增长了1000bytes,加入rate([1m])函数后就会使用1000除以60秒,计算出数据大约为16bytes。linux
1 |
rate( node_network_receive_bytes[1m] ) #获取 1 分钟内每秒的增量 |
increase函数:和rate()函数同样也是配合Counter使用。区别就是它是取其中一段时间的增量而不是平均值,好比bash
1 |
increase(node_cpu[1m]) #获取CPU总使用时间1分钟的增量 |
sum函数:在实际工做中CPU大可能是多核的,而node_cpu会将每一个核的数据都单独显示出来,咱们其实不会关注每一个核的单独状况,而是关心总的CPU状况。使用sum()函数进行求和后能够得出一条总的数据,但sum()是将全部机器的数据都进行了求和,因此还要再使用by (instance)或者by (cluster_name)就能够取出单个服务器或者一组服务器的CPU数据。上面的公式能够进化为:服务器
1 |
sum ( increase(node_cpu[1m]) ) |
count函数:该函数用于进行一些模糊判断,好比有100台服务器在监控,想实现当CPU使用率大于80%的机器达到N台就进行报警就可使用它网络
1 |
count(count_netstat_wait_connections > 200 ) |
topk函数:该函数能够从大量数据中取出排行前N的数值,N能够自定义。好比监控了100台服务器的320个CPU,用这个函数就能够查看当前负载较高的那几个,用于报警elasticsearch
1 |
topk( 3 ,count_netstat_wait_connections) #Gauge类型 |
2 |
topk( 3 ,,rate(node_network_receive_bytes[20m])) #Counter类型 |
absent()
absent(v instant-vector)
若是传递给它的向量具备任何元素,则返回空向量;若是传递给它的向量没有元素,则返回值为1的1元素向量。ide
这对于在给定度量标准名称和标签组合不存在时间序列时发出警报很是有用。
absent(nonexistent{job="myjob"}) # => {job="myjob"} absent(nonexistent{job="myjob",instance=~".*"}) # => {job="myjob"} absent(sum(nonexistent{job="myjob"})) # => {}
在第二个示例中,absent()
尝试从输入向量中导出1元素输出向量的标签。
delta()函数
delta(v range-vector)
计算范围向量v
中每一个时间系列元素的第一个和最后一个值之间的差值,返回具备给定增量和等效标签的即时向量。 delta
被外推以覆盖范围向量选择器中指定的全时间范围,所以即便样本值都是整数,也能够得到非整数结果。
如下示例表达式返回如今和2小时以前CPU温度的差别:
delta(cpu_temp_celsius{host="zeus"}[2h])
delta
应仅用于仪表。
changes(v range-vector)
输入一个区间向量, 返回这个区间向量内每一个样本数据值变化的次数(瞬时向量)。例如
# 若是样本数据值没有发生变化,则返回结果为 1changes(node_load5{instance="192.168.1.75:9100"}[1m]) # 结果为 1
predict_linear函数:对曲线变化速率进行计算,起到必定的预测做用。好比当前这1个小时的磁盘可用率急剧降低,这种状况可能致使磁盘很快被写满,这时可使用该函数,用当前1小时的数据去预测将来几个小时的状态,实现提早告警
1 |
predict_linear( node_filesystem_free_bytes{mountpoint= "/" }[1h], 4 * 3600 ) < 0 #若是将来 4 小时后磁盘使用率为负数就会报警 |
了解清楚流程以后进行一个CPU使用率的拆分解析:
一、先把key找出来,好比是为了查看CPU的使用率,那么就应该使用node_cpu这个key
二、在node_cpu这个key的基础上把idle的CPU时间和所有CPU时间过滤出来,使用{}作过滤,以下:
1 |
node_cpu{ mode= 'idle' } #找出空闲CPU的值 |
2 |
node_cpu #不写其余参数表明ALL |
三、使用increase()函数把1分钟的数据抓取出来,这个时候取出来的是每一个CPU的数据
1 |
increase(node_cpu{mode= 'idle' }[1m]) |
四、使用sum()函数求和每一个CPU的数据,获得单独一个数据
1 |
sum ( increase(node_cpu{mode= 'idle' }[1m]) ) |
五、sum()函数虽然把每一个CPU的数据进行了求和,可是还把每台服务器也进行了求和,全部服务器的CPU数据都相同了,还须要进行一次处理。这里又引出了一个新函数 by (instance)。它会把sum求和到一块儿的数值按照指定方式进行拆分,instance表明的是机器名。若是不写by (instance)的话就须要在{}中写明须要哪一个实例的数据。
1 |
sum ( increase(node_cpu{mode= 'idle' }[1m]) ) by (instance) #空闲CPU一分钟增量 |
六、最终计算出CPU使用率
1 |
1-( sum ( increase(node_cpu{mode= 'idle' }[1m]) ) by (instance) / sum (increase(node_cpu[1m])) by (instance) ) *100 |
附上三个经常使用的计算公式:
1 |
#CPU使用率 |
2 |
100 - (avg(irate(node_cpu_seconds_total{mode= "idle" }[5m])) by (instance) * 100) |
3 |
#内存使用率 |
4 |
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 |
5 |
#空闲内存剩余率 |
6 |
100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 |
7 |
#磁盘使用率 |
8 |
100 - (node_filesystem_free_bytes{mountpoint= "/" ,fstype=~ "ext4|xfs" } / node_filesystem_size_bytes{mountpoint= "/" ,fstype=~ "ext4|xfs" } * 100) |