You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prometheus中基于目标标签设置告警阈值变量?

解决Prometheus告警阈值从主机标签获取的问题

核心限制说明

Prometheus告警规则的expr无法直接引用服务发现阶段的主机目标标签,只能基于指标自身携带的标签进行计算。要实现按主机标签设置阈值,关键是把主机标签同步到指标的标签集合中。

方案一:通过Relabel将主机标签附加到指标

无需修改导出器,在Prometheus的scrape_configs中配置relabel规则,把主机的阈值标签(比如mem_ram_crit)复制到采集到的指标上:

  1. 在主机目标定义中添加阈值标签:
- targets:
    - 'test-02'
  labels:
    project: 'TEST'
    asset_name: 'test-02'
    asset_id: '4567'
    enviroment: 'N2'
    location: 'test'
    inheritance: 'child'
    mem_ram_crit: '80' # 新增阈值标签,值按主机需求调整
  1. 在对应scrape job中添加relabel配置:
scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      # 上述主机目标定义放在此处
    relabel_configs:
      # 将主机标签mem_ram_crit复制到指标标签中
      - source_labels: [__meta_target_label_mem_ram_crit]
        target_label: mem_ram_crit
        action: replace
  1. 修改告警规则,使用指标上的阈值标签计算:
- alert: Memory critical
  expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < on(instance) group_left(mem_ram_crit) (node_memory_MemTotal_bytes * 0 + 1) * mem_ram_crit
  • 说明:(node_memory_MemTotal_bytes * 0 + 1) * mem_ram_crit 用于将字符串类型的标签值转换为数值;on(instance) group_left(mem_ram_crit) 确保每个主机实例匹配对应的阈值标签。

方案二:结合Recording Rule简化告警规则

如果需要复用阈值判断逻辑,可先通过Recording Rule预计算结果,再基于结果告警:

  1. 配置Recording Rule:
groups:
  - name: memory_precompute
    rules:
      - record: memory_usage_vs_crit
        expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < on(instance) group_left(mem_ram_crit) (node_memory_MemTotal_bytes * 0 + 1) * mem_ram_crit
  1. 告警规则直接引用预计算指标:
- alert: Memory critical
  expr: memory_usage_vs_crit == 1

为什么之前的$变量方式无效

Prometheus告警规则语法中,$开头的变量仅支持控制台查询类的模板变量,并不支持直接引用服务发现的主机标签,因此这种写法无法生效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:03:42