17.6.4 变量、查询与重复面板实战

本节聚焦 Grafana 中变量、查询与重复面板的实战方法,目标是让同一套 Dashboard 适配多环境、多集群与多实例场景,减少面板复制成本并提升查询复用性。包含安装与初始化、变量配置、查询联动、重复面板、排错与练习。

原理草图:变量驱动查询与重复面板#

文章图片

安装与基础准备(Grafana + Prometheus)#

# 1) 安装 Grafana(以 Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl enable --now grafana-server

# 2) 安装 Prometheus(以 Ubuntu 为例)
sudo useradd -rs /bin/false prometheus
wget -q https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar -xf prometheus-2.48.0.linux-amd64.tar.gz
sudo mv prometheus-2.48.0.linux-amd64 /opt/prometheus

# 3) 启动 Prometheus
cat <<'EOF' | sudo tee /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus

# 4) 验证服务
systemctl status grafana-server --no-pager
systemctl status prometheus --no-pager

变量类型与适用场景(示例)#

  • Query 变量:动态 label 列表
    label_values(node_cpu_seconds_total, instance)
  • Constant 变量:固定环境值
    prod / staging
  • Custom 变量:枚举业务
    api,auth,order
  • Data source 变量:切换多个 Prometheus

变量配置示例(Grafana 界面对应设置)#

Name: env
Type: Query
Data source: Prometheus
Query: label_values(up, env)
Multi-value: false
Include All: false
Name: instance
Type: Query
Data source: Prometheus
Query: label_values(up{env="$env"}, instance)
Multi-value: true
Include All: true
All value: .*

变量命名与引用规范#

  • 统一使用小写短名:envclusterjobinstance
  • 查询引用:$env${env};复杂表达式用 ${var}

PromQL 查询与变量联动示例#

# 按环境过滤实例
node_cpu_seconds_total{job="node", env="$env", instance=~"$instance"}

# 多选变量(正则匹配)
instance=~"$instance"

# 全选 All(All value = .*)
up{env="$env", instance=~"$instance"}

变量级联实践(降低列表噪声)#

  1. envlabel_values(up, env)
  2. clusterlabel_values(up{env="$env"}, cluster)
  3. instancelabel_values(up{env="$env", cluster="$cluster"}, instance)

重复面板与重复行(实战)#

  • 重复面板:面板设置 Repeat by instance
  • 重复行:行设置 Repeat by job
  • 布局建议:固定宽度、少字段,避免渲染卡顿

实战案例:Node 监控模板#

  • 变量:envclusterinstance
  • 面板 1(CPU 使用率)
100 - (avg by(instance) (
  rate(node_cpu_seconds_total{mode="idle", env="$env", cluster="$cluster", instance=~"$instance"}[5m])
) * 100)
  • 面板 2(内存使用率)
(1 - (
  node_memory_MemAvailable_bytes{env="$env", cluster="$cluster", instance=~"$instance"} /
  node_memory_MemTotal_bytes{env="$env", cluster="$cluster", instance=~"$instance"}
)) * 100
  • 面板 3(磁盘使用率)
1 - (
  node_filesystem_free_bytes{fstype!~"tmpfs|overlay", env="$env", cluster="$cluster", instance=~"$instance"} /
  node_filesystem_size_bytes{fstype!~"tmpfs|overlay", env="$env", cluster="$cluster", instance=~"$instance"}
)

关键命令与解释(调试变量与查询)#

# 1) Grafana 健康检查
curl -s http://localhost:3000/api/health | jq

# 2) Prometheus 查询 API 验证变量是否能返回 label
curl -s "http://localhost:9090/api/v1/label/env/values" | jq

# 3) 验证实例列表是否随 env 变化
curl -s "http://localhost:9090/api/v1/label/instance/values?match[]=up{env=\"prod\"}" | jq

解释:
- /api/health:确认 Grafana 正常
- /label/.../values:验证变量 Query 是否能取到 label
- match[]:限制 label 获取范围,排查级联变量无数据问题

排错清单(常见问题与处理)#

  1. 变量无值
    - 原因:Prometheus 无该 label 或数据源未连接
    - 处理:用 Prometheus API 验证 label;检查数据源 URL
  2. 多选变量无效
    - 原因:未使用正则 =~"$var"
    - 处理:替换为正则匹配
  3. All 选项无效
    - 原因:All value 未设为 .*
    - 处理:设置 All value 为 .*
  4. 重复面板过多导致卡顿
    - 原因:变量数量过大
    - 处理:限制实例列表或拆分 Dashboard

练习#

  1. 创建 envclusterinstance 三级变量并验证级联关系。
  2. instance 开启 Multi-value 与 Include All,写一条 up{instance=~"$instance"} 查询并验证。
  3. 创建一个 Repeat by instance 的 CPU 面板,对比单面板与重复面板渲染差异。
  4. 用 Prometheus API 验证 label_values 的返回结果与 Grafana 变量列表一致。

性能与可维护性建议#

  • 控制变量数量,避免过多级联导致查询缓慢
  • 变量查询优先使用轻量指标(如 up
  • 复用查询表达式,使用 Query Reference 降低重复计算
  • 大量重复面板时拆分多个 Dashboard