使用RRDTOOL來繪製流量圖

URL Link //n.sfs.tw/13078

2019-02-02 02:33:43 By 張○○

MRTG的作者 Tobias Oetiker(瑞士) [1]所製作的工具,可以自行定義和繪製流量圖形。

MRTG是個簡單的流量圖繪製工具,但是如果要繪製比較複雜一點的圖形,MRTG就不夠力,因此他另外提供了 RRDTool。

要使用RRDTool 可分為三個部分:

1. 建立RRD資料庫
2. 餵入資料
3. 繪製圖形

當然用說的很簡單,每個步驟都不是很容易上手,但是他繪製的圖形很優美,吸引不少人去學習他,要說到RRDTool的說明文件,不得不提StudyArea[2] abelyang 所寫的文章,可作為初學者的第一步,美中不足的是因為年代久遠,文中有些設定已經作廢。由於功能強大,我還有很多沒搞清楚,因此就我知道的作說明。

例如這是一個RRDTools繪製的範例圖

<<以下部分中文說明的用語是我自己編的>>

安裝

請看 [CENTOS7] 安裝rrdtool+RRDs+PERL

 

建立RRD資料庫

RRD資料庫有別於純文字的log檔,他是2進位檔,得利用 rrdtool create 建立。

請下此指令,因為指令很長,所以每一行後面有個反斜線'\' 告訴系統指令沒打完,'\'後面不要再有其他的字元

rrdtool create a.rrd --start '-2day' --step 300 \
DS:item1:COUNTER:600:0:U \
DS:item2:COUNTER:600:0:U \
DS:item3:COUNTER:600:0:U \
RRA:MAX:0.5:1:2016 \
RRA:AVERAGE:0.5:1:2016 \
RRA:LAST:0.5:1:2016

第1行 上面的範例建立一個 a.rrd的資料庫,
--start 資料啟始時間,可以使用時戳或是文字,例如 --start 154421200、--start '-6month'
--step 每筆資料的間隔時間(秒) 300代表5分鐘

第2-4行
DS 代表資料類型,等同於資料表中的欄位,他的格式是這樣的

DS:欄位名稱:類型:心跳值:最小值:最大值

  類型可使用

  GAUGE 資料是多少就多少,例如溫度、濕度、目前時速等
  COUNTER 資料是累加的要選這個,例如累積流量,累積里程、電表度數等
  DCOUNTER 同上,但是資料是有小數點的倍精數
  DERIVE |  DDERIVE | ABSOLUTE | COMPUTE
這些我沒搞懂

  心跳值(heartbeat)

    基本上此值是step的2倍,例如設定為600時,假設要取12:00的數據,而前後300秒的值(11:55-12:05) 經過平均或是取最大或最小都算是12:00的有效值。

  最小值

    此數據能接受的最小值,小於此值則該筆數據被忽略,不限定的話可設定為大寫的U

  最大值

    此數據能接受的最大值,大於此值則該筆數據被忽略,不限定的話可設定為大寫的U

第5-7行

RRA 是 Round Robin Archive ,定義數據收集的方式,他的格式是這樣:

RRA:歸檔方式:未知容許比率:幾筆算成一個小單元:最大小單元數

  歸檔方式

   有四種可選 AVERAGE | MIN | MAX | LAST

  未知容許比率

   可設定0~1,這個數值代表可接受未知數據的比例,例如你由10筆記錄組成1個RRA的小單元(稱之為CDP),設定0.7的話,你只能容許有6筆資料遺失,如果遺失7筆的話,此小單元就定義為缺失(Unknown),換句話說,設為0不容許任何遺失,設為1全部遺失才是Unknown。當然如果你的小單元是只有一個數據組成的話,設成多少都不重要。

  幾筆算成一個小單元

  例如12筆5分鐘資料設為一個小單元,則設定為12

  最大小單元數

  超過此值會被刪除,如此而已

 

餵入資料

