如何在Prometheus中基于目标标签设置告警阈值变量?
解决Prometheus告警阈值从主机标签获取的问题
核心限制说明
Prometheus告警规则的expr无法直接引用服务发现阶段的主机目标标签,只能基于指标自身携带的标签进行计算。要实现按主机标签设置阈值,关键是把主机标签同步到指标的标签集合中。
方案一:通过Relabel将主机标签附加到指标
无需修改导出器,在Prometheus的scrape_configs中配置relabel规则,把主机的阈值标签(比如mem_ram_crit)复制到采集到的指标上:
- 在主机目标定义中添加阈值标签:
- targets: - 'test-02' labels: project: 'TEST' asset_name: 'test-02' asset_id: '4567' enviroment: 'N2' location: 'test' inheritance: 'child' mem_ram_crit: '80' # 新增阈值标签,值按主机需求调整
- 在对应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
- 修改告警规则,使用指标上的阈值标签计算:
- 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预计算结果,再基于结果告警:
- 配置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
- 告警规则直接引用预计算指标:
- alert: Memory critical expr: memory_usage_vs_crit == 1
为什么之前的$变量方式无效
Prometheus告警规则语法中,$开头的变量仅支持控制台查询类的模板变量,并不支持直接引用服务发现的主机标签,因此这种写法无法生效。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

