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/ 查询,结果如下图:
这里写图片描述

数据查询方式

一个最简单的查询必须包括,开始时间、指标名、聚合函数,如下图所示,详细信息可参考官网查询和读取数据
这里写图片描述
我这里用的是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()) > 0:
        dps = r.json()[0]['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()) > 0:
        dps = r.json()[0]['dps']
        return dps
    else:
        return None


def build_post_json():
    cond_dic = {
        "start": 1490586530,
        # "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方式聚合:
这里写图片描述
选择zimsum方式聚合:
这里写图片描述

关于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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值