6.3 rrdtool graph 一些參數簡單介紹 你若想知道得很清楚建議您到http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/manual/rrdgraph.html 參考其詳細語法,不必費心找其他的連結,因為我覺得其巳經很詳細了.
我僅列出我要介紹的部份供大家參考,你慢慢去體會囉 rrdtool graph image-filename -s 繪圖資料的起始時間,預設是一天前(-1d),可參考上面的 script ,-s `date …` 的應用, -e 繪圖資料的結束時間,預設是現在(now),除date 應用外,可用 -e -1w 表示繪圖的時間結束於一週前 --no-minor 不要副格線 -t 圖檔標題 -v Y 軸說明 -w 資料區的寬度,資料區指的是數據顯示的部份,而非說明或圖例 -h 資料區的高度 -u Y 軸正值高度 -l Y 軸負值高度
DEF 重要的地方,其語法為 DEF:your_var:rrd_filename S_name:[AVERAGE|MAX..] 請參考上面的 tcpdump-graph.sh 主要用處在於您要取出那個 RRD 檔案的 DSN 到這個 graph 的參數來 CDEF 一個虛擬的變數,其值為 DEF 的某些運算,其運算式需寫成後序 EX: a=1+3 寫成 a=1,3 + http=(smtp+http+telnet)/1024 寫成 http=1024,smtp,http,telnet,+,+,/ 不懂 ? http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/ 這裏可以參考,由於 CDEF 太過複雜(其實這裏才是精髓),除了 +-*/ ,您可自行研究 LINE{1|2|3}:vname[#rrggbb[]] LINE1:your_var#rgb顏色值:圖例說明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中, AREA:vname[#rrggbb[]] AREA 則是畫出資料數值至 0 之間的區磈圖 STACK:vname[#rrggbb[]] STACK 則是表現在的圖的值,疊在上一個值上 請注意,如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值, 再畫小的值,才會有層次的效果,不然,最大的數據若最後畫,是直接壓過去哦 COMMENT 說明欄字,如 COMMENT:"Last Updated" 將在圖上產生該文字,可以用 \n 等換行符號 GPRINT GPRINT:vname:CF:format vname 即DEF 中的 your_var,而 CF 看你要輸出的文字是 AVERAGE/MAX/MIN/LAST 等數值,format 如同 printf 中的格式, EX: GPRINT:telnet:AVERAGE:"%10.0lf \n" 意即要輸出這段時間中 (-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置) 如果你不懂 printf, man 一下會比我解釋一大堆來得快.
其他沒有介紹的參數就有待你自己去發掘了(多看官網上的說明,我相信經過我的介紹您一定可以看懂的) ,還有很多沒有講到的,不過我都講完就沒有意思了.依據這裏的介紹,我們再將流量圖美化些,讓它可以 產生說明文字,更有助於我們的判讀,並將如何 update 資料也一併加入:
CODE:
[Copy to clipboard]
#tcpdump.sh RRD_PATH="/root/study/tcpdump.rrd" image_path="/root/study/html" sec=300 killall tcpdump mv ip.packet ip.packet.1 tcpdump -w ip.packet tcp or udp or icmp & scan_port="23 25 53 80 110" rrd_data="" for sport in $scan_port do port=`tcpdump -r ip.packet.1 port $sport -v | sed -e 's/.*, len \(.*\))/ \1/g' | tr '\n' '+'` port=`echo ${port}0| bc` port=`expr $port / $sec` rrd_data="$rrd_data$port:" done total=`tcpdump -r ip.packet.1 -v |grep -v 'config'| sed -e 's/.*, len \(.*\))/\ 1/g' | tr '\n' '+'` total=` echo ${total}0 | bc` now=`date +%s` echo "rrdtool update tcpdump.rrd $now:$rrd_data$total" >;>;tcpdump.cmd rrdtool update tcpdump.rrd $now:$rrd_data$total
image_path=/home/httpd/html/enum/study now=`date "+%Y/%m/%d %H:%M:%S"` start_time=`date -d "2003/08/12 19:00" +%s` time="hour day week month year" for t in $time do /usr/local/bin/rrdtool graph $image_path/example-$t.png \ --title "本機重要 port 流量" \ DEF:t1=$RRD_PATH:telnet:AVERAGE \ DEF:t2=$RRD_PATH:smtp:AVERAGE \ DEF:t3=$RRD_PATH:domain:AVERAGE \ DEF:t4=$RRD_PATH:http:AVERAGE \ DEF:t5=$RRD_PATH:total:AVERAGE \ CDEF:v1=t1,t2,t3,t4,+,+,+ \ CDEF:v2=t1,t2,t3,+,+ \ CDEF:v3=t1,t2,+ \ CDEF:v4=t1 \ CDEF:v5=t5,1024,/ \ COMMENT:"各 PORT 流量統計---最大------平均-------最小-------?#123;在\n" \ AREA:v1#339966:"HTTP" \ GPRINT:t4:MAX:" %12.0lf " \ GPRINT:t4:AVERAGE:"%12.0lf " \ GPRINT:t4:MIN:"%12.0lf " \ GPRINT:t4:LAST:"%12.0lf \n" \ AREA:v2#ffff00:"DNS" \ GPRINT:t3:MAX:" %12.0lf " \ GPRINT:t3:AVERAGE:"%12.0lf " \ GPRINT:t3:MIN:"%12.0lf " \ GPRINT:t3:LAST:"%12.0lf \n" \ AREA:v3#FF0000:"SMTP" \ GPRINT:t2:MAX:" %12.0lf " \ GPRINT:t2:AVERAGE:"%12.0lf " \ GPRINT:t2:MIN:"%12.0lf " \ GPRINT:t2:LAST:"%12.0lf \n" \ AREA:v4#0000ff:"TELNET" \ GPRINT:t1:MAX:" %12.0lf " \ GPRINT:t1:AVERAGE:"%12.0lf " \ GPRINT:t1:MIN:"%12.0lf " \ GPRINT:t1:LAST:"%12.0lf \n" \ LINE2:v5#000000:"全部(Kb)" \ GPRINT:v5:MAX:" %12.0lf " \ GPRINT:v5:AVERAGE:"%12.0lf " \ GPRINT:v5:MIN:"%12.0lf " \ GPRINT:v5:LAST:"%12.0lf \n" \ COMMENT:"\n" \ COMMENT:"\n" \ COMMENT:" Last Updated: $now" \ -v "per second (bytes)" -M -U 10 \ -Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s` done hour:
day:
week:
加上數值的顯示是不是更清楚了呢 ?不過請注意 rrdtool 是不支援中文的,請您用英文來表示你的資料即可. 嗯~如果你覺得很複雜那是正常的,但是其實仔細觀察你可以發現,其實很多地方都很類似,我的感覺是在初學 時才覺得複雜,等做過了一兩個成功的例子後就覺得很簡單了,學任何東西不也都是如此嗎 ? 嗯~tcpdump 抓封包那一段不在我的介紹範圍內,有興趣的人自可 man tcpdump 自己學習一番,或是有人要 貢獻一下也是很好的.
提供大家我的幾個範例當參考,學習的過程中範例其實很重要的,但 rrdtool 的範例其實不多,不然就都是 英文的
|
|