由於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)
毫秒級查詢直接返回所有數據,無聚合、降采
效果圖:
參考: