IoTDB 查询
从实际使用场景出发,介绍夜莺 IoTDB 数据源告警:用 IoTDB SQL 查询设备数据做告警判定,时间条件自动补全的机制,以及值字段、标签字段、时间字段的配置。
概述
Apache IoTDB 是面向物联网、工业设备场景的时序数据库。接成告警数据源后,用 IoTDB SQL 查询设备数据并判定告警。
和其它 SQL 类数据源相比,IoTDB 有两个特点:查询走 表模型(Table Model) 的 SQL;时间范围不用自己写,引擎会按「时间间隔」自动给 SQL 补上时间条件。
| 字段 | 必填 | 说明 |
|---|---|---|
| 数据源类型 / 数据源 | 是 | 选 IoTDB 类型并选中已接入的实例 |
| 查询条件 | 是 | IoTDB SQL 语句,如 select time, temperature, device from db1.d1 |
| 时间间隔 | 是 | 查询回看的时间区间,单位可选秒 / 分钟 / 小时,默认 1 分钟 |
| 元信息 | 否 | 点右侧「元信息」按 数据库 → 表 → 字段 浏览;点数值型字段会自动生成 SQL 并回填值字段、时间字段 |
| 值字段(辅助配置) | 建议填 | 查询结果里哪些列作为指标(metricName),指标值就是该列的数值 |
| 标签字段(辅助配置) | 否 | 哪些列作为告警事件的标签,通常是设备号、产线、机房这类维度列 |
| 时间字段(辅助配置) | 否 | 哪一列是时间列,默认 time |
| 告警条件 | 是 | 基于查询结果写告警表达式,如 $A > 30 |
| 执行频率 | 是 | 多久跑一次查询 |
下面按实际使用场景介绍。
场景一:查设备指标判阈值
「某条产线上的设备温度超过 30 度就告警」,查询写:
select time, temperature, device from db1.d1
辅助配置里:
- 值字段填
temperature; - 标签字段填
device; - 时间字段保持默认
time。
告警条件写 $A > 30。写完点「数据预览」看一眼曲线,确认查询结果和字段映射符合预期,再配阈值。
告警查询不会带上单独的「数据库」选项,SQL 里建议写成
数据库名.表名的完整形式,避免解析不到表。
场景二:时间条件不用自己写
IoTDB 的查询默认不用带时间条件——引擎会按「时间间隔」推出 [当前时间 - 间隔, 当前时间] 的窗口,自动往 SQL 里补一个时间条件。比如时间间隔选 1 分钟,实际执行的是:
select time, temperature, device from db1.d1 WHERE time >= 1784300000000 AND time <= 1784300060000
(IoTDB 的时间是毫秒时间戳,补出来的条件也是毫秒。)
几个细节:
- SQL 里已经写了时间列的比较条件(
>=、<=、between、in等)时,不再自动补,以你写的为准; - 自动补的条件会插在
GROUP BY/HAVING/ORDER BY/LIMIT这些子句之前;SQL 里已经有WHERE就用AND拼接; - 时间列不叫
time时,要在辅助配置的「时间字段」里改成实际列名,否则补出来的条件会指向不存在的列。
场景三:值字段和标签字段怎么分
- 值字段:要做数值比较的列(温度、电压、转速)。每个值字段是一条独立的指标,指标名就是列名。
- 标签字段:作为告警分组维度、事件标签的列(设备号、产线、机房)。
两个默认行为要注意:
- 标签字段留空时,除值字段和时间字段之外的其余列会自动作为标签;一旦填了标签字段,就只认你填的这些列,其余列被忽略。
- 值字段留空时,除时间列外的所有列都会被当成数值列去解析,非数值的列解析失败被丢掉,标签也就没了。所以建议显式填值字段。
场景四:多设备分组告警
查询返回多行、多设备时,每个「值字段 + 标签组合」是一条独立时序,告警引擎逐条判定,各自产生独立的告警事件,事件标签里带对应的设备信息(如 device=d1)。
想控制告警事件的数量和粒度,就在 SQL 里控制返回的维度列,并在「标签字段」里指定要作为标签的那几列。
常见问题
Q1:时间字段该填什么?
A:默认 time,对应 IoTDB 表模型里的时间列。查询里用 as 改过名、或者时间列另有其名时,按实际列名填。返回的时间是毫秒、微秒还是纳秒时间戳都可以,系统会统一归一成秒再参与判定。
Q2:为什么查不到数据,或者数据比预期少?
A:先确认「时间间隔」够不够大——它决定了回看窗口,设备写入有延迟时窗口太小就会查不到点。其次用「数据预览」看原始返回,确认 SQL 本身有结果。
Q3:查询里能用 $__timeFilter 这类时间宏吗?
A:不建议。IoTDB 靠「时间间隔」自动补时间条件就够了;而 SQL 里一旦出现 $__ 开头的宏,自动补时间条件的逻辑就会被跳过。
Q4:查询返回多行会怎样?
A:每条时序(值字段 + 标签组合)独立判定告警,各自产生独立的告警事件。
Q5:告警条件的表达式语法和其它数据源一样吗?
A:一样,都是同一套告警表达式。区别只在查询语言和数据形态。
参考资料
- 告警表达式语法
- TDengine 查询(同为时序数据库,指标 / 标签映射思路类似)
- 告警规则基础配置