天天看點

OpenTSDB資料寫入HTTP API接口,統計總記錄數

一.命名方案

OpenTSDB命名格式有點類似于RRD樣式,隻不過引入了标記(tags),使得名額(metric)更具有代表性和通用性,可以共享許多獨特的時間序列。通過标記的鍵值對組合來确定名額的唯一性,可以非常靈活的進行聚合函數的查詢。

RRD如果要記錄web1伺服器的第一個CPU的使用者空間使用量,命名的格式為web1.sys.cpu.0.user,如果有上千台伺服器,每台多核CPU,那麼需要命名很多來差別,如webN.sys.cpu.M.user。 對于OpenTSDB,可以這麼命名sys.cpu.user host=web1,cpu=0。如果要彙總所有核心的值,隻需sum:sys.cpu.user{host=web1}。如果要彙總上千台伺服器的CPU值,隻需sum:sys.cpu.user。比RRD命名格式更加的靈活通用。

是以,對于要監控的對象命名,要定義一個相同的共性,便于彙總,同時,要能很好的表達監控的項目。

二.名額命名規範

名額名稱區分大小寫,統一以小寫字母命名。

名額名稱不能含有空格。

名額名稱隻能含有下列字元:a-z,A-Z,0-9,-,_,.,/或Unicode字母。

名額名稱盡量精短。

三.名額值規範

名額值可以是整數也可以是浮點數。

四.時間戳

UNIX時間戳,可以是秒或毫秒,必需是整數,且不能超過13位數。毫秒級的時間戳格式必需是1234567890123,最後三位代表毫秒數。對于應用程式生成的時間戳超過13位的,必需四舍五入至最高13位,否則報錯。

由于OpenTSDB底層存儲系統HBase目前隻支援秒級别的存儲,是以對于毫秒級别的資料會轉換成秒。

五. 标記命名規範

标記是用來補充說明名額的,是名額的屬性,來對名額進行差異性的定義。

标記是一對鍵值對。

每個名額至少有一個标記。通常是host=ip或host=hostname。

OpenTSDB最多支援8個标記。

标記區分大小寫,統一以小寫字母命名。

标記不能含有空格。

标記隻能含有下列字元:a-z,A-Z,0-9,-,_,.,/或Unicode字母。

六. HTTP API接口

為了節省帶寬,該接口允許在一個單一的請求中送出多個資料點資料。每個資料點單獨處理,如果其中某個資料點有問題不會影響其他資料點的存儲。

  • 位址:
  1. /api/put
  2. /api/put?summary 調試,傳回彙總資訊
  3. /api/put?details 調試,傳回詳細資訊
  • 方法:POST
  • 格式:

    {

metric:     ”lvs.connection.active”,              //必需,字元串,名額名稱

timestamp:        1234567890,                            //必需,整型,時間戳

value:        11.11,                                             //必需,整型、浮點型、字元串,名額值

tags: {“host”:”web1”}                                     //必需,對象,标記對

}

  • 傳回結果:

預設情況下,如果所有資料存儲成功,響應一個204的狀态碼。如果有一個或多個資料點出錯,傳回400狀态碼和錯誤消息内容。

  1. 請求位址是/api/put?summary時,傳回:

    {

“failed”: 1,                            //整型,存儲失敗的資料點數量

“success”: 0                         //整型,存儲成功的資料點數量

}

  1. 請求位址是/api/put?details時,傳回:

    {

"errors": [  …],             //數組,失敗的資料點清單以及失敗原因

"failed": 1,

"success": 0

}

七. HTTP API接口執行個體

1. /api/put

# curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put HTTP/1.1204NoContent Content-Type:application/json;charset=UTF-8 Content-Length:0

2./api/put?summary

1 2 3 4 5 6 # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?summary HTTP/1.1200OK Content-Type:application/json;charset=UTF-8 Content-Length:24   {"failed":0,"success":1}

3. /api/put?details

2 3 4 5 6 # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP/1.1200OK Content-Type:application/json;charset=UTF-8 Content-Length:36   {"errors":[],"failed":0,"success":1}
2 3 4 5 6 # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP / 1.1 200 OK Content - Type : application / json ; charset = UTF - 8 Content - Length : 36   { "errors" : [ ] , "failed" : 0 , "success" : 1 }

OpenTSDB是一個基于HBase上的實時監控資訊收集和展示平台。它支援秒級資料采集metrics,使用HBase進行永久存儲,可以做容量規劃,并很容易的接入到現有的監控系統裡。OpenTSDB可以從大規模的裝置中擷取相應的metrics并進行存儲、索引以及服務,進而使得這些資料更容易讓人了解,如web化,圖形化等。

1. 安裝

Opentsdb依賴Gnuplot,它 是一個指令行的互動式繪圖工具。使用者通過輸入指令,可以逐漸設定或修改繪圖環境,并以圖形描述資料或函數,使我們可以借由圖形做更進一步的分析。

1 yum install - y gnuplot

Opentsdb目前有現成的rpm、deb打包,非常友善。下載下傳連結:https://github.com/OpenTSDB/opentsdb/releases .下面我們安裝rpm。

1 yum localinstall opentsdb - 2.0.1.noarch.rpm

配置

1 2 3 4 5 6 7 vim / etc / opentsdb / opentsdb .conf #TSDB通訊的端口 tsd .network .port = 4242 #資料儲存到儲存到HBase表下 tsd .storage .hbase .data_table = tsdb #ZooKeeper Quorum tsd .storage .hbase .zk_quorum = hadoop01 : 2181 , hadoop02 : 2181 , hadoop03 : 2181

配置完成後,我們通過下面指令在HBase中建立opentsdb所需的表。預設情況下opentsdb建立的HBase表啟用了lzo壓縮。需要開啟Hadoop中的lzo壓縮支援, 這裡我們直接在下面腳本中把COMPRESSION的支援關閉:

1 2 vim / usr / share / opentsdb / tools / create_table .sh COMPRESSION = NONE

然後在HBase使用者下執行下面腳本,在HBase中create所需的幾張表。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 / usr / share / opentsdb / tools / create_table . sh Hbase :: Table - tsdb - uid create 'tsdb' ,    { NAME = > 't' , VERSIONS = > 1 , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4220 seconds Hbase :: Table - tsdb create 'tsdb-tree' ,    { NAME = > 't' , VERSIONS = > 1 , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4140 seconds Hbase :: Table - tsdb - tree create 'tsdb-meta' ,    { NAME = > 'name' , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4200 seconds Hbase :: Table - tsdb - meta

啟動tsd(Time Series Daemon)服務,該指令有一些常用參數,會覆寫/etc/opentsdb/opentsdb.conf中的配置。參數清單如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 Usage : tsd -- port = PORT -- staticroot = PATH -- cachedir = PATH Starts the TSD , the Time Series Daemon -- async - io = true | false Use async NIO ( default true ) or traditionalblocking io -- auto - metric         Automatically add metrics to tsdb as they are inserted .    Warning : this may cause unexpected metrics to be tracked -- cachedir = PATH       Directory underwhich to cache result of requests . -- flush - interval = MSEC Maximum time for which a new data point canbe buffered ( default : 1000 ) . -- port = NUM             TCPport to listen on . -- staticroot = PATH     Web root from which toserve static files ( / s URLs ) . -- table = TABLE         Nameof the HBase table where to store the time series ( default : tsdb ) . -- uidtable = TABLE       Name of theHBase table to use for Unique IDs ( default : tsdb - uid ) . -- worker - threads = NUM   Number for async io workers ( default : cpu * 2 ) . -- zkbasedir = PATH       Path underwhich is the znode for the - ROOT - region ( default : / hbase ) . -- zkquorum = SPEC       Specificationof the ZooKeeper quorum to use ( default : localhost ) .

那麼我們通過14242端口啟動TSD。

1 2 3 sudo - u hbase tsdb tsd -- port 14242 …… 2015 - 03 - 12 17 : 04 : 52 , 253 INFO    [ main ] TSDMain : Ready to serve on / 0.0.0.0 : 14242

OK!下面我們打開URL:http://debugo01:14242/

OpenTSDB資料寫入HTTP API接口,統計總記錄數

Opentsdb已經安裝成功!

2. OpenTSDB設計探索

在OpenTSDB中,有下面一個基本的概念:

Metric:一個可測量的機關的标稱。metric不包括一個數值或一個時間,其僅僅是一個标簽,包含數值和時間的叫datapoints,metric是用逗号連接配接的不允許有空格,例如:proc.loadavg.5m

Timestamp:一個絕對時間戳值。

Tags:tag描述被測量的實體,Tags由tag key和tag value組成,前者表示一個分組,後者表示一個特定的項。

Data Point:可以被記錄為某一個Timestamp的一個數值。

Time Series:一個metric的帶有多個tag的data point集合。

UID:在OpenTSDB中,每一個metric、tagk或者tagv在建立的時候被配置設定一個唯一辨別叫做UID,他們組合在一起可以建立一個序列的UID或者TSUID。在OpenTSDB的存儲中,對于每一個metric、tagk或者tagv都存在從0開始的計數器,每來一個新的metric、tagk或者tagv,對應的計數器就會加1。

TSUID。當一個data point被寫到OpenTSDB時,其row key格式為: [… ],不考慮時間戳的話,将其餘部分都轉換為UID,然後拼在一起,就可以組成為TSUID。在OpenTSDB中,所有資料存儲在一張叫做tsdb的表中,這是為了充分利用hbase有序和region分布式的特點。所有的值都儲存在唯一列簇t中。TSD啟動後會接收到監控資料,包括名額(metric_uid)、時間戳、資料、tag标簽,tag标簽包括tag名稱ID和tag值ID。

根據HBase rowkey有序的原則,rowkey為 [… ],UID預設編碼為3 Bytes,而時間戳為4 Bytes編碼。例如:proc.loadavg.5m 1292148123 42 host=debugo01

對于名額proc.loadavg.5m的ID為:[0, 0, 1], 标簽名稱的ID為:[0, 0, 1] debugo01标簽值的ID為:[0, 0, 1],他們組成rowkey:

1 2 3 4 5 [ 0 , 0 ,    1 , 77 , 4 , - 99 , 32 , 0 , 0 , 1 , 0 , 0 ,    1 ] ` -- -- -- - '  `------------'    ` -- -- - '  `------' metric ID   base timestamp   name ID   value ID                              ` -- -- -- -- -- -- -- -'                                  first tag   

由此可見,對于metric + tags相同的資料都會連續存放,且metic相同的資料也會連續存放,這樣對于scan以及做aggregation都非常有幫助。

Opentsdb使用一個單獨的較小的表叫做tsdb-uid用來存儲UID映射,包括正向的和反向的。存在兩列簇,一個列簇叫做name用來将一個UID映射到一個字元串,另一個列族叫做id,用來将字元串映射到UID。列簇的每一行都至少有以下三列中的一個:

metrics 将metric的名稱映射到UID

tagk 将tag名稱映射到UID

tagv 将tag的值映射到UID

3. 使用OpenTSDB

首先建立metrics,指令會輸出它的UID。

1 2 # sudo -u hbase tsdb mkmetric proc.loadavg.1m metrics proc . loadavg . 1mproc.loadavg.1m : [ 0 , 0 , 1 ]

編寫資料加載腳本,腳本來自http://scm.zoomquiet.io/data/20131204123732/index.html

1 2 3 4 5 6 7 8 9 10 11 cat > loadavg - collector .sh << \ EOF #!/bin/bash set - e while true ; do awk - v now = ` date + % s ` - v host = ` hostname ` \ '{ print "put proc.loadavg.1m " now " " $1" host=" host;}' / proc / loadavg    sleep 15 done | nc - w 30 debugo01 14242 EOF chmod + x loadavg - collector .sh nohup . / loadavg - collector .sh &

每隔15秒會輸出如下資訊到tsd

1 2 put proc . loadavg . 1m 1288946927 0.36 host = debugo01 …

通過Scan UID表可以找到它們對應的UID。

1 2 3 \ x00 \ x00 \ x01                     column = name : metrics , timestamp = 1426212849709 , value = proc . loadavg . 1m          \ x00 \ x00 \ x01                     column = name : tagk , timestamp = 1426214303614 , value = host                                        \ x00 \ x00 \ x01                     column = name : tagv , timestamp = 1426214303641 , value = hadoop01   

在Web頁面中輸入相應的metrics,可以得到資料的圖展示:

OpenTSDB資料寫入HTTP API接口,統計總記錄數

^^

OpenTSDB所有的配置都在 link. 這裡列出來的配置基本都有預設值,但是有些需要根據環境和性能做出改變,具體如下表:

配置項 預設值 描述 修改值

tsd.core.preload_uid_cache

false 是否在TSD啟動的時候,預熱UID緩存資料,為了提升性能,需要開啟 true

tsd.core.auto_create_metrics

false 一個新的metric存入tsdb時,是否自動為其生成UID,如果true,存入成功,反之,失敗。(按照最大優化性能的目标來說,應該預先為所有的metric生成UID,但是實際中預先不知道所有的metric,是以這個值需要設定為true) true

tsd.http.cachedir

tsd寫臨時檔案的目錄 根據實際環境設定,比如/tmp/opentsdb

tsd.http.request.enable_chunked

false Http寫入資料時是否支援一次寫入大批量的資料 true

tsd.http.request.max_chunk

4096 寫入的批量資料的上限 根據需要增大,比如65535

tsd.http.staticroot

opentsdb頁面的靜态資源檔案目錄 安裝目錄下 ./build/staticroot

tsd.network.port

tsd讀寫資料的端口 根據實際配置 比如9099

tsd.query.timeout

tsd查詢的timeout,如果為0,則不會timeout 合理配置。 比如200

tsd.storage.enable_appends

false 2.2版本,tsd 寫資料到HBase有兩種方式,一種是每來一條資料append到hbase, 一種是先緩存大量資料到tsd記憶體,然後進行compaction,一些性寫入。推薦Append方式 true

tsd.storage.enable_compaction

true append打開,這種就關閉 false

tsd.storage.fix_duplicates

false 相同時間存儲相同metric的時候(重複資料),最新寫入的覆寫前面的值 true

tsd.storage.hbase.zk_basedir

/hbase hbase 的zk的目錄 根據實際配置

tsd.storage.hbase.zk_quorum

localhost hbase 的zk位址 根據實際配置

實際使用中,還需要根據metric的具體情況調整一些配置項,比如salt, uid.width等。

參考

http://scm.zoomquiet.io/data/20131204123732/index.html

http://www.cnblogs.com/gsblog/p/4029894.html

2 3 4 5 6

# curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP / 1.1 200 OK Content - Type : application / json ; charset = UTF - 8 Content - Length : 36   { "errors" : [ ] , "failed" : 0 , "success" : 1 }

統計總記錄數: 因為metric必填,是以隻能循環統計相加 參數類似如下: {

"start": 1508428800,

"end":1509168535,

"queries": [

{

"aggregator": "sum",

"metric": "meter.current.phase.b",

        "downsample": "0all-count"

}]

}

繼續閱讀