apache / apache/iotdb

[Feature request] Grafana plugin: no table model support and poor tree model UX — needs overhaul | Grafana

オープン
#18,258 コメント 4 件 リアクション 0 件 担当者 1 名 @PDGGK が担当を希望しています GitHub で見る
New Feature
主要言語
Java
スター
6.4k
フォーク
1.2k
平均マージ
1日 23時間
マージ済み PR(30日)
115

説明

### Search before asking

- [x] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.

### Motivation

## Background

The current IoTDB Grafana data source plugin (in `iotdb-extras/connectors/grafana-plugin`) only supports the tree model. Since IoTDB 2.0 introduced the table model, the plugin has fallen behind. Even for tree-model users, the UX is rough compared to other Grafana data source plugins.

---

## Problem 1: No table model support

The plugin has zero awareness of the table model:

- **Frontend**: QueryEditor offers two modes — `SQL: Full Customized` (manual SQL) and `SQL: Drop-down List` (hierarchical tree path picker). Both are hardwired to the `root.` path system. There is no database/table/column browser for the table model.
- **Backend**: The Go backend calls three IoTDB REST endpoints — `/grafana/v1/query/expression`, `/grafana/v1/variable`, `/grafana/v1/node`. The `getNodes` handler (used by the Drop-down List picker) traverses `root.`-prefixed hierarchical paths, which has no equivalent in the table model's flat two-dimensional structure.
- **Result**: Table-model users cannot visualize data in Grafana through the plugin and must resort to workarounds like the Infinity data source with raw SQL.

## Problem 2: Poor tree-model UX

### 2.1 "SQL: Full Customized" mode is too raw

It's essentially four text boxes (SELECT / FROM / WHERE / CONTROL). Users must manually type IoTDB-specific SQL syntax. For Grafana operators unfamiliar with IoTDB SQL, the barrier is high and the error rate is high.

### 2.2 Drop-down List path picker is slow and unintuitive

The TIME-SERIES picker expands each level via a separate HTTP call to `/grafana/v1/node`. With a large number of time series, every level expansion stalls on a network round-trip, and the nested-dropdown UX makes it hard to locate a target series quickly.

### 2.3 Missing modern Query Builder experience

Compared to other data source plugins (Prometheus, InfluxDB, MySQL, etc.), the IoTDB plugin lacks:
- Visual metric/field/tag pickers
- In-editor data preview
- Autocomplete and syntax hints
- Real-time query validation
- Toggle between Query Builder and raw SQL editor (the Grafana-recommended dual-mode pattern)

### 2.4 Go backend tech debt

- Uses deprecated `ioutil.ReadAll`
- Error handling is coarse (multiple ignored error returns)
- The REST API returns `values` as `[]interface{}` requiring type-guessing (`recoverType`), making the data contract fragile

### 2.5 Stale aggregate function list

The dropdown in QueryEditor lists `SUM, COUNT, AVG, EXTREME, MAX_VALUE, MIN_VALUE, FIRST_VALUE, LAST_VALUE, MAX_TIME, MIN_TIME`, which may not cover all built-in aggregate functions available in newer IoTDB versions.

### 2.6 Limited template variable support

Variable values rely on executing SQL via `/grafana/v1/variable` — they must be queryable from IoTDB. Static variable types like constants or custom lists require workarounds.

---

## What we'd like to see

