You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Prometheus中能否对比不同时间序列?如何实现除法阈值告警?

在Prometheus中实现时间序列对比与告警

没问题!Prometheus的PromQL完全支持时间序列之间的算术运算,刚好能实现你要的对比和告警需求,我一步步给你讲怎么弄:

1. 构建核心PromQL查询

你需要将第二个指标(内存请求值)除以第一个指标(实际内存使用值),并判断结果是否小于1。这里要注意标签匹配——因为两个指标的标签可能不完全一致,需要明确指定匹配的标签(比如podcontainer_name),确保对应的容器数据能正确关联:

# 计算请求内存与实际使用内存的比值
kube_pod_container_resource_requests_memory_bytes{container_name="documentation"} 
/ on(pod, container_name) 
container_memory_usage_bytes{container_name="documentation"}

如果要直接用于告警触发,就加上小于1的判断:

(kube_pod_container_resource_requests_memory_bytes{container_name="documentation"} 
/ on(pod, container_name) 
container_memory_usage_bytes{container_name="documentation"}) < 1

小提示:这个表达式的含义是「内存请求值 ÷ 实际使用值 < 1」,也就是实际内存使用已经超过了请求的配额——如果这正是你要告警的场景,这个表达式就完全符合需求。

2. 编写告警规则

把上面的查询整合到Prometheus的告警规则配置文件中(通常是类似alert_rules.yml的文件),配置告警的触发条件、级别和描述:

groups:
- name: container_memory_alerts
  rules:
  - alert: ContainerMemoryUsageExceedsRequest
    # 核心告警表达式
    expr: (kube_pod_container_resource_requests_memory_bytes{container_name="documentation"} / on(pod, container_name) container_memory_usage_bytes{container_name="documentation"}) < 1
    # 持续2分钟触发,避免瞬时波动导致误告警
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "容器内存使用超过请求配额({{ $labels.container_name }})"
      description: "Pod {{ $labels.pod }}(命名空间{{ $labels.namespace }})的内存请求值与实际使用的比值小于1,说明实际内存消耗已超出申请的配额。"

3. 关键注意事项

  • 标签匹配:如果不指定on(pod, container_name),Prometheus会尝试匹配所有标签,可能因为额外标签(比如node_name)不一致导致无法关联两个序列,返回空结果。
  • 指标存在性:确保两个指标都能正常采集到对应的时间序列,如果某个容器的指标缺失,除法运算会返回空,不会触发告警。
  • 告警抑制:如果有多个同名容器,这个规则会为每个符合条件的Pod生成独立告警,你可以根据需求添加标签或抑制规则来优化告警数量。

内容的提问来源于stack exchange,提问作者Suhas Chikkanna

火山引擎 最新活动