Grafana表格可视化能否拆分列或横向重复展示设备状态?
解决Grafana设备在线状态表格多列布局问题
原生Grafana表格面板确实没有直接实现“单列满N条后横向换行”的设置,以下是三种可行的实现方案:
方案一:HTML面板自定义网格布局(最灵活,适配未来设备扩容)
通过自定义代码直接渲染多列网格,完全可控布局:
- 新建HTML面板,进入面板设置,关闭「Sanitize HTML」选项(否则JavaScript无法执行)
- 在面板内容中粘贴以下代码(根据你的数据源字段名调整):
<style> .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; padding: 10px; } .device-item { padding: 8px; border-radius: 4px; background: #f5f5f5; } .device-online { color: #2ecc71; font-weight: bold; } .device-offline { color: #e74c3c; font-weight: bold; } </style> <div class="device-grid" id="deviceGrid"></div> <script> // 从Grafana数据源提取字段(替换成你的实际字段名,比如"device_name"和"status") const dataSeries = grafanaData.series[0].fields; const deviceNames = dataSeries.find(f => f.name === "device_name").values; const statuses = dataSeries.find(f => f.name === "status").values; const gridContainer = document.getElementById("deviceGrid"); // 循环生成设备状态项 for (let i = 0; i < deviceNames.length; i++) { const item = document.createElement("div"); item.className = "device-item"; const statusClass = statuses[i] === "online" ? "device-online" : "device-offline"; item.innerHTML = `<div>${deviceNames[i]}</div><div class="${statusClass}">${statuses[i]}</div>`; gridContainer.appendChild(item); } </script>
- 调整CSS中的
grid-template-columns控制每列宽度,gap控制项间距,确保一屏能放下所有列;替换代码中的字段名匹配你的数据源。
方案二:数据源查询预处理+Transform转置多列
通过给数据添加分组标识,再转置成多列表格:
- 查询阶段添加列组编号:以SQL数据源为例,用窗口函数生成行号,按每15条分组:
SELECT device_name, status, CEIL(ROW_NUMBER() OVER (ORDER BY device_name) / 15) AS column_group FROM device_status - 配置Transform:
- 添加「Group by」,按
column_group分组,将每组的device_name和status聚合为数组 - 添加「Organize fields」,将不同列组的字段重命名为「列1设备」「列1状态」「列2设备」「列2状态」等,实现多列展示
- 添加「Group by」,按
方案三:Stat面板+重复面板(适合当前36台设备规模)
快速生成多列状态卡片:
- 创建模板变量
device,类型为Query,从数据源获取所有设备名 - 新建Stat面板,配置查询,根据
$device变量显示对应设备的在线状态,设置状态文本颜色(在线绿色、离线红色) - 在面板设置中开启「Repeat」,选择
device变量,设置每行显示15个面板,自动生成多列布局
内容的提问来源于stack exchange,提问作者TeeLan
相关产品推荐
相关产品推荐

