Prometheus源码分析-increa()函数踩坑记
Counter采集过来的整数数据increa后出现⼩数点的数据
情况如下图所⽰:
increa(jvm_gc_pau_conds_count[5m])在Grafana Explore中查询出来的数据存在⼩数点,什么⿁,increa难道不是两个数据的差值吗,两个整数相减为什么会有⼩数点呢这你让我怎么跟leader交代。。。
乡愁作者查询SQL:
increa(jvm_gc_pau_conds_count{instance="$instance", application="$application"}[5m])
increa()函数实现的源代码分析:
在源码⾥就找到了⼀个extrapolatedRate()的函数
源码中的注释
extrapolatedRate is a utility function for rate/increa/delta.
意思是这rate/increa/delta三种函数的公⽤实现函数。
代码中的变量解释尿白蛋白高是什么原因
肾积水的治疗方法
结合SQL和源码分析其中的变量的意思:
工会合理化建议resultValue:样本计算结果
durationToStart:第⼀个取样时间点到5分钟取值区间的边界起点的时间间隔
默的笔顺
durationToEnd:最后⼀个取样时间点到5分钟取样区间边界终点的时间间隔
sampledInterval:两个取样点时间点之间的时间间隔
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-RytKjbsY-1618565129872)(/img/bVbLKJv)] averageDurationBetweenSamples:取样点时间点时间平均间隔
extrapolationTreshold:取样时间点假定的取样时间区间,这⾥是假设的取样区间(通过以往的样本点时间区间乘以1.1来推算出⼀个假定的时间间隔)
extrapolateToInterval:取样时间点的时间区间
灭人欲
看到源码中有⼀⾏,发现开始increa()的结果确实resultValue就是两值相减
但是下⾯代码中还增加了⼀段外推算法来预判趋势
来看这⼀段
因为increa()的取值点间隔与真实的5m取样时间区间还是存在两个时间间隔的,也就是durationToStart和durationToEnd,⽽这两个时间间隔是在计算之外的,也就是说数据采集之间存在空⽩期,所以采集到的值只能算是⼀个低精度的近似值。Prometheus在这⾥使⽤了数学⾥的外推法(外推法:在数学⾥常⽤的数据精加⼯⽅法,通过以最近若⼲时期的平均值为基础,来计算预测期预期值,把低精度近似值加⼯到⾼精度的近似值的⼀种⽅法)假定在durationToStart和durationToEnd它就存在增量,⽤外推法减⼩每两个取样区间
的durationToStart和durationToEnd这两个空⽩期⾥的可能存在的增量的误差。劳动教案
如果空⽩期内真的存在增量,在这种情况下单纯的只靠取样点之差来构建曲线,数据并不准确的,所以设计团队通过将取样的差值乘以时间间隔之⽐来求得⼀个近似值:resultValue * (extrapolateToInterval / sampledInterval),但是如果不存在增量,那么结果可能有偏差,这个结果只能算作⼀个⾼精度的“近似值”。
Prometheus假定了⼀个区间averageDurationBetweenSamples * 1.1,判断这个空⽩期是否过⼤,如果过⼤则需要⼀个更⼤的数字来求得近似值,⽐如⼀种情况,在durationToStart和durationToEnd都⼩于外推推算时间间隔时,则间隔较⼩:durationToStart + durationToEnd + sampledInterval) / sampledInterval * resultValue取值;另⼀种情况,在durationToStart和durationToEnd都⼤于外推推算
时间间隔时,则间隔过⼤:(averageDurationBetweenSamples + sampledInterval) / sampledInterval * resultValue,这个值推算出来则可能⽐第⼀种情况更⼤。
吨和千克这个外推算法也是为什么会出现⼩数点和与真实值存在误差的原因。
就如下图为例,在两个取样区间零界点前后分别有⼀个durationToStart和durationToEnd,⽽这两个时间间隔实际上是increa()函数计算的的空⽩期。假定没有外推算法,increa()在这两个5分钟的取值区间内获取到的增量应该是总共是1+1=2,⽽真实增量则是1+2+1=4,在durationToStart和durationToEnd区间内值发⽣了变化(2到4)。所以如果只是单纯的把取样区间内,最后⼀个取样值减去第⼀个取样值是不准确的,⽆法计算到这个空⽩期内的增量的,所以需要外推法来做⼀个趋势的预判得出⼀个更⼤⼀点的近似精确的值,使得结果更加接近真实值。
不得不说不愧是⼤⽜团队,考虑到存在空⽩时间区间的误差,通过数学的外推法预算出⼀个近似值来弥补取值过程中的漏取来弥补图形不精确的问题,不过这也造成了⼀些其他的问题,总的来说Prometheus的强⼤时⽏庸置疑的,从它的设计到功能都⾮常巧妙,这⾥要说明的是,依据我个⼈的实际使⽤经验来看,Prometheus的采样的数据可能不是准确的值,是⼀个近似的精确值,各位在使⽤的时候还是得谨慎呀!
GitHub源码: