OpenTSDB查詢和寫入毫秒級數據


由於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)

毫秒級查詢直接返回所有數據,無聚合、降采

效果圖:

 

參考:

https://blog.csdn.net/zx711166/article/details/80913861

https://github.com/shifeng258/opentsdb-client


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM