Grafana 中如何设置变量模板,实现一次配置看多环境对比
解读
国内性能测试面试里,这道题表面问“变量模板怎么建”,实则考察候选人是否具备“把一次压测结果在多环境间横向对比”的工程化思维。
面试官想听到的不只是“点开 Setting→Variables→New”,而是:
- 变量命名与标签设计是否能让业务、开发、运维一眼看懂;
- 是否能把 Prometheus、Loki、VictoriaMetrics 等国内主流数据源一次打通;
- 是否知道在“多集群、多 DC、多 K8s 命名空间”这种真实场景下,用变量把 metrics、log、trace 串联起来;
- 是否预留了“灰度”“蓝绿”等扩展位,方便后续版本直接复用。
答不到“对比”这一层,只会建个下拉框,基本会被判为“只用过 Demo”。
知识点
- Grafana 变量类型:Query、Custom、Text box、Constant、Interval、Ad hoc filters、Chain variable(级联)。
- Prometheus 标签约定:name、job、instance、env、cluster、namespace、dc、role。
- 变量查询语句:label_values(prometheus_http_requests_total, env) 与正则过滤 | 过滤空值。
- Multi-value、Include All、All 选项自定义别名、Enable tags 与 group tags。
- 数据源变量:使用“datasource”类型,把 Prometheus-BJ、Prometheus-SH、Prometheus-AWS 统一拉通。
- 面板重复(Repeat by variable)与 Row 重复,实现“一次配置,N 个环境自动复制”。
- 变量在 Query、Legend、Panel title、Link、Alert 中的四种插值语法:{var:raw}、{var:regex}。
- 国内混合云常见坑:
- 不同环境标签大小写不一致(env=prod 与 ENV=Prod);
- 部分旧系统没有 env 标签,需要 recording rule 统一注入;
- 专线延迟导致 Prometheus 抓取时间戳不齐,需要 $__rate_interval 自动对齐。
- 性能测试特有指标:并发线程数、Tps、Rt、Error%、Cpu、Heap、GcTime、KafkaLag、RedisQps。
- 权限与隔离:通过 Grafana RBAC + folder 权限,实现“测试组能看到压测环境,开发只能看 Dev”。
答案
以一次“三环境对比”为例,给出可直接落地的七步配置:
- 建 Dashboard,Setting→General→Name 改为“Order-Svc 压测多环境对比”。
- 新建变量“datasource”,Type 选 Datasource,Plugin ID 选 Prometheus,Multi-value 开,Include All 开;这样下拉框里会出现 Prometheus-Dev、Prometheus-Staging、Prometheus-Prod 三个数据源。
- 新建变量“env”,Type 选 Query,DataSource 选刚才的 / 去掉空值;Multi-value 与 Include All 全开。
- 新建变量“cluster”,Type 选 Query,Query 填 label_values(tps_order_total{env=~"$env"}, cluster),实现“先选环境、再选集群”的级联。
- 在面板 Query 里写:
sum(rate(tps_order_total{env=~"cluster"}[$__rate_interval])) by (env)
Legend 用 {{env}}-{{cluster}} 区分。 - 打开 Panel 的“Repeat by variable”,选 env;这样一行面板会自动复制出 Dev、Staging、Prod 三列,横向对比一目了然。
- 保存后,把 URL 里的 var-env=All 发给开发,对方打开后只需切换顶部下拉框,就能在 3 秒内看到任何时间段的“三环境 Tps、Rt、Error%”叠加曲线,无需再建三套 Dashboard。
补充:如果还要对比“版本”,再加一个变量“version”,Query 写 label_values(build_info{env=~"$env"}, version),然后在 Legend 里用 {{env}}-{{version}},就能在发布当天直接量化“V1.2.3 比 V1.2.2 Tps 提升 18%,Rt 下降 12ms”。
拓展思考
- 如果公司用了夜莺(Nightingale)或 VictoriaMetrics 集群,变量查询语法不变,但数据源要换成“VictoriaMetrics-Cluster”,且注意 vmselect 的 Tenancy 参数,否则会出现跨租户数据穿透。
- 当环境数量>10 时,下拉框会变得冗长,可以把 env 变量改成“Text box”+自动补全,或者使用 Ad hoc filters,让面试官看到你具备“大规模场景下的可用性设计”能力。
- 压测过程中常需要“临时加一台灰度机”,可以在变量里预留“gray_ip”正则占位,配合 Grafana 的“__user”内置变量,实现“谁压测、谁填 IP、谁看曲线”,避免永久写到 Prometheus 标签里造成基数爆炸。
- 最终输出不只是“看图”,而是把变量模板固化到 Helm Chart 里,随应用版本一起发布;下次上线时,开发只需 helm upgrade,Dashboard 自动感知新标签,真正实现“一次配置,终身对比”。