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: .*
变量命名与引用规范#
- 统一使用小写短名:
env、cluster、job、instance - 查询引用:
$env或${env};复杂表达式用${var}
PromQL 查询与变量联动示例#
# 按环境过滤实例
node_cpu_seconds_total{job="node", env="$env", instance=~"$instance"}
# 多选变量(正则匹配)
instance=~"$instance"
# 全选 All(All value = .*)
up{env="$env", instance=~"$instance"}
变量级联实践(降低列表噪声)#
env:label_values(up, env)cluster:label_values(up{env="$env"}, cluster)instance:label_values(up{env="$env", cluster="$cluster"}, instance)
重复面板与重复行(实战)#
- 重复面板:面板设置 Repeat by
instance - 重复行:行设置 Repeat by
job - 布局建议:固定宽度、少字段,避免渲染卡顿
实战案例:Node 监控模板#
- 变量:
env、cluster、instance - 面板 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 获取范围,排查级联变量无数据问题
排错清单(常见问题与处理)#
- 变量无值
- 原因:Prometheus 无该 label 或数据源未连接
- 处理:用 Prometheus API 验证 label;检查数据源 URL - 多选变量无效
- 原因:未使用正则=~"$var"
- 处理:替换为正则匹配 - All 选项无效
- 原因:All value 未设为.*
- 处理:设置 All value 为.* - 重复面板过多导致卡顿
- 原因:变量数量过大
- 处理:限制实例列表或拆分 Dashboard
练习#
- 创建
env、cluster、instance三级变量并验证级联关系。 - 为
instance开启 Multi-value 与 Include All,写一条up{instance=~"$instance"}查询并验证。 - 创建一个 Repeat by
instance的 CPU 面板,对比单面板与重复面板渲染差异。 - 用 Prometheus API 验证
label_values的返回结果与 Grafana 变量列表一致。
性能与可维护性建议#
- 控制变量数量,避免过多级联导致查询缓慢
- 变量查询优先使用轻量指标(如
up) - 复用查询表达式,使用 Query Reference 降低重复计算
- 大量重复面板时拆分多个 Dashboard