我正在我的 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])
自版本2.7(2019年1月)起,Prometheus支持子查询:
max_over_time( sum(node_memory_MemFree_bytes{instance=~"foobar.*"})[1d:1h] )
(过去 2 天的指标,分辨率为 1 小时。)
阅读文档以获取有关使用记录规则的更多信息:https://prometheus.io/docs/prometheus/latest/querying/examples/#subquery
但是,请注意博客推荐:
结语
虽然子查询非常方便地用来代替记录规则,但不必要地使用它们会对性能产生影响。为了提高效率,繁重的子查询最终应该转换为记录规则。
也不建议在记录规则中包含子查询。如果您确实需要在记录规则中使用子查询,请创建更多记录规则。
记录规则的使用在brian brazil文章中有解释: https://www.robustperception.io/composition-range-vector-functions-in-promql/
这在一个表达式中是不可能的,您需要对中间表达式使用记录规则。看 https://www.robustperception.io/composition-range-vector-functions-in-promql/