在 Prometheus 中计算 sum 函数随时间变化的最大值

Posted

技术标签:

【中文标题】在 Prometheus 中计算 sum 函数随时间变化的最大值【英文标题】:Calculate Max over time on sum function in Prometheus 【发布时间】:2017-12-17 14:38:20 【问题描述】:

我在我的 kubernetes 集群中运行 prometheus。 我在 Kubernetes 中有以下系统:

我有 4 个节点。我想计算空闲内存。我想要这四个节点的总和。然后我想找到超过 1 天的最大值。所以,例如,

在时间=t1 节点 1:500 MB 节点2:600 MB 节点 3:200 MB 节点4:300 MB 总计 = 1700 MB

在时间=t2 节点 1:400 MB 节点 2:700 MB 节点 3:100 MB 节点4:200 MB 总计 = 1300 MB

在时间=t3 节点1:600 MB 节点2:800 MB 节点 3:1200 MB 节点4:1300 MB 总计 = 3900 MB

在时间=t4 节点1:100 MB 节点2:200 MB 节点 3:300 MB 节点4:400 MB 总计 = 1000 MB

所以,我的查询的答案应该是 3900 MB。我无法为总和做 max_over_time。

我已经这样做了(根本不工作):

max_over_time(sum(node_memory_MemFree)[2m])

【问题讨论】:

【参考方案1】:

Since 2.7 版(2019 年 1 月),Prometheus 支持子查询:

max_over_time( sum(node_memory_MemFree_bytesinstance=~"foobar.*")[1d:1h] )

(过去 2 天的指标,分辨率为 1 小时。)

阅读文档以获取有关使用录制规则的更多信息:https://prometheus.io/docs/prometheus/latest/querying/examples/#subquery

但是,请注意博客推荐:

结语

虽然使用子查询代替记录规则非常方便,但不必要地使用它们会影响性能。繁重的子查询最终应该转换为记录规则以提高效率。

也不建议在记录规则中包含子查询。如果您确实需要在记录规则中使用子查询,请创建更多记录规则。

brian brazil 文章中解释了记录规则的使用: https://www.robustperception.io/composing-range-vector-functions-in-promql/

【讨论】:

【参考方案2】:

这在一个表达式中是不可能的,您需要为中间表达式使用记录规则。看 https://www.robustperception.io/composing-range-vector-functions-in-promql/

【讨论】:

有可能since Prometheus 2.7,使用子查询。

以上是关于在 Prometheus 中计算 sum 函数随时间变化的最大值的主要内容,如果未能解决你的问题,请参考以下文章

prometheus grafana sql 常用函数参数

使用 prometheus 计算 k8s 集群 cpu/内存使用情况

Prometheus技术分享——prometheus的函数与计算公式详解

第八讲:prometheus命令行使用扩展

Prometheus query_range 函数无法正常工作

使用 $__interval 在 grafana 中进行 Prometheus 查询