我已阅读Prometheus documentation仔细,但它有点仍不清楚我的,所以我在这里得到关于我的理解确认。
(请注意,为了避免出现最简单的示例,我没有将一秒钟的废品间隔时间范围用于时间范围-即使实际上不可能这样做)
尽管我们每秒都废弃一个计数器,但该计数器的值目前为30。我们对下面的时间序列:
second counter_value increase calculated by hand(call it ICH from now)
1 1 1
2 3 2
3 6 3
4 7 1
5 10 3
6 14 4
7 17 3
8 21 4
9 25 4
10 30 5
我们要对该数据集进行一些查询。
1.rate()
官方文件指出:
“速率(V范围矢量):计算在范围矢量的时间序列的增加的每秒平均速率”
随着通俗地说,这意味着我们将获得每秒的增加和在给定范围内给予第二将平均增加值?
这是我的意思:
的 率(计数器[1S]): 将匹配ICH因为平均将只从一个值来计算
的 率(计数器[2S]): 将得到的增量的平均在2秒和秒之间分配它
因此,在第一2秒我们得到总3的增量,这意味着平均为1.5 /秒。
最终结果:
second result
1 1,5
2 1,5
3 2
4 2
5 3,5
6 3,5
7 3,5
8 3,5
9 4,5
10 4,5
rate(counter [5s]) :将从5秒内的增量中获取平均值并在几秒钟内分配它
与[2s]相同,但我们从5秒的总增量中计算平均值。
最终结果:
second result
1 2
2 2
3 2
4 2
5 2
6 4
7 4
8 4
9 4
10 4
因此时间范围越大,我们得到的结果越平滑。这些增加的总和将与实际计数器匹配。
2.increase()
官方文件规定:
“增加(V范围矢量):计算在范围矢量的时间序列的增加。”
对我来说,这意味着它不会分配平均秒之间,而是会显示给定的范围内(外推)的单增量。
的 增加(计数器[1S]): 以我来看,这将匹配,与ICH和1秒的速率,仅仅因为总范围和速率的基础granuality匹配<无线电通信/>
的 增加(计数器[2S]): 首先2秒给了我们3总的增量,所以
2.seconds将得到3的值,依此类推。
second result
1 3*
2 3
3 4*
4 4
5 7*
6 7
7 7*
8 7
9 9*
10 9
*在我的条件这些值是指外推值,以覆盖每一秒。
我是否了解得很清楚?
答案 0 :(得分:2)
在理想世界中(样本的时间戳记恰好在第二个,规则评估恰好在第二个发生)rate(counter[1s])
将精确返回您的ICH值,rate(counter[5s])
将返回平均值ICH和前一个4。除了在第二个ICH处的ICH是0,而不是1,因为没人知道您的计数器何时为零:也许它在那儿增加,也许它在昨天增加了,从那以后一直保持在1。 (这就是为什么你不会看到增加了第一时间的计数器显示为1的值的原因 - 因为你的代码刚刚创建和增加它)
increase(counter[5s])
恰好是rate(counter[5s]) * 5
(而increase(counter[2s])
恰好是rate(counter[2s]) * 2
)。
现在,在现实世界中发生的事情是,您的样本并非在一秒钟内准确地收集到一秒,规则评估也并非在一秒钟内准确地进行。所以,如果你有一个是(或多或少)一堆样品间隔1秒,并且使用普罗米修斯rate(counter[1s])
,你将得不到任何输出。这是因为Prometheus要做的是将所有采样都放在1秒范围内的[now() - 1s, now()]
(在大多数情况下,这将是单个采样),试图计算出速率,然后失败。
如果您查询rate(counter[5s])
OTOH,Prometheus将选择[now() - 5s, now]
范围内的所有样本(5个样本,平均大约需要4秒钟,说[t1, v1], [t2, v2], [t3, v3], [t4, v4], [t5, v5]
),并且(假设您的计数器在间隔内未重置)将返回(v5 - v1) / (t5 - t1)
。即它实际计算增加了的速率〜4S而非5S
increase(counter[5s])
将返回(v5 - v1) / (t5 - t1) * 5
,因此,在大约4秒内的增加速率被推断为5秒。
由于样本之间的间距不正确,rate
和increase
都通常会返回整数计数器的浮点值(这对rate
来说很有意义,但对于浮点数而言却没有那么多increase
。