HMF-TSDB 表达式通常由多个“子句”组成。HMF-TSDB表达式中存在以下几种子句:
1、选择器子句
2、时间范围子句
3、函数子句
4、降频子句
5、分组子句
1、选择器子句
选择器子句是用来 选择测点/指标的。在一个简单查询或者复杂分析的表达式中,可以定义一个或多个选择器。选择器的语法如下: metricName{tagName1=’tagValue1’,tagName2=’tagValue2’} 其中“metricName”是一个测点名,tagName是测点的一个标签,tagValue是测点标签值。
例子1:
查询一号配电柜的输入端口的功率,表达式可以这么写: power{device=‘一号配电柜’,port=‘输入’}
例子2:
在选择器中,对同一个标签,可以设置多个值。假如我们要查询两个设备的输入功率,可以这么写: power{device=‘一号设备’|‘二号设备’,port=‘输入’}。
2、时间范围子句
时间范围子句是表达用来定义时间范围的。在一个表达式中,必须有且仅有一个时间范围子句。时间范围子句有两种形式: from ‘yyyy-MM-dd HH:mm:ss’to ‘yyyy-MM-dd HH:mm:ss’或者 last[1h]
前一种形式直接定义了开始时间和结束时间。第二种形式定义了最近多长的一个时间范围,比如: last[1h] 表示最近1小时; 这种形式中,时间长度单位可以是:m、h或者d,分别表示分钟、小时和天。
3、函数子句
函数子句 赋予了HMF-TSDB强大的时序数据分析计算能力。函数子句的语法形式如下:functionName(subExp[…])。其中functionName是函数名,括号内是一个或者多个 选择器子句或者函数子句。HMF-TSDB表达式支持的函数包括:sum、avg、min、max、mul、div、sub等。
上述函数可以分为两个类型:集合参数型、二元参数型。其中sum、avg、min、max都属于集合参数型,mul、div、sub都属于二元参数型。
集合参数型函数:
参数为一个或多个(选择器或者函数)子句;每个子句获得的series数量不限;执行结果和参数顺序无关。我们以sum函数为例,无论我们为其定义了几个参数,每个参数能得到几个series。最终在执行函数的时候,HMF-TSDB表达式引擎会把每个参数所得到的series放到一起,再基于这些series执行求和运算。假如函数内部的子句得到了2个series,分别为:
S1={t1:v1,t2:v2,t3:v3 …};
S2={t1:v1’,t2:v2’,t3:v3’ …}
对这两个series进行sum计算的后,得到一个新的series:
{t1:(v1+v1’), t2:(v2+v2’), t3:(v3+v3’),…}
例子3:
如果要计算某个集群中所有服务器的cpu负载平均值,可以这么写表达式:
avg(cpu{cluster=‘web服务集群’}) last[3h]
二元参数型函数:
这类函数必须有2个参数;每个参数只能获得的一个series;执行结果和参数顺序相关。 我们以sub(减法)函数为例,该函数必须申明两个参数,每个参数必须能获得一个series,执行时将第一个参数所得series的所有时序数据减去第二个参数所得series中相应的时序数据。
例子4:
如果要分析电能从某个配电柜到用电终端之间线路损耗情况,可以这样表达式:
sub(power{device=‘配电柜1’,port=‘输入’},sum(power{src=‘配电柜1’})) last [1d]
上述表达式的含义是:计算“最近一天内配电柜1的输入功率” 减 “该配电柜下所有用电设备的功率和”
备注:假如作为参数的多个series之间,时序数据的采样时间并不一一对应,则函数在执行过程中会采样插值算法,推算出部分时序数据值。
4、降频子句
降频子句允许HMF-TSDB在时间轴上对时序数据进行聚合,假如用户希望在比较大的时间尺度上对时序大数据进行分析的话,常常希望得到的是一个较为粗粒度的曲线,这时候就需要用到降频子句。每个表达式最多可以申明一个降频子句。
降频子句语法如下:downsample[1m:avg]。其中downsample是降频关键字;1m是降频后时间间隔,1m表示降频后的时间间隔为1分钟,avg是降频算法,avg表示在指定的时间间隔内执行平均算法。假如原始数据是每秒钟存储一次,被降频为每分钟展示一个数据,那么我们需要在时间轴上将每60秒的时序数据合并为一个时序数据,此时可能用到的算法有:avg(求平均值),sum(求和),min(求最大值),max(求最小值),first(求初值),last(求末值)。
例子5:
如果有个web服务,运维监控系统每秒钟采样并存储了一次pv(页面访问量),运维人员想了解最近24小时内每小时的pv值,则可以用这样的表达式: pv{server=‘webServer’} downsample[1h:sum] last[24h]
5、分组子句
分组子句允许HMF-TSDB对时序数据采用分组聚合算法,语法如下:by tagName。每个表达式最多可以申明一个分组子句。
例子6:
如果某个业务系统,所有服务器被分为三个集群:存储集群、微服务集群、web服务集群。运维人员希望能够获得三组集群平均cpu使用率,以便分析系统性能瓶颈。那么下面的表达式就可以做到:
avg(cpu{business=‘应用系统A’}) by serverType last[24h]
该表达式执行后,我们可以得到三个series,分别代表:
serverType=“存储服务集群”的所有服务器的平均cpu使用率序列、
serverType=“微服务集群”的所有服务器的平均cpu使用率序列、
serverType=“web服务器集群”的所有服务器的平均cpu使用率序列。
其他说明
在HMF-TSDB表达式中:
1、最小的表达式必须包含至少一个测点选择器、和一个时间范围子句
2、函数是可以嵌套的;
3、分组子句只能用于集合参数型函数