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查询的结果。