前言
最近把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()) > :
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方式聚合:
選擇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