使用普罗米修斯计算最大值

Calculate Max in value with prometheus

由于我是prometheus-newbie不知道怎么表达这个问题: “过去一天每秒处理的最大消息数是多少”。该指标名为 messages_in_total

我试过了

我真正需要的是(伪代码)

1.) 将包含绝对值 messages_in_total 的范围向量转换为具有每秒值的范围向量。

2.) 充分利用它

示例:

有什么想法吗?

有可能。

示例查询:

max_over_time(
   irate( messages_in_total[2m] )[1d:1m]
)

这将:

  1. 过去 1 天
  2. 在 1 天范围内每 1 分钟执行一次 irate( messages_in_total[2m] )
  3. 将其合并到范围向量中
  4. 对所有结果调用 max_over_time

有关详细信息,请参阅 subquery documentation

虽然 return 是 messages_in_total 指标在过去 24 小时内的最大 per-second 速率,但它存在以下潜在问题:

  • 如果它们之间的间隔(aka scrape_interval)小于一分钟,它可能会跳过一部分原始样本。这可以通过减少冒号后方括号中的 step 值来解决,因此它不会超过 scrape_interval.
  • 如果抓取间隔超过2m(例如2分钟),可能return结果为空或结果不完整。这可以通过将内部方括号中的 lookbehind window 从 2m 增加到超过 2x scrape_interval.
  • 的值来解决
  • 由于 subquery 的开销,它可能会变得非常慢并且需要资源。
  • 子查询很容易mis-use,所以它们会默默地return出乎意料的结果。

虽然 Prometheus 没有为这些问题提供可靠且易于使用的解决方案,但其他 Prometheus-like 系统可能有解决方案。例如,以下 MetricsQL 查询 returns 过去 24 小时 messages_in_total 时间序列的最大值、最小值和平均值 per-second 增长率:

rollup_rate(messages_in_total[1d])

它使用了rollup_rate函数。 如果您只需要最大 per-second 速率,则可以将查询包装到 label_match 函数中,只留下带有 rollup="max" 标签的时间序列:

label_match(
  rollup_rate(messages_in_total[1d]),
  "rollup", "max"
)