数据查询需要先构建一个 Query 对象。Query 对象表示查询条件,用于指定符合条件的 tags,metric,和聚合查询条件等。
构造查询条件
示例代码
构建一个 Query 对象,即查询条件:
Query query = Query
.timeRange(startTime, endTime) // 设置查询时间条件
.sub(SubQuery.metric("hello").aggregator(Aggregator.AVG).tag("tagk1", "tagv1").build()) // 设置子查询
.sub(SubQuery.metric("world").aggregator(Aggregator.SUM).tag("tagk2", "tagv2").build()) // 设置子查询
.build();
子查询
每个 Query 对象可以设置多个 SubQuery,进行多个条件的查询。
示例代码
一个典型的子查询的构造:
SubQuery subQuery = SubQuery
.metric("test-metric")
.aggregator(Aggregator.AVG)
.downsample("60m-avg")
.tag("tagk1", "tagv1")
.tag("tagk2", "tagv2")
.build();
其中,SubQuery 表示子查询对象,Aggregator 是一个枚举类型。
同步查询
TSDB SDK 提供了线程同步的数据查询。
示例代码
使用query方法同步的查询数据:
List<QueryResult> result = tsdb.query(query);
System.out.println("返回结果:" + result);
异步查询
TSDB SDK提供了线程异步的数据查询。
示例代码
使用query方法异步的查询数据,并通过设置回调来设置异步查询后的行为:
QueryCallback cb = new QueryCallback() {
@Override
public void response(Query input, List<QueryResult> result) {
System.out.println("查询参数:" + input);
System.out.println("返回结果:" + result);
}
};
tsdb.query(query, cb);
逆序排序查询
TSDB SDK提供查询结果的逆序和顺序返回。通过 getOrderDps(boolean ordeset)接口函数查询结果逆序排序的查询,getOrderDps(true) 实现逆序,getOrderDps() 实现时间戳顺序来返回结果。示例代码
Query query = Query
.timeRange(current - 1000,start + 1000)
.sub(SubQuery.metric(metric).aggregator(Aggregator.NONE).tag(tags).build())
.build();
try {
// 执行查询,并获取查询结果
List<QueryResult> result = tsdb.query(query);
for(QueryResult queryResult : result){
// 获取无序数据点
System.out.println(queryResult.getDps());
System.out.println("-------------");
// 获取按时间戳由小到大排序的数据点集合
System.out.println(queryResult.getOrderDps());
System.out.println("-------------");
// 获取按时间戳由大到小排序的数据点集合
System.out.println(queryResult.getOrderDps(true));
}
} catch (HttpUnknowStatusException e) {
e.printStackTrace();
}
查询结果
使用 query 方法查询的数据以List<QueryResult>
的形式返回,其中的QueryResult
是每个子查询的查询结果。您可以使用QueryResult
的getDps()
方法获取查询的数据。
最新数据点查询
TSDB SDK提供查询指定时间戳前的最新数据点功能。代码示例:
示例1
子查询条件为metric和tags的查询:
// 构建tags
Map<String,String> tags = new HashMap<String, String>();
tags.put("uid","1");
tags.put("id","6");
String metric = "test.1";
// 构建最新点查询
LastPointQuery query = LastPointQuery.builder()
// 指定时间戳
.timestamp(1537520409729l)
// 是否使用毫秒时间戳查询
.msResolution(true)
// 构建最新点子查询,用于查询指定时间线下的最新数据点,
// 可以同时指定多个子查询
.sub(LastPointSubQuery.builder(metric,tags).build()).build();
// 时间线最新点查询结果,每条时间线对应一个LastDataValue
List<LastDataValue> lastDataValues = tsdb.queryLast(query);
System.out.println(lastDataValues);
示例2
子查询条件为时间线ID(tsuid)的查询。
// 构造时间线Id集合
List<String> tsuids = new ArrayList<String>();
tsuids.add("10000B7C000095000081****FF00006F");
// 构建最新点查询
LastPointQuery query = LastPointQuery.builder()
// 指定时间戳
.timestamp(1537520409729l)
// 是否使用毫秒时间戳查询
.msResolution(true)
// 构建最新点子查询,用于查询指定时间线下的最新数据点,
// 可以同时指定多个子查询
.sub(LastPointSubQuery.builder(tsuids).build()).build();
// 时间线最新点查询结果,每条时间线对应一个LastDataValue
List<LastDataValue> lastDataValues = tsdb.queryLast(query);
System.out.println(lastDataValues);
其中,tsuids可以通过示例1的查询结果获取到,即首次使用示例1进行查询,将查询结果中的tsuids保存下来,下次可以直接使用tsuids来构建查询。