資料查詢需要先構建一個 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來構建查詢。