餵入資料比較簡單,只要把資料用冒號串起來就好

rrdtool update a.rrd 1549082701:1236:3180:0

但有一些限制:

1. 欄位數一定要完全相同否則會被拒絕

2. 第一筆一定是時戳,後再帶入欄位的資料,如上例中我有3個DS:時戳:DS1:DS2:DS3。

3. 時戳一定要比rrd限定時戳來得大,例如建立時有指定 --start '-2day',因此不能餵入二天以前的數據。

4. 要循序,舊的資料要先餵,否則會出錯。

餵入資料是個漫長的過程,我餵入過10,000,000行的資料(1000個檔案),花了11個小時。

 

繪製圖形

繪圖不太容易

rrdtool graph a.png \
-a PNG --title 'in Query範例' \
--vertical-label "數量/s" \
--width 400 \
--start  '-1day' \
--x-grid 'HOUR:1:HOUR:6:HOUR:4:0:%H' \
'DEF:s1=a.rrd:item1:AVERAGE:start=-2day' \
'DEF:s2=a.rrd:item2:MAX' \
'DEF:s3=a.rrd:item1:MIN' \
'CDEF:c2=s1' \
'SHIFT:c2:86400' \
'AREA:s2#00ff00:Switch 2min' \
'AREA:s3#F0ffc0:Switchn:STACK' \
'LINE1:c2#ff00E0:Switch 1avg' \
"COMMENT:各 PORT 流量統計---平均-------最小" \
'GPRINT:s1:LAST:count\: %7.2lf ' \
'GPRINT:c2:LAST:上週count\: %7.2lf ' \

第5行 繪製圖型起始1天前
第6行 X座標格式[3]

--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM

簡單說明一下,第一組是小刻度格線HOUR:1表示每小時換一輕線;第二組是大刻度格線,HOUR:6表示每6小時畫一紅線;第三組是標籤值,HOUR:4表示每4小時打一個標籤;第四組是位移和顯示格式,位移可讓你顯示的標籤看是對齊格線還是格子,例如向右移一小時,就寫3600,最後的是格式,例如[3]

%Y Year as four digits, e.g. 2009
%m Month as two digits, with leading zero, e.g. 01 02 ... 09 10 11 12
%d Day as two digits, with leading zero, e.g. 01 02 ... 30 31
%a Abbreviated weekday, mon tue wed thu fri sat sun
%H Hour as two digits, with leading zero, e.g. 00 01 ... 22 23
%M Minute as two digits, with leading zero, e.g. 00 01 ... 58 59
%S Second as two digits, with leading zero, e.g. 00 01 ... 58 59 and 60(!)

 

第7-9行 DEF定義資料從rrd取得欄位,這表示繪圖時是可以跨rrd的。
第10行 CDEF是將數據作計算,後置表示法。(後置表示法在計算機學學到2 30年,第一次實用上能用到)
第11行 SHIFT是把資料移位,此例中c2原本等於s1(2天前到目前48小時的資料),移位86400秒,前天的就被移到昨天,昨天的被移到明天,但繪圖時是從一天前繪製到目前,所以就能在圖上同時顯示今天和昨天的資料。[4]

第12-13行 畫面積圖,大圖先畫,小圖後畫,第13最後有一個'STACK',表示把圖加在上面那個面積圖上產生堆疊效果。
第14行 畫線圖,注意是LINE1,沒有LINE2,3...我想原作者是想要增加其他線形,但一直沒做。
第15行 COMMENT 註解,註解要換行用\n。

第16-17行 GPRINT 是圖例,同時也能用LAST顯示最後一筆數據,你也能換成MAX顯示最大值;%7.2lf表示顯示7個整數和2個小數位。

