我们使用Prometheus警报(和节点导出器)来检查节点上的内存是否耗尽。
问题:在许多情况下,我得到的警报中的$ value低于表达式中的阈值。
表达式是:
alert: GettingOutOfMemory
expr: max(sum
by(instance) ((((node_memory_MemTotal_bytes) - (node_memory_MemFree_bytes + node_memory_Buffers_bytes
+ node_memory_Cached_bytes)) / (node_memory_MemTotal_bytes)) * 100)) >= 90
for: 5m
labels:
severity: warning
annotations:
description: Docker Swarm node {{ $labels.instance }} memory usage is at {{ humanize $value}}%.
summary: Memory is getting low for Swarm node '{{ $labels.node_name }}'
我收到消息说我们的内存不足,例如83%。这就是$ value的值。这显然低于90%的门槛。
即使$ value低于阈值,为什么仍会收到此警报?
如何修复此Prometheus警报规则,以便仅在$ value高于阈值时才收到警报?
答案 0 :(得分:0)
该问题将由使用'max'引起。
下面给出了一个更好的查询:
- alert: high_memory_load
expr: ((1-(node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes))*100) > 85
for: 30s
labels:
severity: warning
annotations:
summary: "Server memory is almost full"
description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}."
替代方法是:
expr: ((1-((node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes)/node_memory_MemTotal_bytes))*100)>85