4. 使用变量过滤数据
任务目标
在Grafana仪表盘中创建一个下拉列表变量,用于动态切换当前查看的主机或服务,使面板数据随变量选择实时更新。
实现路径
本案例使用Grafana内置的TestData DB数据源,无需额外环境依赖。通过定义Query变量从数据源动态获取可选值列表,并在面板查询中引用该变量实现过滤。
操作步骤
1. 创建仪表盘与数据源
- 进入Grafana,选择 Connections → Data sources → Add data source,添加 TestData DB。
- 点击 Dashboards → New dashboard → Add visualization,数据源选择 TestData DB。
- 在面板编辑界面,数据源右侧选择 Scenario: CSV Content,将下方CSV内容粘贴进去:
time,host,service,value
2024-01-01 00:00:00,web-01,api,12.5
2024-01-01 00:01:00,web-01,api,14.2
2024-01-01 00:02:00,web-01,api,13.8
2024-01-01 00:00:00,web-02,api,9.1
2024-01-01 00:01:00,web-02,api,10.3
2024-01-01 00:02:00,web-02,api,11.7
2024-01-01 00:00:00,db-01,postgres,22.4
2024-01-01 00:01:00,db-01,postgres,24.1
2024-01-01 00:02:00,db-01,postgres,23.6
2024-01-01 00:00:00,db-02,postgres,18.9
2024-01-01 00:01:00,db-02,postgres,19.5
2024-01-01 00:02:00,db-02,postgres,20.2
点击 Run queries 确认能返回时序数据,保存仪表盘。
2. 创建下拉变量
- 点击仪表盘右上角 Settings(齿轮图标)→ Variables → Add variable。
- 按下表配置两个变量:
| 属性 | 变量1:主机 | 变量2:服务 |
|---|---|---|
| Variable type | Query | Query |
| Name | host | service |
| Data source | TestData DB | TestData DB |
| Query | label_values(host) | label_values(service) |
| Multi-value | 开启 | 开启 |
| Include All option | 开启 | 开启 |
说明:TestData DB的CSV场景会将第一行字段名注册为标签(label),因此
label_values(host)能直接提取所有主机名。若使用Prometheus等真实数据源,该查询同样适用。
3. 在面板查询中引用变量
回到面板编辑界面,将查询语句修改为:
SELECT
$__timeGroupAlias(time,$__interval),
value
FROM
csv
WHERE
host IN ($host) AND service IN ($service)
ORDER BY time
点击 Run queries,此时面板应显示全部数据(因为变量默认选中All)。
4. 验证动态过滤
- 点击仪表盘左上角下拉框,取消All,仅勾选
web-01,确认面板只显示该主机数据。 - 再勾选服务下拉框中的
api,确认面板仅显示web-01的api服务曲线。 - 切换不同主机/服务组合,观察面板实时刷新。
验证判定标准
- 仪表盘顶部出现两个下拉框,分别列出全部主机名(web-01、web-02、db-01、db-02)和服务名(api、postgres)。
- 选择单个主机时,面板曲线数量减少且仅包含该主机数据点。
- 同时选择主机与服务时,结果取交集,面板无报错。
- 选择All时恢复显示全部数据。
常见问题
- 下拉框为空:确认CSV数据已正确加载且字段名首行无空格;检查变量查询是否为
label_values(字段名)。 - 面板无数据:确认WHERE子句中的变量名与变量定义完全一致(含大小写),且变量值用
IN ($var)语法(支持多选)。 - 变量间无联动:本案例两个变量相互独立。若需服务列表随主机选择变化,可将服务变量的Query改为
label_values(service)并添加依赖(在变量设置中设置depends on为host),但需数据源支持该语法。