天天看点

OpenTSDB 查询示例

前言

最近把OpenTSDB数据查询实现补上,还是基于HTTP请求接口的方式,使用python request包实现。本文总结自己的学习过程,用于日后参阅,以免忘记,也希望对其他人有点帮助!

需要一提的是,OpenTSDB中还有基于CLI Tools方式实现的查询,本文中不做介绍,读者可阅读CLI Query。

构造数据

开启本地安装的opentsdb服务,首先构造一段数据,一共8个点,插入OpenTSDB,代码如下:

# coding:utf-8
import requests


payload = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586540',
    "value": '29',
    "tags": {
        "host": "web01"
    }
}

payload1 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586541',
    "value": '30',
    "tags": {
        "host": "web01"
    }
}

payload2 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586542',
    "value": '29',
    "tags": {
        "host": "web02"
    }
}

payload3 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586543',
    "value": '23',
    "tags": {
        "host": "web01"
    }
}

payload4 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586544',
    "value": '23',
    "tags": {
        "host": "web02"
    }
}

payload5 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586545',
    "value": '33',
    "tags": {
        "host": "web01"
    }
}

payload6 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586546',
    "value": '22',
    "tags": {
        "host": "web02"
    }
}

payload7 = {
    "metric": "sys.cpu.data",
    "timestamp": '1490586547',
    "value": '23',
    "tags": {
        "host": "web02"
    }
}

ls = [payload, payload1, payload2, payload3, payload4, payload5, payload6, payload7]


def send_json(json):
    s = requests.Session()
    r = s.post("http://localhost:4242/api/put?details", json=json)
    return r.text


if __name__ == "__main__":
    print send_json(ls)
           

在 http://localhost:4242/ 查询,结果如下图:

OpenTSDB 查询示例

数据查询方式

一个最简单的查询必须包括,开始时间、指标名、聚合函数,如下图所示,详细信息可参考官网查询和读取数据:

OpenTSDB 查询示例

我这里用的是Python Request包模拟HTTP请求,进行数据查询!!这里分get请求和post请求两种方式。

get请求实现:

# -*- coding: utf-8 -*-
import requests


def get_data_by_get(query):
    r = requests.get("http://localhost:4242/api/query?" + query)
    if len(r.json()) > :
        dps = r.json()[]['dps']
        return dps
    else:
        return None


if __name__ == "__main__":
    print get_data_by_get('start=1490586530&m=sum:sys.cpu.data')
           

输出如下:

{u’1490586546’: 22, u’1490586547’: 23, u’1490586544’: 51, u’1490586545’: 56, u’1490586542’: 56, u’1490586543’: 49, u’1490586540’: 29, u’1490586541’: 30}

post请求实现:

# -*- coding: utf-8 -*-
import requests


def get_data_by_post(cond_dic):
    r = requests.post("http://localhost:4242/api/query", json=cond_dic)
    if len(r.json()) > :
        dps = r.json()[]['dps']
        return dps
    else:
        return None


def build_post_json():
    cond_dic = {
        "start": ,
        # "end": 1489836195,
        "queries": [
            {
                "aggregator": "sum",
                "metric": "sys.cpu.data",
                # "tags": {"host": "web01"}
            },
        ]
    }
    return cond_dic


if __name__ == "__main__":
    print get_data_by_post(build_post_json())
           

输出如下:

{u’1490586546’: 22, u’1490586547’: 23, u’1490586544’: 51, u’1490586545’: 56, u’1490586542’: 56, u’1490586543’: 49, u’1490586540’: 29, u’1490586541’: 30}

聚合

上面示例是基于Python的OpenTSDB查询和读取数据的基本实现,但是细心的朋友可以发现,插入数据的数值是:

1490586540 29
    1490586541 30
    1490586542 29
    1490586543 23
    1490586544 23
    1490586545 33
    1490586546 22
    1490586547 23
           

但是读取出来的数据的数值为:

1490586540 29
    1490586541 30
    1490586542 56
    1490586543 49
    1490586544 51
    1490586545 56
    1490586546 22
    1490586547 23
           

这里之所有有这样的差别,是因为聚合方式的差别。由上面的查询条件,得到的查询结果实质上是由 host=web01 和 host=web02 两组时间序列聚合而成(分别是sum聚合和zimsum聚合),选择不同的聚合方式,会产生不同的数据,在上面的查询条件中把”sum”改成”zimsum”就OK了。

关于host=web01和host=web02 两组时间序列原始数据的图形展示,可见本文的第一幅图所示。

在OpenTSDB自带的查询页面的中也可进行查询测试。

选择sum方式聚合:

OpenTSDB 查询示例

选择zimsum方式聚合:

OpenTSDB 查询示例

关于sum聚合和zimsum聚合的详细信息可参考官方Aggregation部分,其中也包含了其他的聚合方式,值得详细阅读。

小结和参考

本文展示了opentsdb数据查询的基本实现,若有更高级的查询需求,可使用其他查询组件实现。此外,本文还展示了不同的聚合方式对查询结果的影响,主要是“sum”、“zimsum”聚合的使用。这里是踩了坑的,之前对使用“sum”聚合得到的结果,十分不解,还是得好好阅读官方文档了。

参考资料都是官方的,个人认为以下资料比较重要,需要好好阅读:

聚合函数:

http://opentsdb.net/docs/build/html/user_guide/query/aggregators.html

查询接口介绍:

http://opentsdb.net/docs/build/html/user_guide/query/index.html

http://opentsdb.net/docs/build/html/api_http/query/index.html

查询示例:

http://opentsdb.net/docs/build/html/user_guide/query/examples.html