rrdtool

一.RRDTool簡介

RRDTool是一個高性能的數據記錄及繪圖工具,主要用於處理時間序列數據比如網絡帶寬、房間溫度、CPU負載、服務器負載及對其它網絡設備進行監控的數據等。它能讓管理記錄和分析通過SNMP從其它任意數據源 (Data Source) 獲取到的時間序列數據,並能將這些數據以圖形化的方式予以展示。RRDTool記錄數據的文件名後綴通常爲.rrd,而且其能夠存儲的數據的總量不會改變。因爲當文件寫滿之後,新生成的數據會覆蓋當前文件中最早生成的數據。其作者爲Tobi Oeticker。

RRDTool提供了幾個子命令實現對.rrd文件的管理,如create, update, updatev, graph, dump, restore, fetch, tune, last, info, rrdresize, xport, flushcached和rrdcgi等。有此開發語言直接內嵌了RRDTool,如PHP, tcl, Perl, Python等。

RRDTool只能繪製線條或區域形圖,也可以是兩者的綜合。一般說來,RRDTool能繪製以下四種類型的圖形:

LINE: 線條

VRULE: 垂線

HRULE: 水平線

AREA: 區域


1.1 使用RRDTool繪圖的步驟:

a、使用rrdtool create命令創建一個新的RRD數據文件;

b、使用rrdtool update爲前面創建的RRD數據文件提供數據;此數據需要週期性的進行更新,因此,應該將rrdtool update創建爲cron任務;

c、使用rrdtool graph從RRD數據文件中獲取數據並繪圖;


1.2rrdtool create命令的用法:

語法:

rrdtool create filename [--start|-b start time] [--step|-s step] [--no-overwrite] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]

此命令用於創建初始的RRD數據文件,創建完成後文件大小爲其最終大小,裏面初始數據以*UNKNOWN*進行填充;文件名通常以.rrd結尾。

--start|-b start time (default: now - 10s): 用於指定開始向文件中記錄數據的起始時間,此時間爲1970年1月1日起至指定起始時間所經過的秒數;這裏不接受已經過去的時間。

--step|-s step (default: 300 seconds): 記錄數據的時間間隔;

--no-overwrite:不覆蓋一個已經存在的rrd數據文件;

DS:ds-name:DST:dst arguments

DS: 用於指定向此rrd文件記錄數據的數據源(Data Source)。一個RRD文件可以接受多個不同的數據源的數據,如某主機某網卡的入站數據流量和出站數據流量等。

ds-name: 當前數據源的名稱(以便在其它地方引用)。數據源的名稱長度不能超過19個字符,而且只能包含字母和數字。

DST: Data Source Type,即數據源類型。RRDTool中的數據源類型有GAUGE, COUNTER, DERIVEA, ABSOLUTE和COMPUTE等。

前四種的用法格式爲:DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max

COMPUTE的用法格式爲:DS:ds-name:COMPUTE:rpn-expression

heartbeat:在指定的更新時間間隔到達時,rrd文件期望接收到新的數據。而由於各種原因,更新數據的到達時間可能會有誤差。此處的heartbeat則用於指定此RRD文件所能夠接受的更新數據最長到達時間長度。

min和max: 用於此RRD文件爲當前數據源產生的數據指定一個接受範圍,max爲其上限,min爲其下限。而超出此範圍的數據都被標識爲*UNKNOWN*。在爲某數據源指定上限和下限時,通常用其理論上的最大值和最小值。

RRA:CF:cf arguments

RRD文件的目的之一就是存儲RRA(Round Robin Archives)數據。對一個數據源來說,一個archive通常由一系列的數值或統計值組成。在RRD文件中,每個RRA是分開存儲的,因此每個RRA都需要專門進行定義。

每當一個更新數據被記入RRD文件時,其都會被查找一個與之對應的“時間點”處,此即爲一個PDP(Primary Data Point)。

同時,這些數據會被RRA中定義的統計函數(Consolidation Function)進行處理後再進行記錄。

CF就是用於指定對數據進行處理的統計函數,它們包括AVERAGE、MIN、MAX和LAST。當然,通過這些函數計算過的數據可能會丟失一部分精度或信息。

RRA一行詳細的語法格式爲RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows

其中xff爲xfiles factor,用來定義當PDP的數據爲*UNKNOWN*的部分小於多大百分比時,統計的結果仍然可以標記爲某具體值。因此,xff取值範圍爲0到1之間的任意值。

steps用於定義有多少PDP用於CF進行彙總並記入RRD文件中;rows用記定義每一個RRA中共保存多少個生成的數據記錄。

