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

posted @ 2019-09-05 18:17  猫不夜行  阅读(3403)  评论(0编辑  收藏  举报