TDengine 查询
从实际使用场景出发,介绍夜莺 TDengine 数据源告警:用 TDengine SQL 查询做告警判定,以及指标名字段、标签字段按列类型自动推断的机制。
概述
TDengine 是常用于物联网、工业设备场景的时序数据库。接成告警数据源后,用 TDengine SQL 查询数据并判定告警。
和 MySQL 这类关系型数据源相比,TDengine 的一个便利之处是:指标名和标签默认按列的数据类型自动推断,多数情况下不用手工指定。
| 字段 | 必填 | 说明 |
|---|---|---|
| 数据源类型 / 数据源 | 是 | 选 TDengine 类型并选中已接入的 TDengine 数据源 |
| 查询条件 | 是 | TDengine SQL 查询语句 |
| 指标名字段(辅助配置) | 否 | 指定哪些列作为指标名(metricName);留空时默认把数值类型的列作为指标名 |
| 标签字段(辅助配置) | 否 | 指定哪些列作为标签(label);留空时默认把非数值类型的列作为标签 |
| 时间格式(辅助配置) | 否 | 时间列的格式,按此格式把时间转成时间戳,默认 2006-01-02T15:04:05 |
| 告警条件 | 是 | 基于查询结果写告警表达式 |
| 执行频率 | 是 | 多久跑一次查询 |
| 持续时长 | 是 | 满足条件持续多久才触发 |
下面按实际使用场景介绍。
场景一:查设备指标判阈值
TDengine 的查询结果会按列类型自动拆成「指标 + 标签」。例如查询返回:
used_percent: 96 host: host01
used_percent是数值列 → 自动作为指标名,值为96;host是非数值列 → 自动作为标签,标签值为host01。
于是告警条件直接写阈值判定即可,比如磁盘使用率超过 90% 告警:
SELECT last(used_percent) AS used_percent, host
FROM db.disk
GROUP BY host;
告警条件写 $A > 90。写完点「数据预览」确认返回结构符合预期,再配阈值。
场景二:手工指定指标名和标签字段
自动推断不符合预期时(比如某个数值列其实是设备编号、应该当标签),在辅助配置里手工指定:
- 指标名字段:填要作为指标的列名;
- 标签字段:填要作为标签的列名(回车可输入多个)。
手工指定后就不再走"按类型自动推断"的默认规则,按你指定的来。
场景三:分组告警
按设备、机房等维度分组查询后,每个分组会作为独立的时序被逐条判定——每个满足阈值的分组各触发一条告警事件,事件标签里带对应的分组值(如 host=host01)。
想控制告警事件的数量和粒度,就在 SQL 的 GROUP BY 上控制分组维度。
常见问题
Q1:指标名和标签是怎么确定的?
A:默认按列的数据类型推断——数值类型的列作为指标名(及其值),非数值类型的列作为标签。要覆盖这个默认行为,在辅助配置里手工填「指标名字段」和「标签字段」。
Q2:时间格式要怎么填?
A:按 Go 的时间格式模板写,默认 2006-01-02T15:04:05。系统会按这个格式把查询结果里的时间列解析成时间戳。时间列格式与默认不一致时才需要改。
Q3:查询返回多行会怎样?
A:每行(每个分组)作为独立时序,逐条判定告警,各自产生独立的告警事件。用 GROUP BY 控制分组粒度。
Q4:告警条件的表达式语法和其它数据源一样吗?
A:一样,都是同一套告警表达式。区别只在查询语言和数据形态。