prometheus告警规则不支持直接引用shell环境变量,但可通过三种方式实现动态值注入:1.用node exporter textfile collector将环境变量转为指标;2.用envsubst预处理yaml模板;3.在alertmanager路由中基于标签匹配实现环境分流。

Prometheus 告警规则(.yml 文件)本身不支持直接引用 Shell 环境变量,因为它是静态 YAML 配置,由 Prometheus 解析加载,不经过 Shell 执行。但运维中常需动态注入值(如集群名、环境标识、阈值偏移量等),可通过以下三种可靠方式实现“类环境变量”效果:
1. 使用 Node Exporter 的 textfile collector 注入变量值
这是最常用、最安全的方案:把环境变量转成 Prometheus 可采集的指标。
- 在目标机器上创建脚本(如
/usr/local/bin/export-env.sh),内容类似:
#!/bin/bash
echo "node_env_info{env=\"${ENV:-prod}\",region=\"${REGION:-bj}\",cluster=\"${CLUSTER:-default}\"} 1" > /var/lib/node_exporter/textfile_collector/env.prom
- 确保该脚本在 Node Exporter 启动前运行,并加入 systemd 定时或启动依赖(如
ExecStartPre=) - Prometheus 即可通过
node_env_info标签动态过滤,例如在告警规则中写:expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90 and on(instance) node_env_info{env="prod"}
2. 在 Prometheus 启动时用 envsubst 预处理规则文件
适合 CI/CD 或配置管理场景,用 Shell 模板 + 替换生成最终规则文件。
- 准备模板文件
alert.rules.yml.tmpl,含占位符:alert: HighCpuUsage_{{ .ENV }}expr: ... > {{ .CPU_WARN_THRESHOLD }} - 部署时执行:
envsubst /etc/prometheus/rules.d/alert.rules.yml - 要求 Prometheus 服务启用
--web.enable-lifecycle,改完后curl -X POST http://localhost:9090/-/reload
3. Alertmanager 路由中使用标签匹配替代“环境变量”
Alertmanager 不解析环境变量,但可通过标签做路由决策,间接实现环境感知。
- 在 Prometheus 告警规则的
labels中硬编码或从指标派生环境标签:labels:<br> env: "{{ $labels.instance | regexReplaceAll \"^([^-]+)-.*\" \"$1\" }}"
(假设 instance 是prod-web-01:9100) - 在
alertmanager.yml的route中按env分流:- match:<br> env: "staging"<br> receiver: "slack-staging"
不推荐在 PromQL 表达式里硬写 IP 或主机名——应统一用标签和 relabel_configs 处理;也不建议用 exec 类函数调用外部命令,既不安全也破坏 Prometheus 的声明式设计原则。核心思路是:把“变量”变成可观测的标签或指标,而不是试图让 YAML 活起来。











