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

猜你喜欢

转载自blog.csdn.net/wangshuminjava/article/details/86221466