天天看點

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