https://bosun.org/expressions
seriesSet
的理解可以将其结构看成:
seriesSet = {
"group0":{
time0: num0,
time1:num1,
....
},
"group1":{
time0: num0,
time1:num1,
....
}
}
每个seriesSet
由多个组构成,每个组由时间和值映射的序列构成。
group
的格式: {tagA=A,tagB=B}
如果数据未做分组操作,则有唯一的一个空组:group={}
.
addtags(seriesSet,"tagA=A,tagB=B...)
为seriesSet
中的每个组添加额外的tag
.
merge(seriesSet...)
合并多个数据集要求:所有数据集之间的组没有冲突.
aggr(seriesSet,"groups...","sum|max|min...")
聚合操作其操作过程就是将seriesSet
中的组进行削减,只保留groups...
中指定的组,如果两个组,保留之后具有相同的组,则将它们进行聚合。
比如seriesSet中有多个组:{A=a,B=b,C=c1}
,{A=a,B=b,C=c2}
,{A=a1,B=b,C=c2}
, groups=A,B
, 则对前两个组进行聚合操作,并去掉C=c1
,C=c2
的tag;第三个组去掉C=c2
的tag即可。最终结果:{A=a,B=b}
, {A=a1,B=b}
.
特别地,如果groups
为空,则对所有组进行聚合操作,并最终保留一个空的组.
addtags
、merge
和aggr
完成不同指标的聚合根据实际场景我们可能将一类指标拆分成很多个指标,而不是把他们都放到一个指标下面用group区分。如果需要做累加运算,由于+
的逻辑是以右边的值为准,去掉左边不存在的值,所以不能满足统计和的需求。
这个时候,我们可以通过将两个指标聚合到一个指标里面,来进行聚合操作。
为了聚合指标,我们需要避免组冲突,所以使用addtags
为两个数据集加上tag,然后进行merge
,将两个数据集加在一起,然后使用aggr
进行去组操作,从而得到最终数据。
$success = q("sum:rate{count}:call.method.success.throughput", "$start", "2m")
$fail = q("sum:rate{count}:call.method.failed.throughput", "$start", "2m")
$success_set = addtags($success,"type=success")
$fail_set = addtags($fail,"type=fail")
$merge_set = merge($success_set,$fail_set)
$sum = aggr($merge_set, "", "sum")
$sum