【问题标题】:Does the rate function really give average over time in prometheus?速率函数真的在普罗米修斯中给出平均值吗?
【发布时间】:2019-01-15 21:30:01
【问题描述】:

速率函数真的能给出一段时间内的平均值吗?

我通过

向端点发送 20 个请求

ab -n 20 http://0.0.0.0:8001/

Snapshot

所以,我使用 rate 函数的指标超过 20 秒,所以它应该给我 1 个值,因为在过去 20 秒内有 20 个请求。

所以20 / 20 = 1 但它提供了值2

我相信两者之间没有关系 scrape_intervalevaluation_interval 对于结果,我的两个间隔都是 10s

【问题讨论】:

    标签: prometheus promql


    【解决方案1】:

    如果您的抓取间隔是 10 秒,那么这是预期的。其工作方式是 Prometheus 在您的 20 秒间隔内获取 2 个样本(因为它们相隔 10 秒),计算差异 (20),将其外推到整个间隔 (40),然后除以间隔的长度 ( 20) 所以你得到 2。

    我也不喜欢 I've been advocating 以获得更好的 rate 实现,它查看范围之前的最后一个样本和范围中的最后一个样本(所以你会在 20 秒内增加 20您的情况,而不是在 10 秒内增加 20 或可能在 10 秒内增加 0,具体取决于您何时查询)。但到目前为止,这一切都没有发生。所以至少现在,欢迎加入俱乐部。

    对付 Prometheus 实现的一种非常老套的方法是对其进行逆向工程。例如。在您的情况下,将为您提供超过 20 秒的实际速率的表达式是:

    rate(hello_worlds_total[30s]) / 30 * 20
    

    即Prometheus 将速率超过 20 秒,将其推断为 30,然后您撤消该推断。但这需要您了解抓取间隔并进行数学运算以撤消 Prometheus 的推断。

    【讨论】:

    • 我喜欢你的 rate(hello_worlds_total[30s]) / 30 * 20,这真的很酷。现在我对我的问题感到满意,因为它给了我一段时间内的实际请求平均值。
    【解决方案2】:

    通常rate(m[d]) 返回counter m 在上一个时间间隔d 上的平均每秒变化率。但有时 Prometheus 可能会因为外推而从 rate() 函数返回意外结果。有关详细信息,请参阅this issue。一些与 Prometheus 兼容的查询引擎(例如 MetricsQL)尝试解决此问题 - 有关技术详情,请参阅 this commentthis article

    Prometheus 也将解决这个问题 - 请参阅 this design doc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2020-07-12
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多