前言
最近把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