關於DST的詳細說明:

GAUGE:這是最常用的DST,即某指標當前的直接值,而不用再經過rrdtool解析;

COUNTER: 計數器,需要持續性遞增類的數值,比如經由某網卡所傳輸的字節數;如果計數器發生溢出,RRDTool會試圖猜測出其正確的值。

DERIVE:類似COUNTER,但不對其值作溢出與否的檢查和猜測。

ABSOLUTE: 類似COUNTER,但每次計數都將計數器清零後直接計數。

COMPUTE: 用於記錄將本RRD中其它數據源中的數據經過某表達式處理後的數據。


舉例

每隔5s生成一個隨機數

觀察 5s 50s 500s的平局

加入至少一天的每5s 86400/5個數據

至少一週的每50s的

一個月的每500s的數據

rrdtool create test.rrd -s 5 DS:testds:GAUGE:8:0:U RRA:AVERAGE:0.5:1:17280【一天】 RRA:AVERAGE:0.5:10:3456 【2天】 RRA:AVERAGE:0.5:100:1210 【一週】

使用rrdtool info test。rrd 可以查看文件的格式

比如更新數據

rrdtool update test.rrd N:$RANDOM N 表示當前時間

查看結果

rrdtool fetch test.rrd AVERAGE

編寫一個腳本,不停的給出一些數字

#!/bin/bash

while true;do

rrdtool update test.rrd N:$RANDOM

sleep 5

done

然後在前臺執行

bash -x 腳本名字

過一會兒後執行

rrdtool fetch -r 5 test.rrd AVERAGE -r 5 知名時間跨度


1.3 rrdtool update用法

rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--daemon address] [--] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] ...]

rrdtool update用於向RRD文件提供時間序列數據。updatev是update的增強版,其中v表示verbose,其通返回值比update更豐富和詳細。


1.4 語法解析

filename:要更新的RRD文件

--template|-t ds-name[:ds-name]...: 默認情況下,除了COMPUTE類型的外,update期望其接受的數據完全符合RRD中數據源的定義次序。如果需要自己指定其接受的數據及與數據源對應的次序,則可以使用--template選項來實現。注意,不要爲COMPUTE類型的數據源指定要更新的數據。

--daemon address: 如果使用此選項,則意味着RRDTool將試圖從指定的caching daemon接收更新數據。

N|timestamp:value[:value...]:用於指定向RRD提供的數據更新所產生的時間,這個可以是timestamp類型的數據,也可用N表示使用系統當前時間。負值則表示以當前時間爲基準向前退回的時間點;而使用負值時,選項和數據之間必須使用--隔開,否則時間將會被解析爲選項。而value部分則是向DS提供的更新數據,這些數據的次序要跟RRA中的數據源資源保持一致。如果某特定數據源沒有產生新的數據,則用U來標識。多個數據源的值之間使用冒號隔開。


1.5 rrdtool graph用法

rrdtool graph|graphv filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]

rrdtool graph基於一個或多個data definition收集所需要數據實現繪圖,而這些data definition可以來自一個或多個RRD數據文件。

如果想通過graph顯示平均值、最大值、百分比值等,則最好通過使用variable definition語句實現。

同時,從RRA中取得的數值已經進行聚合,因此,其在圖形中僅表現爲一個像素點。

然而,有時候從RRA中取得數據未必如期望展示的那樣,比如以byte爲單位收集的數據,而展示時想以bit爲單位。

此時則可以使用data calculation來實現此種轉換,這種轉換過程要通過RPN命令來實現。


1.6 語法解析

filename: graph命令生成的圖像的路徑和文件名,文件名一般以.png、.svg或.eps爲後綴;如果文件名使用-,則表示圖像直接發往標準輸出。

[-s|--start time] [-e|--end time] [-S|--step seconds] :start和end用於指定顯示圖像用到的數據所來自的時間序列範圍,

默認爲前1天至此刻的時間跨度,這也是具有最好解析度的時間跨度。start和end接受多種時間格式爲其值。默認情況下,

rrdtool graph會計算在指定的時間跨度內1個像素所對應的時間長度,並以之爲解析度從RRA中獲取數據;

而step選項則可以讓用戶指定使用的解析度,比如,如果想以一個小時的時長爲解析度,則可以爲step指定3600這個值。

當然,如果指定的解析度小於一個像素則會被忽略。

[-t|--title string] [-v|--vertical-label string]:title用於指定圖像上方的標題,而vertical-label則可以指定縱軸的標題。

[-w|--width pixels] [-h|--height pixels] [-j|--only-graph] [-D|--full-size-mode]:

