4. 使用变量过滤数据

任务目标

在Grafana仪表盘中创建一个下拉列表变量,用于动态切换当前查看的主机或服务,使面板数据随变量选择实时更新。

实现路径

本案例使用Grafana内置的TestData DB数据源,无需额外环境依赖。通过定义Query变量从数据源动态获取可选值列表,并在面板查询中引用该变量实现过滤。

操作步骤

1. 创建仪表盘与数据源

  1. 进入Grafana,选择 Connections → Data sources → Add data source,添加 TestData DB。
  2. 点击 Dashboards → New dashboard → Add visualization,数据源选择 TestData DB。
  3. 在面板编辑界面,数据源右侧选择 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. 创建下拉变量

  1. 点击仪表盘右上角 Settings(齿轮图标)→ Variables → Add variable。
  2. 按下表配置两个变量:
属性变量1:主机变量2:服务
Variable typeQueryQuery
Namehostservice
Data sourceTestData DBTestData DB
Querylabel_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. 验证动态过滤

  1. 点击仪表盘左上角下拉框,取消All,仅勾选 web-01,确认面板只显示该主机数据。
  2. 再勾选服务下拉框中的 api,确认面板仅显示 web-01 的 api 服务曲线。
  3. 切换不同主机/服务组合,观察面板实时刷新。

验证判定标准

  • 仪表盘顶部出现两个下拉框,分别列出全部主机名(web-01、web-02、db-01、db-02)和服务名(api、postgres)。
  • 选择单个主机时,面板曲线数量减少且仅包含该主机数据点。
  • 同时选择主机与服务时,结果取交集,面板无报错。
  • 选择All时恢复显示全部数据。

常见问题

  • 下拉框为空:确认CSV数据已正确加载且字段名首行无空格;检查变量查询是否为 label_values(字段名)。
  • 面板无数据:确认WHERE子句中的变量名与变量定义完全一致(含大小写),且变量值用 IN ($var) 语法(支持多选)。
  • 变量间无联动:本案例两个变量相互独立。若需服务列表随主机选择变化,可将服务变量的Query改为 label_values(service) 并添加依赖(在变量设置中设置 depends on 为 host),但需数据源支持该语法。