【问题标题】:Do I understand Prometheus's rate vs increase functions correctly?我是否正确理解 Prometheus 的速率与增加函数?
【发布时间】:2019-06-26 21:50:17
【问题描述】:

我已经仔细阅读了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()
官方文件称:
"rate(v range-vector) : 计算范围向量中时间序列每秒平均增长率。"

通俗地说,这意味着我们将获得每秒的增量,而给定秒的值将是给定范围内的平均增量?

我的意思是:
rate(counter[1s]): 将匹配 ICH,因为将仅从一个值计算平均值。
rate(counter[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()
官方文件称:
“increase(v range-vector):计算范围向量中时间序列的增量。”

对我来说,这意味着它不会在秒数之间分配平均值,而是显示给定范围的单个增量(外推)。
increase(counter[1s]): 在我看来,这将与 ICH 和 1s 的速率匹配,因为总范围和速率的基本粒度匹配。
increase(counter[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

*在我看来,这些值是指每秒覆盖的外推值。

我理解得很好还是远非如此?

【问题讨论】:

  • 您对rate()increase() 的理解比PromQL 更接近MetricsQL

标签: prometheus


【解决方案1】:

**解释分析反方向的问题**

假设我们有

rate(some_metric_name_count [3m]) = 2

这意味着在该时间点之前的 3 分钟间隔内,该时间点计数器每秒增加 2,并且在 3 分钟之后,此计数器的增加量为 2*180(秒)= 360。

这也意味着在这种情况下:

increase(some_metric_name_count [3m]) ~ 360

引擎盖下有轻微的近似值,主要是针对第一个时间点,因此绝对误差可能为 2,这意味着:

increase(some_metric_name_count [3m]) = 360 +/- 2

涵盖 [358, 362] 的区间,包括区间的结束

【讨论】:

    【解决方案2】:

    在理想情况下(您的样本时间戳正好在第二个,而您的规则评估恰好在第二个发生)rate(counter[1s]) 将准确返回您的 ICH 值,rate(counter[5s]) 将返回该 ICH 的平均值和前 4. 除了第 1 秒的 ICH 是 0,而不是 1,因为没有人知道你的计数器什么时候为零:也许它就在那里增加,也许它昨天增加,从那时起一直保持在 1。 (这就是为什么当计数器第一次出现值为 1 时您不会看到增加的原因——因为您的代码刚刚创建并增加了它。)

    increase(counter[5s]) 正是 rate(counter[5s]) * 5(而increase(counter[2s]) 正是 rate(counter[2s]) * 2)。

    现在在现实世界中发生的情况是,您的样本并不是在每一秒都准确地收集,并且规则评估也不会在第二秒准确地发生。因此,如果您有一堆(或多或少)相隔 1 秒的样本,并且您使用 Prometheus 的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)。 IE。它实际上计算了大约 4 秒而不是 5 秒的增长率。​​p>

    increase(counter[5s]) 将返回(v5 - v1) / (t5 - t1) * 5,因此增加的速率大约为 4 秒,外推到 5 秒。

    由于样本的间距不精确,rateincrease 通常都会为整数计数器返回浮点值(这对于 rate 来说很有意义,但对于 increase 来说意义不大)。

    【讨论】:

    • 很好的答案,详细的例子。非常感谢,过去几个小时我一直在寻找这个。
    • 我认为 rate 也取平均值,即 rate 为 ( (v5 - v1) / (t5 - t1)) / 5。
    • (v5 - v1) / (t5 - t1) 已经是t1t5 之间每秒的平均增幅。例如。如果 t1 是 1 并且 t5 是 5; t1 的值为 1,t5 的值为 10(如上),则 (v5 - v1) / (t5 - t1)(10 - 1) / (5 - 1),即 2.25。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2020-04-29
    • 2011-05-05
    相关资源
    最近更新 更多