用Grafana模板变量动态切换主机,核心是定义Query类型变量host并用instance=~"$host"在PromQL中正则引用;需确保label_values查询与指标instance标签格式一致,勾选Multiselect和On Time Range Change,并通过Query Inspector验证替换结果。
用 Grafana 模板变量动态切换主机,核心是定义一个能自动获取主机列表的 Query 类型变量,并在所有面板的 PromQL 中用正则语法引用它。操作不复杂,但关键细节容易出错。
定义主机变量(Query 类型)
进入 Dashboard 设置 → Variables → Add variable:
- Type 选 Query
- Name 填 host(小写+下划线,避免特殊字符)
- Data source 选你的 Prometheus 实例
- Query 填:label_values(node_cpu_seconds_total, instance)
- Regex(可选)填:/([^:]+)(?::d+)?/ —— 自动剥离端口,如
10.0.0.1:9100 → 10.0.0.1
- 勾选 Multiselect 和 Include All option,All 显示名建议设为 All Hosts
- Refresh 设为 On Time Range Change,确保时间范围变动时刷新主机列表
在面板中安全引用变量
所有面板的 PromQL 必须使用正则匹配语法,不能用等号:
- ✅ 正确写法:node_load1{instance=~"$host"}
- ✅ 多选或选 All 时也生效:Grafana 自动展开为
instance=~"host1|host2|host3" 或 instance=~".*"
- ❌ 错误写法:
instance="$host" —— 选 All 时变成 instance="all",Prometheus 报错
- 若需排除某些主机,可在 PromQL 中叠加条件,例如:
node_load1{instance=~"$host", job!="backup"}
验证与调试要点
变量配置后常出现“有下拉框但图表无数据”,多数因三处不一致:
- 先在 Prometheus 表达式浏览器执行 count by (instance) (node_cpu_seconds_total),确认该 label 真实存在且值非空
- 检查变量 Query 返回的值,是否和指标中
instance 标签的格式完全一致(大小写、下划线、有无端口)
- 打开面板的 Query Inspector,看实际发出的 PromQL 是什么——确认
$host 是否被正确替换,有无多余空格或引号
进阶:按分组或角色再过滤
如果主机还带环境或角色标签(如 env="prod"、role="db"),可再建对应变量:
- 新增变量 env,Query:label_values(node_cpu_seconds_total, env)
- 面板 PromQL 改为:node_load1{instance=~"$host", env=~"$env"}
- 多个变量会自动组合过滤,无需额外逻辑