width和height用於指定畫布的大小,默認爲400X100。如果使用full-size-mode,則圖像大小會自適應進行變化。

如果使用only-graph選項,並且指定的height的值小於32,則圖像會被保存爲微型圖像,即預覽圖。

[-u|--upper-limit value] [-l|--lower-limit value] [-r|--rigid]:

默認情況下,圖像會自動調整其縱軸的刻度,以適應展示所有的可能值。當然,可以在命令中使用upper-limit指定其能展示的最大值,

lower-limit指定其能表現的最小值;根據實際數據大小,指定了upper-limit和lower-limit後圖像依然會進行自適應,除了使用rigid選項進行限定。

[-A|--alt-autoscale]:有時使用默認的算法來實現縱軸自適應的功能不能予以滿足,alt-autoscale選項則可以通過自動調整其能夠表現的最大值和最小值避免此種情況的出現。如果僅想自動調整所表現的最大值,則可以使用alt-autoscale-max,僅想自動調整其能表現的最小值,則使用alt-autoscale-min。


1.7 Data and variables有三種格式:

DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]

CDEF:vname=RPN expression

VDEF:vname=RPN expression

在正常的圖形展示中,至少需要一個DEF和一個LINE, AREA, GPRINT或PRINT四者之一的語句。

上面的這三種語句都可以從RRD文件中獲取數據,甚至還可以對獲取到的數據針對實際需要進行換算或調整。如果需要將獲取到的數據進行換算或調整,可以通過定義變量來進行。

變量名稱只能包括字母、數據和-和_,而且其最大長度不能超過255個。

DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>]

這個命令能夠從RRD中取得數據,而vname所保存的值可以在整個腳本中使用。默認情況下,在一個正確的解析度上保存了正確統計值的RRA將被選用,當然,也可以使用--step選項改變默認的解析度。而--step指定的解析度還可以被此命令中的step指定的值所覆蓋。此處的時間跨度跟rrdtool graph的命令所使用的跨度相同,然後也可以在此處爲start和end指定一個具體的值來覆蓋命令中的跨度。但是,在時間中所使用的冒號必須要進行轉義。

如果數據的解析度高於圖像的解析度,數據將會被進一步聚合以適應圖像的解析度,這使得圖形展示的能力大於實際時間跨度。然而,理想情況下,一個像素對應RRA文件中的一個CDP(Consolidate Data Point)是最好的。比如,以3600秒爲解析度,那麼一個寬度爲400的圖像所能夠展示的時間跨度爲400*3600秒,即400個小時。


1.8 定義圖像

LINE[width]:value[#color][:[legend][:STACK]][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]

繪製線形圖,width用於指定線條條的寬度,可以是個浮點數。顏色使用三組兩位16進制的數字分別表示紅色、綠色和藍色值。如果不指定顏色,線條將不可見。value可以是來自於DEF、VDEF或CDEF變量的值。legend爲圖例說明,需要指定爲所需要的字符串,以表示說明此線條圖代表的意義。STACK選項用於跟其它線形圖或區域圖共同展示時處於最上方。

AREA:value[#color][:[legend][:STACK]]

除了圖形爲面積圖外,其中的選項的用法與LINE一致。

VRULE:time#color[:legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]

在某時間點繪製一條垂直線。此時間值只能是來自於VDEF的數值或變量。

HRULE:value#color[:legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]

在某值處繪製一條水平線。其繪製出的樣子類似於LINE,但對圖像的自適應沒有影響,即如果指定的水平線所處的值位於圖像之外,其將不可見。


1.9 VDEF

VDEF:vname=RPN expression

此命令用於根據RPN語句返回一個值或一個時間。


2.0 CDEF

CDEF:vname=RPN expression

此命令用於在一個或多個數據序列之外創建一個新的數據點集合(在內存中完成),則RPN指令用於在這些數據點上以某數學函數進行求值,並將結果保存至vname中。例如CDEF:mydatabits=mydata,8,*

GPRINT:vname:format[:strftime]

strftime中的時間值只能來自於VDEF。format中的字符會原樣輸出,除了%引導的格式符。

舉例

rrdtool graph test.png -s 1352852265 --step 50 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE LINE1:vname#ff0000:testline

rrdtool graph test.png -s 1352852265 --step 5 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE LINE1:vname#ff0000:testline

rrdtool graph test.png -s 1352852265 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE:step=5 DEF:vname1=test.rrd:testds:AVERAGE:step=50 LINE1:vname#ff0000:testline1 LINE2:vname1:00ff00:testline2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章