Grafana 中如何设置变量模板,实现一次配置看多环境对比

解读

国内性能测试面试里,这道题表面问“变量模板怎么建”,实则考察候选人是否具备“把一次压测结果在多环境间横向对比”的工程化思维。
面试官想听到的不只是“点开 Setting→Variables→New”,而是:

  1. 变量命名与标签设计是否能让业务、开发、运维一眼看懂;
  2. 是否能把 Prometheus、Loki、VictoriaMetrics 等国内主流数据源一次打通;
  3. 是否知道在“多集群、多 DC、多 K8s 命名空间”这种真实场景下,用变量把 metrics、log、trace 串联起来;
  4. 是否预留了“灰度”“蓝绿”等扩展位,方便后续版本直接复用。
    答不到“对比”这一层,只会建个下拉框,基本会被判为“只用过 Demo”。

知识点

  1. Grafana 变量类型:Query、Custom、Text box、Constant、Interval、Ad hoc filters、Chain variable(级联)。
  2. Prometheus 标签约定:name、job、instance、env、cluster、namespace、dc、role。
  3. 变量查询语句:label_values(prometheus_http_requests_total, env) 与正则过滤 | 过滤空值。
  4. Multi-value、Include All、All 选项自定义别名、Enable tags 与 group tags。
  5. 数据源变量:使用“datasource”类型,把 Prometheus-BJ、Prometheus-SH、Prometheus-AWS 统一拉通。
  6. 面板重复(Repeat by variable)与 Row 重复,实现“一次配置,N 个环境自动复制”。
  7. 变量在 Query、Legend、Panel title、Link、Alert 中的四种插值语法:varvar、{var:raw}、var:pipe{var:pipe}、{var:regex}。
  8. 国内混合云常见坑:
    • 不同环境标签大小写不一致(env=prod 与 ENV=Prod);
    • 部分旧系统没有 env 标签,需要 recording rule 统一注入;
    • 专线延迟导致 Prometheus 抓取时间戳不齐,需要 $__rate_interval 自动对齐。
  9. 性能测试特有指标:并发线程数、Tps、Rt、Error%、Cpu、Heap、GcTime、KafkaLag、RedisQps。
  10. 权限与隔离:通过 Grafana RBAC + folder 权限,实现“测试组能看到压测环境,开发只能看 Dev”。

答案

以一次“三环境对比”为例,给出可直接落地的七步配置:

  1. 建 Dashboard,Setting→General→Name 改为“Order-Svc 压测多环境对比”。
  2. 新建变量“datasource”,Type 选 Datasource,Plugin ID 选 Prometheus,Multi-value 开,Include All 开;这样下拉框里会出现 Prometheus-Dev、Prometheus-Staging、Prometheus-Prod 三个数据源。
  3. 新建变量“env”,Type 选 Query,DataSource 选刚才的 datasourceQuerylabelvalues(tpsordertotal,env)Regex/[az]+datasource,Query 填 label_values(tps_order_total, env),Regex 填 /^[a-z]+/ 去掉空值;Multi-value 与 Include All 全开。
  4. 新建变量“cluster”,Type 选 Query,Query 填 label_values(tps_order_total{env=~"$env"}, cluster),实现“先选环境、再选集群”的级联。
  5. 在面板 Query 里写:
    sum(rate(tps_order_total{env=~"env",cluster= "env",cluster=~"cluster"}[$__rate_interval])) by (env)
    Legend 用 {{env}}-{{cluster}} 区分。
  6. 打开 Panel 的“Repeat by variable”,选 env;这样一行面板会自动复制出 Dev、Staging、Prod 三列,横向对比一目了然。
  7. 保存后,把 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”。

拓展思考

  1. 如果公司用了夜莺(Nightingale)或 VictoriaMetrics 集群,变量查询语法不变,但数据源要换成“VictoriaMetrics-Cluster”,且注意 vmselect 的 Tenancy 参数,否则会出现跨租户数据穿透。
  2. 当环境数量>10 时,下拉框会变得冗长,可以把 env 变量改成“Text box”+自动补全,或者使用 Ad hoc filters,让面试官看到你具备“大规模场景下的可用性设计”能力。
  3. 压测过程中常需要“临时加一台灰度机”,可以在变量里预留“gray_ip”正则占位,配合 Grafana 的“__user”内置变量,实现“谁压测、谁填 IP、谁看曲线”,避免永久写到 Prometheus 标签里造成基数爆炸。
  4. 最终输出不只是“看图”,而是把变量模板固化到 Helm Chart 里,随应用版本一起发布;下次上线时,开发只需 helm upgrade,Dashboard 自动感知新标签,真正实现“一次配置,终身对比”。