其他可用參數(部分)
--slope-mode 線看起來會更平滑,但是稍微失真
--upper-limit 100 垂直最大值設為100(至少要有100),事實上有可能超過
--lower-limit 0 垂直最小值設為0(至少會有0),事實上有可能更低
--rigid 剛性限定垂直刻度一定介在 --lower-limit 和 --upper-limit之間
--no-legend 不要圖例
--logarithmic y軸取對數
--border 5 外框的厚度5,這裡的外框是指最外圍,而非圖本身

改變顏色

--color 可以改變顏色,一行一筆,例如:上左是紅色、下右是綠色、底色是藍

--color "SHADEA#FF0000"
--color "SHADEB#00FF00"
--color "CANVAS#0000FF"

其它可用的位置名稱為:GRID, MGRID 網格、主網格;FONT 文字;FRAME:外框,這個外框是指下面圖例的小框,廢;ARROW∶x, y軸的箭頭。

使用判斷式

rrdtool 有提供 if else之類的判斷式,稱之為rrdgraph_rpn - About RPN Math in rrdtool graph [13][14]

可用的運算子是 LT, LE, GT, GE, EQ, NE

舉例而言,

- if val1 為真, val2就設為val1, 否則為100

'CDEF:val2=val1,val1,100,IF'

- if val1 為真, val2就設為val1*300, 否則為上一個值

'CDEF:val2=val1,val1,300,*,PREV,IF'

- if val1 大於1000, val2就設為1000, 否則為val1

'CDEF:val2=val1,1000,GT,1000,val1,IF'

熟析這個東西,可以讓我們過濾不必要的資料,非常的方便。

查看最後資料的時戳

在餵入資料時,如果最後時戳大於你數據的時戳就會報錯:

你可以使用 last 選項來確認最後加入的時戳

rrdtool last a.rrd

1549027201

 

查看RRD狀態

rrdtool info a.rrd

查看資料、匯出資料

rrdtool dump a.rrd
rrdtool dump a.rrd > a.xml

回復XML資到到RRD

rrdtool restore a.xml a.rrd -r

 -r 是進行欄位限制檢查,回復只能從 xml回復

修改RRD參數

餵入數據是RRD資料庫的硬傷,很慢,沒必要千萬別重建,因此如果設定錯誤,修改是最佳解,舉例。

修改類型為GAUGE:

rrdtool tune rrdfile.rrd -d item0:GAUGE

修改上界為無限:

rrdtool tune rrdfile.rrd -a item1:U

相關參數請參考[11]

 

參考資料

[1] RRDTool官網 https://oss.oetiker.ch/rrdtool/index.en.html (EN)

[2] StudyArea http://www.study-area.org/tips/rrdtool/rrdtool.html (正體中文)

[3] X座標格式 http://rrdtool.vandenbogaerdt.nl/tutorial/x-grid.php (EN)

[4] shoichimasuhara https://www.slideshare.net/shoichimasuhara/rrdtool-35507239 (日)

[5] shoichimasuhara https://www.slideshare.net/VirtualTech-JP/vtj-open-stackbizseminar1309254?next_slideshow=1 (日)

[6] 防止資料不連續 https://stackoverflow.com/questions/38723029/how-can-i-avoid-getting-blank-spaces-in-my-rrdtool-graphs (EN)

[7] Getting Started with RRDtool http://cuddletech.com/articles/rrd/rrdintro.pdf

[8] http://blog.51cto.com/freeloda/1307492 (簡)

[9] 使用中文字 CENTOS7] 安裝中文字型

[10] DNS STAT 物件 https://thwack.solarwinds.com/docs/DOC-169132 (EN)

[11] RRDTUNE https://oss.oetiker.ch/rrdtool/doc/rrdtune.en.html (EN)

[12] https://www.serveradminblog.com/2010/11/remove-spikes-from-rrd-graphs-howto/

[13] http://manpages.ubuntu.com/manpages/bionic/man1/rrdgraph_rpn.1.html

[14] https://oss.oetiker.ch/rrdtool/tut/rpntutorial.en.html

[15] DRAW VERTICAL LINE https://marc.info/?l=rrd-users&m=117458019235193