数据查询需要先构建一个 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 是一个枚举类型。

同步查询

时序引擎 SDK 提供了线程同步的数据查询。

示例代码

使用 query 方法同步的查询数据:

List<QueryResult> result = tsdb.query(query);
System.out.println("返回结果:" + result);

异步查询

时序引擎 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);

逆序排序查询

时序引擎 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()方法获取查询的数据。

最新数据点查询

时序引擎 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)
        // 以指定时间戳向前推进几个小时,默认为0,即指定时间戳所在的小时时间;
        // -1 表示向前推进直到找到数据为止
        .backScan(0)
        // 是否使用毫秒时间戳查询
        .msResolution(true)
        // 构建最新点子查询,用于查询指定时间线下的最新数据点,
        // 可以同时指定多个子查询
        .sub(LastPointSubQuery.builder(metric,tags).build()).build();

// 时间线最新点查询结果,每条时间线对应一个LastDataValue
List<LastDataValue> lastDataValues = tsdb.queryLast(query);

System.out.println(lastDataValues);

其中,tsuids可以通过示例1的查询结果获取到,即首次使用示例1进行查询,将查询结果中的tsuids保存下来,下次可以直接使用tsuids来构建查询。