metric:tag
http://localhost:4242/api/search/lookup?m=system.disk.in_use{uid=1}
http://localhost:4242/api/search/lookup?m=*{uid=1}
http://localhost:4242/api/query?start=1h-ago&m=sum:rate:system.disk.in_use{uid=1}
//第一个tag是 groupby的 如果不groupby第一个请用{} http://localhost:4242/api/query?start=1h-ago&m=sum:rate:1m-sum-null:system.disk.in_use{host=cfeng|wangxh.pc,device=*}{uid=1}&show_query=true&show_summary=true http://localhost:4242/api/query?start=1h-ago&m=sum:rate:1m-sum-null:system.disk.in_use{host=wangxh.pc,device=*}{uid=1}&m=sum:rate:1m-sum-null:system.disk.in_use{host=cfeng,device=*}{uid=1}&show_query=true&show_summary=true
https://app.datadoghq.com/series/batch_query
requests[0][from]:1487290901859 requests[0][to]:1487294501859 requests[0][interval]:20 requests[0][q]:avg:system.cpu.user{} by {host} + avg:cacti.hosts.count{} by {lv}, avg:cacti.hosts.count{} by {lv} requests[0][aggregator]:avg requests[0][type]:line requests[1][from]:1487290901859 requests[1][to]:1487294501859 requests[1][interval]:20 requests[1][q]:avg:system.core.count{} by {host} + avg:cacti.hosts.count{} by {lv}, avg:cacti.hosts.count{} by {lv} requests[1][aggregator]:avg requests[1][type]:line _authentication_token:f89dcfc0531c10bed68ae38662da53a65f2387d2
filter有个bug,先来分析下opentsdb的查询原理。
net/opentsdb/core/TsdbQuery.java
net/opentsdb/query/QueryUtil.java
根据上面整理的row_key_literals进行hbase表达式获取
现在因为findGroupBys有bug导致问题出现:
按道理,我们希望拿到如下组合的数据:[uid=1 host=test1] [uid=1 host=test2]因为groupBy为true那么结果应该是两条,对host进行了groupBy,如果groupBy为false那么应该是[uid=1 host=test1|test2]。实际的结果是[uid=1 host=test2]因为同一个tag key会进行覆盖host=test2覆盖了host=test1。
如果把uid=1这条删除,实际结果是[host=test1|test2],跟我的预期是一样的。那么问题来了,bug出在什么地方呢?
上面的代码注意几点:
Collections.sort(filters);//根据tag key的uid排序呢,参考TagVFilter中重载的compareTo。
2.row_key_literals里面存放的是所有的key=value值
key是tagk。value是一个list,list存放的是该tagk下面所有的tagv对应的uuid。
当为模糊匹配时候,row_key_literals 存放一个tagk=>null的键值对。只根据key进行查询,所有的值都查询出来。
因为循环时候tagk没有进行重新赋值,所以
这代码一直会命中,然后 row_key_literals.put(current.getTagkBytes(), values);导致覆盖,其中values应该是该tagk对应所有value的uuids才是正确的。
hbase数据查询
千万条数据中查询我们要的数据,采用的是KeyRegexpFilter这个是asynchbase进行过滤。
而aggregator不要去怀疑,没有别的办法,都是循环加减运算。net/opentsdb/core/Aggregators.java每种数据类型都有内置的sum avg等等,其中long类型的avg会取整,因为它知道我们存储的是long类型,认为我们需要的也是long类型,强制转换。