深入理解Prometheus: rate irate increase
liebian365 2024-11-14 18:05 27 浏览 0 评论
在上一篇《深入理解Prometheus: metric type》已经介绍了Counter类型,其值只会上升,它表示累积的总计数,例如“我们总共处理了多少请求?”或“我们花了多少秒处理请求?”。由于计数器的值取决于跟踪和公开它的进程的初始(重新)启动时间,因此计数器的绝对值几乎没有用处。因此,在用计数器绘制图形或做任何其他事情之前,您通常希望将其包装在类似rate(),的函数中irate(),或者increase()查看计数器上升的速度。这三个函数的确切行为经常引起混淆,因此在这篇文章中,我们将详细介绍它们中的每一个,以及它们如何处理计数器重置并进行数据推理获得最终值。
概述
以下是计算计数器增长率的三个函数之间差异的概述:
- rate():计算每秒的增长率,在整个提供的时间窗口内平均。示例:rate(http_requests_total[5m])在 5 分钟的时间窗口内产生每秒 HTTP 请求的平均速率。这个函数是最常见的,因为它产生了一个很好的平滑速率和一个可预测的每秒输出单位。
- irate()("instant rate"):计算每秒的增长率,就像计算一样rate(),但只考虑在提供的时间窗口下的最后两个样本进行计算,并忽略所有较早的样本。示例:irate(http_requests_total[5m])查看提供的 5 分钟窗口下的最后两个样本,并计算它们之间的每秒增长率。如果您想使放大的图表显示对速率变化的快速响应,此功能会很有帮助,但输出会比 for 更加尖锐。
- increase(): 这个函数完全等同于,rate()除了它不将最终单位转换为“每秒”( 1/s)。相反,最终的输出单元是每个提供的时间窗口。示例:increase(http_requests_total[5m])产生在 5 分钟窗口内处理的 HTTP 请求的总增加量(单位:1 / 5m)。因此increase(foo[5m]) / (5 * 60)100% 等价于rate(foo[5m])。
所有三个函数都要求在提供的范围窗口下至少需要两个样本才能工作。窗口下少于两个样本的系列会简单地从结果中删除。在给定固定时间窗口和落在该窗口下的一些数据点的情况下,如何准确计算增加是一个权衡和不完美近似的问题。Prometheus 选择的方法旨在平均提供最正确的答案,仅考虑提供的窗口下的有限数据。让我们更详细地看看它是如何做到的:
数据推算(拟合)
经常让人们感到困惑的是rate()和increase()函数的推算行为。例如,即使对于只有整数增量的计数器,increase()也可以返回非整数结果2.5883。原因是它试图在指定时间窗口的总持续时间(例如 5 分钟)内尝试近似计数器的增加。但实际上,在时间窗口下找到的第一个和最后一个样本永远不会 100% 与提供的时间窗口的开始和结束重合。因此increase(foo[5m]) 将窗口下的第一个和最后一个数据点之间的斜率延伸到窗口边界,以得出一个平均接近整个窗口的预期增加的值(实际上在窗口边界处确实有样本)。
下图显示了一个使用rate() 1 分钟窗口和间隔 15 秒的样本的示例,在窗口下方发生了一个实际计数器增加1:
如图所示,结果基于窗口下第一个和最后一个样本之间的斜率并推测到窗口边界。
注意:这种行为有一些例外:当一个系列看起来像是在提供的时间窗口内开始或结束时,我们不希望在系列终止的方向上推测太远。rate()和increase()预测第一个或最后一个样本距离其各自窗口边界的距离超过窗口下样本之间的平均间隔的 1.1 倍时停止。在这种情况下,推测仅向窗口边界延伸平均采样间隔的一半,而不是一直延伸。类似地,这些函数避免推测到负值,因为计数器总是从0并且永远不会是负面的。
由于irate()实际上只查看两个样本之间的每秒增加量,因此它不会进行任何这种推测。
计数器重置
尽管计数器通常只会上升,但它们会0在跟踪它们的进程重新启动时重置。为了不将这些重置解释为实际的负利率,与计数器相关的函数具有检测和处理这些重置的逻辑:在提供的时间窗口下迭代样本时,函数检查是否有任何样本的值低于前一个,并将这种情况解释为计数器重置。使用计数器总是在复位后开始的进一步假设0,这些函数然后只是将新的样本值添加到先前看到的样本值,以补偿复位。
以下示例图显示了rate()计算如何处理在提供的窗口下发生的计数器重置。您可以将其想象为rate()从底层的“真实”样本创建一组“虚拟”样本。然后根据虚拟样本计算最终速率,就好像从未发生过重置一样:
注意:每当计数器重置时,它有可能在Prometheus 上次抓取之后但在重置之前递增。Prometheus 永远失去了这些增量,并且无法将它们取回。为了最大限度地减少这种影响,重置应该只偶尔发生一次,并且比 Prometheus 抓取目标的频率要低得多。
rate vs irate
rate() Source code
//promql/functions.go
// FunctionCalls is a list of all functions supported by PromQL, including their types.
var FunctionCalls = map[string]FunctionCall{
......
"rate": funcRate,
}
// === rate(node parser.ValueTypeMatrix) Vector ===
func funcRate(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
return extrapolatedRate(vals, args, enh, true, true)
}
func extrapolatedRate(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper, isCounter bool, isRate bool) Vector {
ms := args[0].(*parser.MatrixSelector)
var (
samples = vals[0].(Matrix)[0]
lastValue float64
)
for _, sample := range samples.Points {
......
lastValue = sample.V
}
resultValue := lastValue - samples.Points[0].V
if isRate {
resultValue = resultValue / ms.Range.Seconds()
}
......
}
irate() Source code
//promql/functions.go
// FunctionCalls is a list of all functions supported by PromQL, including their types.
var FunctionCalls = map[string]FunctionCall{
......
"irate": funcIrate,
}
// === irate(node parser.ValueTypeMatrix) Vector ===
func funcIrate(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
return instantValue(vals, enh.out, true)
}
func instantValue(vals []parser.Value, out Vector, isRate bool) Vector {
samples := vals[0].(Matrix)[0]
lastSample := samples.Points[len(samples.Points)-1] // The last point
previousSample := samples.Points[len(samples.Points)-2] // The previous point
var resultValue float64
if isRate && lastSample.V < previousSample.V {
// Counter reset.
resultValue = lastSample.V
} else {
resultValue = lastSample.V - previousSample.V
}
sampledInterval := lastSample.T - previousSample.T
if isRate {
// Convert to per-second.
resultValue /= float64(sampledInterval) / 1000
}
}
irate should only be used when graphing volatile, fast-moving counters. Use rate for alerts and slow-moving counters.
rate should only be used with counters. It is best suited for alerting, and for graphing of slow-moving counters.
- rate Calculate... Within a specified time range : The incremental / Time range ;
- irate Calculate... Within a specified time range : The increment of the last two points / The time difference between the last two points ;
- irate Suitable for calculating rapidly changing counter, It can reflect counter Rapid changes in ;
- rate Suitable for calculating slowly changing counter, It flattens the peak with an average ( Long tail effect );
Obviously, the difference between rate() and irate() basically vanish when the range interval gets sufficiently small. If your range interval for rate() only includes two metric points, it's just the same as irate(). However, it's easier to make irate() reliable at small range intervals; if you use rate(), it may be chancy to insure that your range interval always has two and only two points. irate() automatically arranges that for you by how it works.
Often when we use either rate() or irate(), we want to graph the result. Graphing means moving through time with query steps and that means we get into interactions between the query step and both the range interval and the function you're using.
In particular, as the query step grows large enough, irate() will miss increasingly large amounts of changes. This is because it is the instant rate of change at the end of your range interval (using the two last metric points). When the query steps include more than two points in each interval, you lose the information from those extra points. As an extreme example, imagine a query step of five minutes and a metric that updates every thirty seconds. If you use irate(), you're only seeing the last minute out of every five minute slice of time; you have no idea of what happened in the other four minutes, including if there was an activity spike in them. If you use rate() instead, you can at least have some visibility into the total changes across those five minutes even if you don't capture any short term activity spikes.
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)