预处理查询
当前版本中,为了保持与历史API,SDK以及生态工具(Grafana)的兼容性, 目前开启预计算查询的机制为引入一个额外的tag来作为查询hint. hint命中后会返回预计算结果, 否则返回原始数据结果.
查询预处理后的数据需要传入一个特殊的tagk=”granularity“,并且tagv指示采用何种查询策略:
1. tagv直接指定Rollup间隔和算子,例如“5m.avg”
下面是一个例子(HTTP POST body):
{
"start":1560218801118,
"end":1560218867499,
"queries":[
{
"metric":"system.mem.base",
"aggregator":"avg",
"downsample":"5m-avg",
"filters":[
{
"type":"literal_or",
"tagk":"__granularity__",
"filter":"5m.avg"
},
{
"type":"literal_or",
"tagk":"HostType",
"filter":"N38"
},
]
}]
}
这个例子中,查询指定metric为“system.mem.base”,包含有标签HostType=”N38”的时间线。如果我们已经为这条时间线配置了预处理规则,那么特殊的标签granularity=”5m.avg”就可以让数据库读取预处理后的数据而不是原始数据。
2. tagv设置为”auto”,自动从Rollup规则中设置聚合间隔和算子
下面是一个例子(HTTP POST body):
{
"start":1560742264,
"end":1560742564,
"queries":[
{
"aggregator":"avg",
"downsample":"1m-sum",
"metric":"test.rollup.t5",
"tags":{
"tagk1":"tagv1",
"tagk2":"tagv2",
"tagk3":"tagv3",
"__granularity__":"auto"
}
}
]
}
这个例子中,查询指定metric为“system.mem.base”,包含有标签tagk1=”tagv1”, tagk2=”tagv2”, tagk3=”tagv3”的时间线。假设我们已经为这条时间线配置了预处理规则(默认间隔为1m, 默认聚合器为sum),那么此时会按照 “1m.sum”的降采样规则去查询预处理数据(等价于特殊的标签granularity=”1m.sum”)。
3. 查询结果标识
如果需要查看数据库是否读取了预处理后的数据,可以在返回的JSON中查找是否存在“rollupGranularity”,例如下面的例子,返回“rollupGranularity”=“5m.avg”,说明已经使用了预处理的后数据。
[{
"metric":"system.mem.base",
"tags":{"HostType":"N38", ...},
"rollupGranularity":"5m.avg",
"dps":{
"1560908100":26.677781312753666,
"1560908160":29.156335115229304,
...
}
}]
最后, 需要注意的是,如果没有为某个时间线配置预处理规则,查询会忽略标签granularity,直接返回原始数据。因此,如果在查询中,指定的度量(metric)和标签(tag)有错误,系统无法找到预处理规则,也会直接返回原始数据点。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论