如何配置Grafana生成兼容QuestDB的时间过滤查询语句
适配方案
以下方案按稳定性、落地成本排序,可直接复用:
- 自定义时间过滤逻辑替换默认宏(最稳定,彻底规避告警场景的宏bug)
直接弃用$__timeFilter(timestamp)默认宏,用Grafana内置的$__from、$__to时间范围变量手动拼接过滤条件,完全绕开宏的精度异常问题,两种常用写法按需选择:- 微秒epoch时间戳写法(性能最好)
告警场景下Grafana输出的timestamp BETWEEN $__from / 1000 AND $__to / 1000$__from/$__to是纳秒级epoch值,除以1000刚好换算为QuestDB支持的微秒级epoch,和示例里的1656490564000000格式完全匹配。
2. 微秒精度ISO字符串写法
通过Grafana的日期格式化语法,强制输出6位小数秒的ISO时间串,不会生成带9位小数的纳秒格式,和示例里的timestamp BETWEEN cast('${__from:date:YYYY-MM-DDTHH:mm:ss.SSSSSSZ}' as timestamp) AND cast('${__to:date:YYYY-MM-DDTHH:mm:ss.SSSSSSZ}' as timestamp)2022-06-29T08:16:23.123456Z完全兼容。 - 调整QuestDB数据源配置
如果用的是官方QuestDB for Grafana插件,可以通过配置修正:- 先把插件升级到最新稳定版,旧版本存在告警场景下忽略精度配置、强制输出纳秒的已知问题
- 进入数据源设置页,找到时间精度选项,手动选择
微秒(Microsecond),不要选自动或纳秒 - 保存后默认的
$__timeFilter宏就会按微秒精度生成条件
- 临时过渡方案(不推荐长期使用)
存量查询太多暂时改不完的话,可以在查询里对传入的时间值做精度截断,缺点是会增加额外计算开销:timestamp >= cast(cast($__from / 1000 as long) as timestamp) AND timestamp <= cast(cast($__to / 1000 as long) as timestamp)
问题根因补充:普通面板查询的宏替换在前端执行,会读取数据源的精度配置;告警查询的宏替换在后端独立执行,部分Grafana版本后端逻辑没有同步读取数据源精度配置,默认输出纳秒级时间值,才会出现仅告警场景报错的现象。优先选第一种自定义过滤逻辑的方案,不受任何版本bug影响。
内容的提问来源于stack exchange,提问作者Doncarleone512
相关产品推荐
相关产品推荐