1. **Table model support**
- A tree/table model switch in QueryEditor
- Database → Table → Column browser for the table model
- Standard SQL queries against table-model data (`SELECT ... FROM database.table WHERE ...`)
- Corresponding REST API additions (or reuse IoTDB's existing SQL query interface)

2. **Tree model UX overhaul**
- A visual Query Builder to lower the entry barrier
- Keep a raw SQL editor as the advanced/power-user mode
- Optimize path picker performance (caching, batch loading, search/filter)
- Add autocomplete and syntax hints
- Sync the aggregate function list with the latest IoTDB release

3. **Codebase modernization**
- Upgrade to the latest Grafana plugin SDK
- Clean up Go backend tech debt
- Improve error handling and logging

---

## Related repos

Plugin code lives at [apache/iotdb-extras](https://github.com/apache/iotdb-extras) under `connectors/grafana-plugin/`. The three REST endpoints it calls (`/grafana/v1/*`) live in this repository's REST module.

---

---

## 背景

当前 IoTDB Grafana 数据源插件(位于 `iotdb-extras/connectors/grafana-plugin`)仅支持树模型。IoTDB 2.0 引入表模型后,插件已明显滞后。即便是树模型用户,与其他 Grafana 数据源插件相比,使用体验也较差。

---

## 问题 1:完全不支持表模型

插件对表模型完全无感知:

- **前端**:QueryEditor 仅提供「SQL: Full Customized」(手动拼 SQL)和「SQL: Drop-down List」(树形路径选择器)两种模式,均硬编码为 `root.` 路径体系,没有数据库/表/列的浏览器。
- **后端**:Go 后端调用 IoTDB 的三个 REST 端点 —— `/grafana/v1/query/expression`、`/grafana/v1/variable`、`/grafana/v1/node`。`getNodes` 处理器(供下拉选择器使用)遍历 `root.` 前缀的层级路径,表模型的平面二维结构没有对等物。
- **结果**:表模型用户无法通过插件在 Grafana 中可视化数据,只能借助 Infinity data source 等变通方案直接写 SQL,体验割裂。

## 问题 2:树模型使用体验较差

### 2.1 「SQL: Full Customized」模式过于原始

本质是四个文本框(SELECT / FROM / WHERE / CONTROL),用户需手动输入 IoTDB 特有 SQL 语法。对不熟悉 IoTDB SQL 的 Grafana 运维人员来说门槛高、出错率高。

### 2.2 下拉列表选择路径慢且不直观

TIME-SERIES 选择器每展开一级需调用一次 `/grafana/v1/node`。序列数量大时,每次展开都要等待网络往返,且嵌套下拉的交互难以快速定位目标序列。

### 2.3 缺乏现代化的 Query Builder 体验

相比其他数据源插件(Prometheus、InfluxDB、MySQL 等),IoTDB 插件缺少:
- 可视化的 metric/field/tag 选择器
- 编辑器内数据预览
- 自动补全与语法提示
- 实时查询校验
- Query Builder 与原始 SQL 编辑器的双模式切换(Grafana 推荐模式)

### 2.4 Go 后端技术债务

- 使用了已废弃的 `ioutil.ReadAll`
- 错误处理粗糙(多处忽略 error 返回值)
- REST API 返回的 `values` 使用 `[]interface{}` 靠类型猜测(`recoverType`),数据契约不严格

### 2.5 聚合函数列表陈旧

QueryEditor 中的聚合函数下拉列表为 `SUM, COUNT, AVG, EXTREME, MAX_VALUE, MIN_VALUE, FIRST_VALUE, LAST_VALUE, MAX_TIME, MIN_TIME`,可能未覆盖新版 IoTDB 的全部内置聚合函数。

### 2.6 模板变量支持有限

变量值依赖 `/grafana/v1/variable` 执行 SQL 查询获取——值必须能从 IoTDB 查到。常量或自定义列表等静态变量类型需要变通方案。

---

## 期望改进

1. **新增表模型支持**
- QueryEditor 增加「树模型」/「表模型」模式切换
- 表模型模式下提供数据库 → 表 → 列的浏览器
- 支持标准 SQL 查询表模型数据
- 后端新增或复用对应的 REST API

2. **优化树模型使用体验**
- 提供可视化 Query Builder,降低上手门槛
- 保留原始 SQL 编辑器作为高级模式
- 优化路径选择器性能(缓存、批量加载、搜索过滤)
- 添加自动补全和语法提示
- 同步聚合函数列表

3. **代码现代化**
- 升级 Grafana plugin SDK
- 清理 Go 后端技术债务
- 完善错误处理与日志

---

## 相关仓库

插件代码位于 [apache/iotdb-extras](https://github.com/apache/iotdb-extras) 的 `connectors/grafana-plugin/` 目录。插件调用的三个 REST 端点(`/grafana/v1/*`)位于本仓库的 REST 模块。

### Solution

_No response_

### Alternatives

_No response_

### Are you willing to submit a PR?

- [ ] I'm willing to submit a PR!

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。