prometheus - 我是否正确理解普罗米修斯的速率与增加函数?

标签 prometheus

我已阅读 Prometheus documentation仔细,但对我来说仍然有点不清楚,所以我在这里确认我的理解。
(请注意,为了最简单的示例,我使用了 1 秒作为报废间隔、时间范围 - 即使在实践中不可能)
尽管我们每秒都报废一个计数器并且计数器的值现在是 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) :计算范围向量中时间序列的每秒平均增长率。”

用外行的话,这意味着我们将获得每秒的增量,并且给定秒的值将是给定范围内的平均增量?

这就是我的意思:
速率(计数器 [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

速率(计数器 [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.增加()
官方文件指出:
“增加(v 范围向量):计算范围向量中时间序列的增加。”
对我来说,这意味着它不会在秒之间分配平均值,而是会显示给定范围的单个增量(带外推)。
增加(计数器 [1s]):在我的术语中,这将与 ICH 和 1s 的速率匹配,只是因为总范围和速率的基本粒度匹配。
增加(计数器 [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(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) .即它实际上计算了大约 4 秒而不是 5 秒的增长率。
increase(counter[5s])将返回 (v5 - v1) / (t5 - t1) * 5 ,所以在 ~4 秒内的增加率,外推到 5 秒。

由于样本间隔不完全,rateincrease通常会返回整数计数器的浮点值(这对于 rate 很明显,但对于 increase 意义不大)。

关于prometheus - 我是否正确理解普罗米修斯的速率与增加函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54494394/

相关文章:

java - 如何使用prometheus java客户端监控请求和响应之间的时间跨度

kubernetes - 如何在 prometheus stable Helm Charts values.yaml 文件中添加 sidecar 容器?

grafana - 如何将一个变量的值映射到 Grafana 中的另一个变量?

kubernetes - 如何为数据源创建grafana configmap?

spring - 如何在Prometheus中公开webClient指标?

docker - docker : Host networking vs hostnames 中的 Prometheus node_exporter

devops - 无法重新加载 Prometheus 配置

prometheus - 如何用prometheus对网络流量跳跃异常进行报警?

prometheus - 使用正则表达式解析警报 "expr"时出错

time-series - Prometheus DB如何计算平均值