由于OpenTSDB没有支持Java的SDK进行调用,所以基于Java开发OpenTSDB的调用将要依靠HTTP请求的方式进行。
1.毫秒级数据写入
/api/put:通过POST方式插入JSON格式数据,将毫秒级的时间戳赋值给timestamp参数即可,JSON格式:
{ "metric":"self.test", "timestamp":1567675709879, "value":20, "tags":{ "host":"web1" } }
Java中毫秒级时间戳获取方式:
// 获取当前时间的Unix时间戳 long millisecond = System.currentTimeMillis(); long millisecond2 = DateTimeUtil.stringLongToMillisecond("2019/09/05 17:28:29:879"); // 日期时间格式字符串转换为(Unix时间戳)长整型类型 public static long stringLongToMillisecond(String string) throws Exception { return stringLongToDate(string).getTime(); } // 日期时间格式字符串转换为Date类型 public static Date stringLongToDate(String string) throws Exception { return sdfLong.parse(string); } private static SimpleDateFormat sdfLong = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
2.毫秒级数据查询
主要是设置msResolution这个参数,如果该字段为false,则同一秒内的点将按照 aggregator 指定的方式聚合得到该秒的终值
(在查询时默认返回秒级数据(按照查询中指定的聚合方式对 1秒内的时序数据进行采样聚合,形成终结果))
/api/query:可以选择 Get 或者 Post 两种方式,推荐使用 Post 方式,请求JSON 格式:
{ "start": 1456123705, // 该查询的起始时间 "end": 1456124985, // 该查询的结束时间 "globalAnnotation": false, // 查询结果中是否返回 global annotation "noAnnotations": false, // 查询结果中是否返回 annotation "msResolution": true, // 返回的点的精度是否为毫秒级,如果该字段为false, // 则同一秒内的点将按照 aggregator 指定的方式聚合得到该秒的终值 "showTSUIDs": true, // 查询结果中是否携带 tsuid "showQuery": true, // 查询结果中是否返回对应的子查询 "showSummary": false, // 查询结果中是否携带此次查询时间的一些摘要信息 "showStats": false, // 查询结果中是否携带此次查询时间的一些详细信息 "delete": false, // 注意:如果该值设为true,则所有符合此次查询条件的点都会被删除 "queries": [ // 子查询,为一个数组,可以指定多条相互独立的子查询 ] }
子查询格式:
{ "metric": "JVM_Heap_Memory_Usage_MB", // 查询使用的 metric "aggregator": "sum", // 使用的聚合函数 "downsample": "1ms", // 采样时间间隔和采样函数 "tags": { // tag组合,在OpenTSDB 2.0 中已经标记为废弃 // 推荐使用下面的 filters 字段 "host": "server01" }, "filters": [], // TagFilter,下面将详细介绍 Filter 相关的内容 "explicitTags": false, // 查询结果是否只包含 filter 中出现的 tag "rate": false, // 是否将查询结果转换成 rate "rateOption": {} // 记录了 rate 相关的参数,具体参数后面会进行介绍 }
3.测试结果
向OpenTSDB中插入两条时间相差1ms的数据
分别采用秒级和毫秒级对该时间段进行查询,结果:
秒级查询结果:[{"metric":"metric1","tags":{"tag1":"test","tag2":"mort"},"aggregateTags":[],"dps":{"1567675709":43.0}}]
毫秒级查询结果:[{"metric":"metric1","tags":{"tag1":"test","tag2":"mort"},"aggregateTags":[],"dps":{"1567675709879":21.0,"1567675709880":22.0}}]
秒级查询返回一条数据(将两条进行聚合,代码中zimsum方式,返回21+22)
毫秒级查询直接返回所有数据,无聚合、降采
效果图:
参考: