我在 kubernetes 群集中运行 prometheus 。 我在kubernetes中有以下系统:
我有4个节点。我想计算空闲记忆。我希望得到这四个节点的总和。然后我想找到超过1天的最大值。所以,例如,
时间= t1 node1:500 MB node2:600 MB node3:200 MB node4:300 MB 总计= 1700 MB
时间= t2 node1:400 MB node2:700 MB node3:100 MB node4:200 MB 总计= 1300 MB
时间= t3 node1:600 MB node2:800 MB node3:1200 MB node4:1300 MB 总计= 3900 MB
时间= t4 node1:100 MB node2:200 MB node3:300 MB node4:400 MB 总计= 1000 MB
所以,我的查询答案应该是3900 MB。我无法为总和做max_over_time。
我这样做了(根本不起作用):
max_over_time(sum(node_memory_MemFree)[2m])
答案 0 :(得分:1)
在一个表达式中,这是不可能的,您需要为中间表达式使用录制规则。看到 https://www.robustperception.io/composing-range-vector-functions-in-promql/
答案 1 :(得分:0)
Since 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巴西的文章中进行了解释: https://www.robustperception.io/composing-range-vector-functions-in-promql/