1. 程式人生 > >OpenTSDB使用/ API / query進行資料查詢的java實現

OpenTSDB使用/ API / query進行資料查詢的java實現

 

2018年08月01日 22:26:46 jyj019 閱讀數:462

 版權宣告:雖然坑有點多,不過轉載請宣告原作者 https://blog.csdn.net/jyj1100/article/details/81347817

寫在前面,這裡是補充下java程式碼的一些實現,感謝同事w給我提供的幫助。參考文獻和其他文章列表放在末尾。


這篇文章講的OpenTSDB如何資料的java實現,實現步驟寫出來就比較簡單,也有其他一些方法,不過post應該是最普遍的:

這裡主要講解了一些查詢格式資料的拼裝,講了歷史資料點查詢,歷史資料段時間查詢,實時資料查詢共3種方式。對查詢資料的插值和聚合方式的設定採用了最簡單的一種,這個準備之後開新坑來講。

這裡面實時查詢的設定還有待研究,待補全。


歷史資料點查詢:

根據查詢時間點,metric和tags對資料進行查詢,比較重要的地方是對資料時間點那個時間戳進行處理,能達到一個比較好的查詢效果。

 
  1. public String historyQuerySinglePoint(List<String> Codes, String foo1, long timestamp) throws Exception {

  2.  
  3. //查詢範圍加大用於插值

  4. long startTime = timestamp - 1;

  5. long endTime = timestamp + 1;

  6.  
  7. tag.put(Foo1, foo1);

  8. //查詢標籤

  9. List<Map<String, Object>> qualityQueriesList = new ArrayList<>();

  10. for (String Codes : code) {

  11. //標籤

  12. Map<String, Object> qualityQuery = new HashMap<>();

  13. qualityQuery.put("metric", code);

  14. qualityQuery.put("tags", tag);

  15. qualityQuery.put("aggregator", "none");

  16. qualityQueriesList.add(qualityQuery);

  17. }

  18. //剩餘查詢條件!!!!!

  19. Map<String, Object> query = new HashMap<>();

  20. query.put("queries", qualityQueriesList);

  21. query.put("start", startTime);

  22. query.put("end", endTime);

  23.  
  24. //查詢條件轉為json字串

  25. String queriesJson = JSON.toJSONString(query, SerializerFeature.DisableCircularReferenceDetect);

  26.  
  27. //標籤查詢請求

  28. String wesult = HttpClientPost.post(URL, queriesJson);

  29.  
  30. //如果標籤查詢結果不為空準備進行結果資料組裝

  31. JSONArray resultsArr = null;

  32. if (StringUtils.isNotEmpty(result)) {

  33. resultsArr = JSON.parseArray(result);

  34. }

  35.  
  36.  
  37. //資料的組裝返回

  38. }


歷史時間段資料查詢:

基本和上面程式碼一樣,就是修改起始,終止時間為對應時間戳。

但是需要增加對起止時間長度的驗證,避免資料過長導致返回時間過長甚至失敗。

同時可以對取樣進行一些基礎的設定。

 
  1. public String historyQueryInterval(List<String> Codes, String foo1, String foo2, long startTime, long endTime, int sampleInterval, SampleFunc func) throws Exception {

  2.  
  3. tag.put(Foo1, foo1);

  4.  
  5. //查詢標籤

  6. List<Map<String, Object>> qualityQueriesList = new ArrayList<>();

  7. for (String Codes : code) {

  8. //標籤

  9. Map<String, Object> qualityQuery = new HashMap<>();

  10. qualityQuery.put("metric", code);

  11. qualityQuery.put("tags", tag);

  12. //下采樣的函式設定,省略具體內容

  13. query.put("downsample", sampleInterval + func.getFunc() );

  14. qualityQuery.put("aggregator", "none");

  15. qualityQueriesList.add(qualityQuery);

  16. }

  17. //剩餘查詢條件!!!!!

  18. Map<String, Object> query = new HashMap<>();

  19. query.put("queries", qualityQueriesList);

  20. query.put("start", startTime);

  21. query.put("end", endTime);

  22.  
  23. //查詢條件轉為json字串

  24. String queriesJson = JSON.toJSONString(query, SerializerFeature.DisableCircularReferenceDetect);

  25.  
  26. //標籤查詢請求

  27. String wesult = HttpClientPost.post(URL, queriesJson);

  28.  
  29. //如果標籤查詢結果不為空準備進行結果資料組裝

  30. JSONArray resultsArr = null;

  31. if (StringUtils.isNotEmpty(result)) {

  32. resultsArr = JSON.parseArray(result);

  33. }

  34.  
  35. //資料的組裝返回

  36. }


實時資料查詢:

實時查詢沒有采用時間戳,而是採用 resolveNames和backScan來實現,這和官方文件的必須有些衝突,具體資訊待研究。

 
  1. public String realTimeQuery(List<String> Codes, String foo1) throws Exception {

  2.  
  3. //查詢範圍加大用於插值

  4. long startTime = timestamp - 1;

  5. long endTime = timestamp + 1;

  6.  
  7. tag.put(Foo1, foo1);

  8. //查詢標籤

  9. List<Map<String, Object>> qualityQueriesList = new ArrayList<>();

  10. for (String Codes : code) {

  11. //標籤

  12. Map<String, Object> qualityQuery = new HashMap<>();

  13. qualityQuery.put("metric", code);

  14. qualityQuery.put("tags", tag);

  15. qualityQuery.put("aggregator", "none");

  16. qualityQueriesList.add(qualityQuery);

  17. }

  18.  
  19. //剩餘查詢條件!!!!

  20. Map<String, Object> query = new HashMap<>();

  21. query.put("queries", valueQueriesList);

  22. query.put("resolveNames", true);

  23. /**

  24. * 時序資料庫BackScan時間範圍,這裡BACK_SCAN=24

  25. */

  26. query.put("backScan", BACK_SCAN);

  27.  
  28. //查詢條件轉為json字串

  29. String queriesJson = JSON.toJSONString(query, SerializerFeature.DisableCircularReferenceDetect);

  30.  
  31. //標籤查詢請求

  32. String wesult = HttpClientPost.post(URL, queriesJson);

  33.  
  34. //如果標籤查詢結果不為空準備進行結果資料組裝

  35. JSONArray resultsArr = null;

  36. if (StringUtils.isNotEmpty(result)) {

  37. resultsArr = JSON.parseArray(result);

  38. }

  39.  
  40.  
  41. //資料的組裝返回

  42. }


OpenTSDB系列

OpenTSDB的/ API / PUT(opentsdb的輸入的api)簡介https://blog.csdn.net/jyj1100/article/details/81323705

OpenTSDB使用/ API / PUT進行資料儲存的java實現https://blog.csdn.net/jyj1100/article/details/81330623

(轉)opentsdb查詢的簡介——基礎知識和UI操作https://blog.csdn.net/jyj1100/article/details/81324017

OpenTSDB的/ API / query(opentsdb的查詢的api)簡介(一)https://blog.csdn.net/jyj1100/article/details/81326660

OpenTSDB的/ API / query(opentsdb的查詢的api)簡介(二)https://blog.csdn.net/jyj1100/article/details/81329290

OpenTSDB使用/ API / query進行資料查詢的java實現https://blog.csdn.net/jyj1100/article/details/81347817

其他OpenTSDB系列文章見

OpenTSDB系列目錄https://blog.csdn.net/jyj1100/article/details/83450282