阿里云TimeStream系列--TimeStream promQL实现原理

TimeStream可以支持使用promQL查询存储ES TimeStream的时序数据。

关于promQL功能的使用可以参见使用文档:https://help.aliyun.com/document_detail/436523.html

这篇文章主要说明下promQL实现的关键原理。

首先TimeStream使用antlr4j来解析promQL的语法,具体解析功能在:https://github.com/antlr/grammars-v4/tree/master/promql

通过antlr4j的解析,TimeStream可以拿到一个promQL的解析树。然后TimeStream去定义每个算子的功能实现,比如遇到+算子,那么TimeStream就将算子两边的结果进行相加。如果遇到可以下推的算子,TimeStream就将算子下推到ES中,promQL大致的执行流程如下:

image.png

然后我们以一个promQL示例看下TimeStream内部的执行流程:

sum(max(irate(node_cpu_idle{mode!='idle'}[5m])) / min(node_cpu_sys)) by (instance) + 1

promQL转换成的Expression树结构如下:

image.png

只要算子能够生成time_series_aggregation的执行结果,就会下推到ES中获取算子需要的结果。获取结果后,再跟其他算子进行运算,最终执行数按深度遍历的方式逐级往上执行,得到了最终promQL查询的结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容