Prometheus 发出低于阈值的警报

Prometheus alerts with a value that is below the threshold

我们使用 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 高于阈值时才收到警报?

使用 '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