普罗米修斯 <aggregation>_over_time() 的集合?

aggregate of <aggregation>_over_time() in prometheus?

Prometheus 具有例如获取给定数据点范围的最大值或最小值或...请参阅 documentation for more info.

现在,当我需要 min(data) 和 max(data) 以及 avg 时,...我需要发送单独的请求。我怎样才能在一个查询中实现这一点?

[更新]

从Brian的回复中我看出我的问题不够明确,所以我改一下:

我有一个以 15 秒为间隔一天的时间序列 "temperature"。 我想要每个小时(或最后一个小时,并不重要) min/max/avg/stddev, ...

使用 *_over_time() 函数,我需要为每个 min/max/avg/...(以及正确的时间间隔)发送一个查询。有没有一种方法可以在一个查询中这样做(所以基本上返回一个包含 min/max/avg/... 的 k-v-pairs 的散列)?

min(min_over_time(metric[1h])) 会让你这样做。

[更新]

最好为每个要计算的函数发送一个查询。您可以通过技巧将其合而为一,但它会更加复杂且难以维护。

label_replace function and or operator 的帮助下,可以在单个查询中执行多个 PromQL 查询。 label_replace 函数用于为每个 *_over_time() 结果赋予不同的名称,而 or 运算符用于将多个 *_over_time() 结果组合成一个响应。

例如,以下查询 returns minmaxavg 过去一小时的 temperature 时间序列的值:

label_replace(min_over_time(temperature[1h]), "__name__", "min", "", ".*")
  or
label_replace(max_over_time(temperature[1h]), "__name__", "max", "", ".*")
  or
label_replace(avg_over_time(temperature[1h]), "__name__", "avg", "", ".*")

P.S。此查询可以简化为更小的 MetricsQL query via rollup 函数:

rollup(temperature[1h])

如果必须计算 minmaxavg 以外的结果,则可以使用 aggr_over_time 函数。例如,以下查询计算过去一小时内 temperaturemedianminmax

aggr_over_time(
  ("median_over_time", "min_over_time", "max_over_time"), 
  temperature[1h]
)

此外,MetricsQL 提供了 alias and label_set 函数,当必须将名称或标签设置为特定值时,这些函数可能比 label_replace() 更易于使用。例如,以下 MetricsQL 查询等同于上面的 PromQL 查询:

alias(min_over_time(temperature[1h]), "min")
  or
alias(max_over_time(temperature[1h]), "max")
  or
alias(avg_over_time(temperature[1h]), "avg")

MetricsQL 还支持 union 函数,当必须将多个查询结果合并为一个响应时,可以使用该函数代替 or 运算符:

union(
  alias(min_over_time(temperature[1h]), "min"),
  alias(max_over_time(temperature[1h]), "max"),
  alias(avg_over_time(temperature[1h]), "avg"),
)