作者 主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略  (閱讀 366759 次)

0 會員 與 1 訪客 正在閱讀本文。

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
rrdtool 教學
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
version: 1.0
最後修正時間: 2005/05/26 00:10
轉載時請保持此一宣告

1.前言
(http://www.rrdtool.org)
什麼是 rrdtool 呢 ? 其實他和 mrtg 是同一家族, 主要都是在產生 time-series 的圖檔(如流量,負載,
溫度,人數.....),不過因為 mrtg 當初的考量是畫兩種資料在圖上(或四個值),後來原作者覺得不足,所以
另外又開發了 rrdtool, rrdtool 本身可和 mrtg 結合,但其結合基本上僅在於將 mrtg 的文字檔的log
轉成 rrd 儲存格式,通常 user 尚需要 mrtg-rrd/rrdcgi 去轉換,不過總覺得美中不足,因為最終其實你用
到的還是 rrdtool,雖然還有像 my14all (http://my14all.sourceforge.net/) 這類的 tools 可以轉換並
畫圖,但其追根究底 還是以 rrdtool 為 base, 所以 rrdtool 變成了最終也是最好的選擇。

平心而論 rrdtool 的學習遠比 mrtg 來得困難,且相關文件資料也沒有 mrtg多,其中中文的參考又幾乎沒有,
如果沒有較深厚的 Linux 基礎(尤其是 Shell Script) 或了解 SNMP,懂得英文及好學的心,否則是不建議學
習 rrdtool 的.因為你可能很難去控制或獲得你所要的資料,亦可能難於表現圖檔。

當然,每個人看法不見得相同,完全看個人需要而定,就像用 mrtg 畫 CPU Load, Memory Usage,HTTP Client,
Process...., 純使用 mrtg 是較簡單且好用的,但是你要做很多圖,每張圖之間的關聯生基本上可能需要你用
眼睛去判斷.但如果使用rrdtool 可以讓你四張疊成一張,如此也較好比較出其中的因果關係,不過此時你得懂
得控制圖的表現方式來達到顯示上最好的結果.基本上學 rrdtool 完全不需要有 mrtg 的經驗. 但最好對系
統資訊獲得的方法(cmd/ snmp/Shell Script )熟一點會較好處理.


最大  CPU 純系統負載;   27.0 %    平均   CPU 純系統負載;5.0 % 目前   CPU 純系統負載;   0.0 %
最大  CPU 使用者負載;   2.0 %    平均   CPU 使用者負載;0.0 % 目前   CPU 使用者負載;   0.0 %


最大 RAM 系統負載; 16.0 %   平均   RAM 系統負載;  4.0 %   目前  RAM 系統負載; 3.0 %  
最大 RAM 使用者負載; 1.0 %  平均   RAM 使用者負載; 0.0 %  目前 RAM 使用者負載; 0.0 %  
 

最大   連線數目 : 91.0 %   平均   連線數目 : 3.0 %   目前   連線數目 : 1.0 %  
最大   上線人數 : 6.0 %   平均   上線人數 :  0.0 %   目前   上線人數 : 0.0 %  

使用 rrdtool 匯整:

綠色為 RAM 之使用率,藍色為 CPU 負載,而紅色系則為連線數,如此,以三合一的方式,更能顯示連線數與系統
的關係(這張圖可以看出其沒有太大相關)


2.下載與安裝
本節說明僅適用 rrdtool 1.0.x
去官網下載 tarball 或 Google 找 RPM 皆可,個人都習慣用 tarball 裝,安裝方法同一般的程式
$>./configure --prefix=/usr/local
$>make
$>make install

Complier 過程中會有幾個 Warning,但是對整個環境並沒有影響.基本上安裝部份都不會有什麼問題, rrdtool
的 tarball 內即可附了 libgd,zlib 等自用的 lib,不會像 mrtg FAQ 一樣裝好了試一下打 rrdtool ,看會不
會出現類似訊息

[root@pc071 study]# rrdtool
RRDtool 1.0.42 Copyright 1997-2001 by Tobias Oetiker <tobi@oetiker.ch>
Usage: rrdtool [options] command command_options
Valid commands: create, update, graph, dump, restore,
last, info, fetch, tune, resize, xport
RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (www.gnu.org/copyleft/gpl.html)
For more information read the RRD manpages

可以看出來 rrdtool 有 11 個 options, 此處介紹 create/update/graph 其餘的部份較屬於 RRD File 的
備份/回存及資訊顯示等,與我們主題較無關.另外像 rrdcgi 或 rrd 的 perl module 皆不在我們的介紹範圍
內,但其用法並無二致,有興趣之人自可至官方網站查看.

3.建立 RRD 檔 (rrdtool create)
建立 RRD file 的指令及意義你一定要弄懂,如此圖才能畫的好,不過唯有實作你才能體會的深, 只有看過是不
夠的.相信有不少人看過 rrdtool 網站上的說明,個人覺得上面有幾個部份 英文蠻難的(你覺不覺得我就不知了
)... 再說明之前我們先了解 mrtg log 的儲存格式...以一般而言 mrtg 大家習慣都是 5m 做 一次,那一天要
做 288 次, 你的 mrtg 跑一年不就有 10 萬行的資料了,但實際上mrtg log 是會做一些處理的 實際的狀況是
代碼: [選擇]

每五鐘值存 603 筆,再來是
30 分鐘存 603 筆
2 小時值存 603 筆
一天值存 800 筆

註:詳細內容請參考您自身的 mrtg log 檔,並觀察第一欄(timestamp) 的變化

3.1 論 mrtg 的優點
個人感覺即是籣單而好用,能符合多數人的需求.且網路上中文的資料多.
2.x 版後支援 Logformat 為 RRD 而不為 text logfile, 以方便較短的 interval 及僅做資料收集動作
支援 Threhold Check,這個一般人都沒有什麼研究,但其實是 monitor 中重要的一個 Alert 動作
代碼: [選擇]

#mrtg target 部份
Target[sg-apol-mgcd]:`/root/study/enum.sh softswitch ABC mgcd`
MaxBytes1[sg-apol-mgcd]:6000
MaxBytes2[sg-apol-mgcd]: 512000
Title[sg-apol-mgcd]: Class 5 VoIP SoftSwitch status
Legend1[sg-apol-mgcd]: CPU 時間
Legend2[sg-apol-mgcd]: MEM 使用
LegendI[sg-apol-mgcd]: CPU 時間(秒)
LegendO[sg-apol-mgcd]: MEM 使用(KB)
YLegend[sg-apol-mgcd]: CPU/MEM usage
PageTop[sg-apol-mgcd]: <h1>Class 5 Soft Switch @APOL: mgcd daemon(Media GatewayControler )</h1>


# mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert
ThreshDir: /www/htdocs//mrtg/alert/
#依我的
#remote 重
ThreshMaxI[sg-apol-mgcd]: 1000
ThreshProgI[sg-apol-mgcd]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/send_MSN.sh


3.2 mrtg 的缺點
mrtg 最大的缺點是處理效率問題
主要原因在於:
1. 偵測時間不能小於5分鐘,即使你每分鐘跑一次,圖上也是畫 5 分鐘的變化
2. 偵測 Target 過多,機器會跑不動,主因在
   2.1 mrtg 每次都會畫圖(最多一個target 會更動到4個圖),不實際, Broswer 時才畫才可能偵測上千
        上萬個 Target.
   2.2 要更新 log file(絕不是什麼插入一行數據,而是N筆資料的修改)
   2.3 要更新每個 target 的 html page
3. 不能表現三種以上資料

如果 Scope 小, mrtg 再上述幾點狀況不會構成問題,若 Scpoe 大,例如, 1000+ Target 要做,大概 90% 的機
器都跑 不動(可以把 mrtg.cfg 複製個 1000 份,每份改一個 filename & target name 即可測試).即使你用
speedcgi ,也只是把1000 變成 2000, 因為根本問題並沒有解決

mrtg 資料儲存的方法固定
如此 log 檔才不會太大,畫 d w m y (day,week,month,year) 圖時才會快,不過你可以
想像,你的每五分鐘資料過了 50  個小時後(5x603=3015 分鐘,約50小時) 就會變成 30 分鐘平均值....,..
當您需要一個月前每五分鐘值,以無法再從 mrtg 中找到,因為它會將6 個5分鐘合併計算為一個30分鐘,且
你無法改變這種現況.

無法繪出特定時間需求
mrtg 另外的限制是無法產生說我要最近3天,最後三個月,近十年來等資料,上個月與本月比較,特別標示上班
時間...等繪圖,資料的運算處理上也較少,其僅能產生日週月等較固定的資料.
 
數值差異過大問題   
如果你有兩個資料,一個是 Web 連線數,一個是 Web 資料傳輸量,此時你要將這兩個值畫在 mrtg 上,你會發
現,連線數的線圖將小得幾乎看不見,因為傳輸量的值太大了,以致於不能於圖上充份表現出來.除非你的 script
先做了適當的運算,如傳輸量以 K 算,再輸出. (註:mrtg 雖可讓你用 K 值當 Y 軸,但是此時連線數的線值看
起來就和0一樣了),在 mrtg 要解決此一問題,只有事先處理(連線數輸入 logfile 時先給他 x1000),但 rrdtool
是允許你後來再加工運算的


eth0 流量:藍線為 tx,綠線為 tr,但此時 tr 看起來幾乎感覺不到他的存在
(不知什麼是 TR/TX 建議您不要看下去了)

數值再處理的運算式功能
如果您的圖表上突然有一個很大的值,此時,mrtg 的圖檔原資料因 Y 軸的資料都將因此而壓縮,使用 rrdtool
可以用 GE (大於),LE(小於)…等運算式,讓您將這個值改成其他的值(有沒有意義需視您自身的需要而定)
代碼: [選擇]

CDEF:la60u=la60,1000,GT,1000,la60,IF

意思是如果 la60(rrdtool 裏的變數) 大於 1000, 那都算成 1000 來畫圖,不然就用 la60 原來的值
(if (la60 < 1000) then la60u=1000 , else la60u=la60)[/i]
CDEF 教學可參考 http://rrdtool.planetmirror.com//tutorial/cdeftutorial.html

MRTG 自有其優缺點, RRDTOOL 也不見得是最佳解,用什麼東西來做你的 Monitor 端看個人的需要而定囉


以下,我們就開始來介紹 rrdtool 的一些基本用法,至於更深入的東西待您自己去發掘了

4. rrdtool 建檔語法 (rrdtool create)

rrdtool create filename
[--start|-b start time]
[--step|-s step]
[DS:ds-name:DST:heartbeat:min:max]
[RRA:CF:xff:steps:rows]


看起來語法好像不多(因為不多所以讓很多人看不懂),但其實有點精深,這個建檔的動作其實就像建立 mrtg 的
log 檔,但是 rrd 讓你可以自訂五分鐘資料筆數,平均值為多少時間單位,最大值為多少時間單位,要存幾筆資料,
即使用事後發現不足或有問題,依然可使用 tune 來調整.

create    顧名思義,即建檔
filename    隨你取,習慣上會以 .rrd 結尾
--start    這個 filename 的資料記錄起始日期 ,以 1970 年至今的秒數 (預設是現在)
--step      資料的間格時間,習慣上我們會設 300 (秒),您可視自己的需求而定

下面的部份難一點了哦~~要仔細體會了,直接以例子做說明,比如說我們要測 eth0 上的 某些 udp/tcp port
的流量及 總流量(IP 層以上):

DS:telnet:COUNTER:600:0:100000000 \
DS:smtp:COUNTER:600:0:100000000 \
DS:domain:COUNTER:600:0:100000000 \
DS:http:COUNTER:600:0:100000000 \
DS:total:COUNTER:600:0:100000000 \

DS    Data Source DS "宣告" 的意思
telnet    是 DSN (name) , 欄位名稱,意即"變數名稱",
COUNTER 是DST(type),習慣上常用如果輸入資料依序為 98 100 98:
   1.GAUGE(個別值,像CPU loading):產生圖檔時,畫 98 100 98
   2.COUNTER (累計值,像流量資料):產生圖檔時,畫,2 -2
   3.DERIVE (累計值,像流量資料),小於0畫0:產生圖檔時,畫    2   0
   4.ABSOLUTE 如同 COUNTER,但 COUNTER 可能 overflow(數值過大),所以會取絕對值
   補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數,如上 COUNTER
   例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值

600    是有效期(heartbeat),如果連續如果原來在 12:00 要產生資料而沒有產生,前後 300 秒 (共 600
   秒)的平均值會算成 12:00 的值,如果都沒有值,則會成為 "UNKNOWN" (UN,就像 mrtg 沒有資料時,
   會畫一平線的狀況一樣),考考你,如果你想把現有的 mrtg logfile 轉成 rrd file, 這個值該設為
   多少呢 ?86400 以上
0:100000000    是說 DSN 的數值有效範圍,如果超出這個值,皆視為 UN,這裏也可以寫成 U:U 代表不限範圍

DS 的部份剛開始一定記不熟,不過用久了就不會有太大問題了,一個好記的方式即 "三文字,三數字".
RRA 可能對少數人不容易理解,其實就是什麼資料要存幾筆,以下例為仿 mrtg logfile
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603 \
RRA:AVERAGE:0.5:24:603 \
RRA:AVERAGE:0.5:288:800 \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800

RRA      即 Round Robin Archive,你可以把它看成像 DS,但是這裏主要在處理資料筆數
AVERAGE    在 rrd 稱為 CF (consolidation function),此處我們使用平均數,共有四種類別
      :AVERAGE, MIN,MAX, LAST 意即平均值,最大值,最小值,最後一筆.
0.5:1:603    因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以
      11:57:30~12:02:30 的平均值為主,這個值若在此時間點內只有一筆資料的話,其
      意即是平均值,所以此一值即表原 telnet/smtp…等共要記錄幾筆(若 mrtg 此值為
       603),603 是指要存 603 筆 (此處故意與 mrtg 同,以利大家判斷),超過603筆,
      則最早之一筆將被移出.
0.5:6:603    僅就 6 解釋,取 6 筆資料(每筆為 step 值,在此意即5分鐘)為平均值( 30 分鐘),
      存 603 筆
0.5:24:603   24 即二小時
0.5:288:800    288 即一天


請注意,不是 0.5:1:603 中的1 就是五分鐘,其乃依據你的 --step 值而定,如果 --step 3600 , 那 0.5:6:603
這一行就是六小時合起來的平均值了.若將 AVERAGE 換成MIN/MAX 的意義則是取該時間點中 (如上例之5min/
30min/2hr..)之最大值或最小值,而通常在監測系統時最大值與平均值是較有實際意義的.

所以,若我們再看一個例子
代碼: [選擇]

rrdtool create sample.rrd -s 600 -b `date -d "2005/03/01" +%s` \
DS:DS1:COUNTER:6000:0:100 \
RRA:MAX:0.5:5:1000

如果 2005/03/01 後,每十分鐘各輸入
1 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 100
試問,若畫20050301 該天的圖, 會有幾個數據? 值為何 ? 為什麼 ?

答案為3個數據,值分別為 0.001666667/0.016666667/0.016666667 ,為什麼就看您的理解囉



RRA 再解釋一下大家會較清楚:


所以, DS 主要在宣告資料名稱(DSN)及資料型式(DST),heartbeat 決定資料時間的有效範圍,RRA 則定義了
資料的儲存數量及存什麼樣的 CF (AVERAGE/MAX...),~~其實懂了意義就容易了,不過當出我在 K 資料時,
到是有不少英文與理解上的問題呢!還得在 google 找許多資料來參考.至少你現在看的是中文,要理解,不能
強記.我想大概的重點我想我都指出來了.


回想一下,下列的指令意義你還記得多少?
代碼: [選擇]

rrdtool create /root/study/tcpdump.rrd -s 300 -b `date -d "-1 month" +%s` \
DS:telnet:GAUGE:600:0:10000000 \
DS:smtp:GAUGE:600:0:10000000 \
DS:domain:GAUGE:600:0:10000000 \
DS:http:GAUGE:600:0:10000000 \
DS:pop3:GAUGE:600:0:10000000 \
DS:total:GAUGE:600:0:10000000 \
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603          \
RRA:AVERAGE:0.5:24:603         \
RRA:AVERAGE:0.5:288:800         \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800


-b 處我讓他建立一個一月前為起始的資料,以下我提供一個 rrdtool update 的範例檔
記注意,如果你巳新增了 12:00 的資料, 12:00 之前的資料你就不能再更新了,rrdtool 會和你說
timestamp 小於最後一筆.

5.更新 RRD 資料 (rrdtool update)

rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]


這個很好理解,基本上就是根據 DS來更新資料,如上述之 tcpdump.rrd,若有需要更新時及時
代碼: [選擇]

$>rrdtool update tcpdump.rrd  1061811856:114:0:50:1199:0:821073

上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以
代碼: [選擇]

$>timestamp=`date +%s `

來轉現在秒數,如果是某些特定時間,則可以
代碼: [選擇]

$>timestamp=`date -d "2003/08/15 12:00" +%s`


通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab
根據你在 rrdtool create 時的 step 來決定執行排程的時間點
http://211.72.210.251/tcpdump.txt
這裏提供一個 update 範例檔給大家,其時間範圍為 2003/08/15~2003/08/25,step 為 300s,根據這個檔
您自己可適時的建立自己的 rrd file,最好不要抄上面才好(放不進去 rrdfile,請再將 create 指令再看
一次,一定是你漏了什麼了).


6. 畫圖 (rrdtool graph)
先用簡單範例,引起你的興趣... (看起來好複雜…)

6.1 LINE{1|2|3} 圖例
代碼: [選擇]

#三線圖 (LINE1 是細線,尚有 LINE2,LINE3 (粗線條) 等)
RRD_FILE=/root/study/tcpdump.rrd
rrdtool graph html/example.png \
--title "Host Port Traffic " \
DEF:t1=$RRD_FILE:telnet:AVERAGE \
DEF:t2=$RRD_FILE:smtp:AVERAGE \
DEF:t3=$RRD_FILE:domain:AVERAGE \
LINE3:t1#ff0000:"telnet"        \
LINE2:t2#00ff00:"smtp"          \
LINE1:t3#0000ff:"domain"        \
-h 200 -w 480 -s `date -d "-1 week" +%s` \
-v "Bytes per second"

結果圖表 (三線,LINE3 最粗, LINE1 最細)


由這張圖可以看出來,以三條線來表示三個 port 時,線形有粗細之分(自己需定義),不過此時因每個時
間點不同而有可能交叉,可能增加了我們閱覽時的困難.因為以線來表示較難看出總合情況,所以我們要將
每條線疊起來形成一個堆壘的圖,如此就看出來整個機器這幾個 port 的狀況
(本例以 AREA 繪制,亦可以 STACK 描繪,後述)

6.2 AREA,CDEF 圖例
代碼: [選擇]

#或如下 (畫出時,天,週,的流量圖)
#filename: tcpdump-graph.sh
RRD_PATH="/root/study/tcpdump.rrd"
image_path="/root/study/html"
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 "
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,/ \
AREA:v1#339966:"HTTP" \
AREA:v3#FF0000:"SMTP"        \
AREA:v4#0000ff:"TELNET"        \
LINE2:v5#000000:"Total(Kb)"        \
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` -b 1024
done                

流量小時圖:


流量日圖


流量週圖


上述三圖我們是以區磈(AREA)來畫出,但是原資料如果我們以AREA來畫將出現互相覆蓋的情況,所以得
做一些運作(CDEF 那一段),將適當的加總另外給予另外一變數,而 Total 之值因為過大,如果我們以原
值畫於圖上將造成 HTTP/SMTP/TELNET 的圖形無法適當反應,所以將其除以 1024,而以 Kbytes 來表示.
Rrdtool 是不是很活呢?不過也因為其較靈活所以你多少得花許多時間自己去體會.
個人覺得剛開始學時不容易掌握到要緊,只有靠練習才能生巧,rrd 畫出來的圖覺得比 mrtg 來得有變化,
也更容易 "Customize",但 mrtg 是較好學習的. 若無特殊需要的確不需要另學 rrd.
(註:mrtg 3.x 應會改用 rrd , 之前有看到過這樣文章,我也是先 mrtg->mrtg-rrd->rrd )

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:DS_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[:legend]]
   LINE1:your_var#rgb顏色值:圖例說明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中,
AREA:vname[#rrggbb[:legend]]
   AREA 則是畫出資料數值至 0 之間的區磈圖
STACK:vname[#rrggbb[:legend]]
   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 資料也一併加入:

代碼: [選擇]
#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 的範例其實不多,不然就都是
英文的

6.4 Question: 如何抓 CISCO Switch(假設 24 port) 每個 port 流量呢 ?
6.4.1 方法一
代碼: [選擇]

# 先使用 mrtg 產生 cfg 檔
cfgmaker Community_String@Switch_or_Router_IP > mrtg.cfg

再來修改 mrtg.cfg , 加入這三行,在最前面
代碼: [選擇]

# 表示使用 rrdtool 來做 data 的 log , 而不使用 log file
LogFormat: rrdtool  
# rrdtool 所在路徑,如果你裝 rrdtool 的 prefix=/usr 那就是在 /usr/bin 下
PathAdd: /usr/bin/
# 自己找 RRDs.pm 在哪,如果 prefix=/usr 那大概就是在下面這個 path
LibAdd: /usr/lib/perl/


再來,只要跑 mrtg mrtg.cfg ,那 mrtg 就幫你建好 rrd 檔在 LogDir 內(一般同 WorkDir: ),
代碼: [選擇]

[root@log mrtg]# mrtg /etc/mrtg/mrtg.cfg
[root@log mrtg]# ls -la *.rrd  
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_10.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_11.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_12.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_13.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_14.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_15.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_16.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_17.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_18.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_19.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_1.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_20.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_21.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_22.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_23.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_24.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_2.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_3.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_4.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_5.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_6.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_7.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_8.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_9.rrd


再來,我會百分之百建議到 http://my14all.sourceforge.net/ 抓 14all.cgi 來繪圖.
請辨明上述網站上的版本說明,14all.cgi 抓回來後要修改三個地方
代碼: [選擇]

#..前略
#if MRTG_lib.pm (from mrtg) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly:
# 修改這個,找你的 mrtg 的 lib 的路徑在哪裏,建議您將 mrtg 的 pm
# 皆 copy 到 perl modules 的所在目錄
use lib qw(MRTG_lib.pm);

# if RRDs (rrdtool perl module) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly
# or use a LibAdd: setting in the config file
# 這個是你的 rrdtool 的 RRDS.pm 所在路徑,與你
use lib qw(/usr/local/rrdtool-1.0.38/lib/perl);

#中間略
### where the mrtg.cfg file is
# anywhere in the filespace
#$cfgfile = '/home/mrtg/mrtg.cfg';
# relative to the script
#$cfgfile = 'mrtg.cfg';
# use this so 14all.cgi gets the cfgfile name from the script name
# (14all.cgi -> 14all.cfg)
# 修改這個對應到你的 mrtg.cfg
$cfgfile = '/etc/mrtg/mrtg.cfg';

# 後略


以上都修改完成後,將 14all.cgi 置於 mrtg 的 WorkDir 下,並請注意,14all.cgi 需
1. chmod 為 755
2. 對目錄有寫入權限
3. 且該目錄具有執行 CGI 功能 (Apache 中的 Options ExecCGI).
然後你就可以用 http://IP/WorkDir/14all.cgi 來看 mrtg+rrd 所畫出來的圖了.這是一個呈現的範例:


所以,您看是不是很簡單呢 ? (我是覺得 14all.cgi 很簡單且好用,您覺不覺得我就不知道了),用這種東
西有快速簡便的好處,就像用 CACTI 一樣簡單 (http://www.cacti.net/)

6.4.2 用自己寫的方法
建檔的方式就不在說明,上述的 mrtg 產生的 .rrd file 一個就 ds0 (in), 一個叫 ds1(out),所以我
們可以直接拿來使用,並使用 mrtg 會 collection 的 tool,而不用像前面 tcpdump 的例子自己寫
update 語法 (當然,你喜歡也可以囉)
代碼: [選擇]

[root@log mrtg]# rrdtool info 192.168.0.253_1.rrd
filename = "192.168.0.253_1.rrd"
rrd_version = "0001"
step = 300
last_update = 1117181102
ds[ds0].type = "COUNTER"
ds[ds0].minimal_heartbeat = 600
ds[ds0].min = 0.0000000000e+00
ds[ds0].max = 1.2500000000e+06
ds[ds0].last_ds = "3689202706"
ds[ds0].value = 1.0680042424e+05
ds[ds0].unknown_sec = 0
ds[ds1].type = "COUNTER"
ds[ds1].minimal_heartbeat = 600
ds[ds1].min = 0.0000000000e+00
ds[ds1].max = 1.2500000000e+06
ds[ds1].last_ds = "3880427199"
ds[ds1].value = 2.7916855892e+05
ds[ds1].unknown_sec = 0
#後略

我相信前面的 rrdtool create 介紹您有看懂,這裏一定不會有問題,有問題的話,請在從頭看起.
利用原來的東西畫圖
代碼: [選擇]

#!/bin/sh
INTERFACE=$1
RRDFILE="/www/htdocs/mrtg/192.168.0.253_$INTERFACE.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/mrtg/sample1_$t.png \
--title "Switch ($SWITCH) #$INTERFACE 流量"  \
-s `date -d "-1 $t" +%s`        \
DEF:in=$RRDFILE:ds0:AVERAGE     \
DEF:out=$RRDFILE:ds1:AVERAGE    \
COMMENT:"In/Out         MAX        AVG         NOW \n"  \
AREA:in#00ff00:"In ": \
        GPRINT:in:MAX:"%10.0lf"  \
        GPRINT:in:AVERAGE:"%10.0lf"  \
        GPRINT:in:LAST:"%10.0lf\n"  \
LINE2:out#0000ff:"Out": \
        GPRINT:out:MAX:"%10.0lf"  \
        GPRINT:out:AVERAGE:"%10.0lf"  \
        GPRINT:out:LAST:"%10.0lf"  \
-w 600 -h 150
done

畫出來的樣子:

如果只有這樣的功能,其實誰會想用呢?用 14all.cgi 就好了,不過再來我們看看其他的呈現方式囉,

代碼: [選擇]

#!/bin/sh
#一張圖上,圖出兩個 Interface 的流量
RRDFILE1="/www/htdocs/mrtg/192.168.0.253_14.rrd"
RRDFILE2="/www/htdocs/mrtg/192.168.0.253_15.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/snmp.enum.org.tw/images/sample2_$t.png \
--title "Switch  #14/#15 INTERFACE 流量"  \
-s `date -d "-1 $t" +%s`        \
DEF:in1=$RRDFILE1:ds0:AVERAGE   \
DEF:in2=$RRDFILE2:ds0:AVERAGE   \
DEF:out1=$RRDFILE1:ds1:AVERAGE  \
DEF:out2=$RRDFILE2:ds1:AVERAGE  \
CDEF:n_out1=out1,-1,*   \
CDEF:n_out2=out2,-1,*   \
COMMENT:"In/Out         MAX        AVG         NOW \n"  \
AREA:in1#ff0000:"In14 ": \
        GPRINT:in1:MAX:"%10.0lf"  \
        GPRINT:in1:AVERAGE:"%10.0lf"  \
        GPRINT:in1:LAST:"%10.0lf\n"  \
STACK:in2#00ff00:"In15 ": \
        GPRINT:in2:MAX:"%10.0lf"  \
        GPRINT:in2:AVERAGE:"%10.0lf"  \
        GPRINT:in2:LAST:"%10.0lf\n"  \
AREA:n_out1#ff0000:"In14 ": \
        GPRINT:out1:MAX:"%10.0lf"  \
        GPRINT:out1:AVERAGE:"%10.0lf"  \
        GPRINT:out1:LAST:"%10.0lf\n"  \
STACK:n_out2#00ff00:"In15 ": \
        GPRINT:out2:MAX:"%10.0lf"  \
        GPRINT:out2:AVERAGE:"%10.0lf"  \
        GPRINT:out2:LAST:"%10.0lf\n"  \
-w 600 -h 150
done


以上用法主要著重在 CDEF,及 STACK 的應用, CDEF 將某些值轉成負數,以描繪出 in 在上(正值),out 在
下(負值),並以 AREA/STACK 將圖疊在一起,例如,如果您有兩個出口線路,就非常適合這種做法
結果:


所以,若你需要,可以堆疊出許多圖,也可以畫得很簡單,就看你的需要了.

6.5 描繪每部 DNS 的回應狀況
敝人專注於 DNS 之研究,所以回到老本行,我們看看如何來呈現此一問題
代碼: [選擇]

# rrdtool 建檔語法,您可以一部 DNS 建一個 rrd file ,
rrdtool create /root/study/dnsquery.rrd -s 60   \
DS:a:GAUGE:600:-100:10000 \
DS:b:GAUGE:600:-100:10000 \
DS:c:GAUGE:600:-100:10000 \
DS:d:GAUGE:600:-100:10000 \
DS:ns:GAUGE:600:-100:10000 \
DS:f:GAUGE:600:-100:10000 \
DS:g:GAUGE:600:-100:10000 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800          \
RRA:AVERAGE:0.5:24:1200         \
RRA:AVERAGE:0.5:288:600         \
RRA:MAX:0.5:1:14400     \
RRA:MAX:0.5:6:4800              \
RRA:MAX:0.5:24:1200             \
RRA:MAX:0.5:288:600


取值及畫圖
代碼: [選擇]


#!/bin/sh
RRD_PATH="/root/study/dnsquery.rrd"
IMAGE_PATH="/www/htdocs/mrtg"

#DNS List
host="a.dns.tw b.dns.tw 61.220.48.1 d.dns.tw ns.twnic.net e.dns.tw f.dns.tw"
rrd_data=""
for dns in $host
do
#取得 dig 最後面的所顯示的查詢時間
        msec=`/bin/dig @$dns . ns | grep 'Query time' | sed -e 's/.*: \(.*\) [a-z].*/\1/'`
        if [ -z $msec ];then
                msec=-100
                echo "$dns 沒有回應,請您注意"| mail MyEmail -s "$dns 無回應"
        fi
        rrd_data="$rrd_data:$msec"
done
now=`date +%s`
echo $rrd_data
rrdtool update $RRD_PATH ${now}${rrd_data}



time="day week "
for t in $time
do
rrdtool graph $IMAGE_PATH/dnsquery-$t.jpg \
-t "DNS Query Response Time (${t}ly)" \
-w 600 -h 250 -s `date -d "-1 $t" +%s`  -v "msec"  -X b         \
        DEF:a=dnsquery.rrd:a:MAX        \
        DEF:b=dnsquery.rrd:b:MAX        \
        DEF:c=dnsquery.rrd:c:MAX        \
        DEF:d=dnsquery.rrd:d:MAX        \
        DEF:ns=dnsquery.rrd:ns:MAX      \
        DEF:f=dnsquery.rrd:f:MAX        \
        DEF:g=dnsquery.rrd:g:MAX        \
        CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*     \
        CDEF:a1=a,3000,+        \
        CDEF:a11=3000,a,a,-,+   \
        CDEF:b1=b,2500,+        \
        CDEF:b11=2500,a,a,-,+   \
        CDEF:c1=c,2000,+        \
        CDEF:c11=2000,a,a,-,+   \
        CDEF:d1=d,1500,+        \
        CDEF:d11=1500,a,a,-,+   \
        CDEF:ns1=ns,1000,+      \
        CDEF:ns11=1000,a,a,-,+  \
        CDEF:f1=f,500,+         \
        CDEF:f11=500,a,a,-,+    \
        CDEF:g1=g,              \
        AREA:z0#c0c0c0:"Average Response Time(msec)"    \
        COMMENT:"\n"    \
        AREA:a1#ff0000:"a.dns.tw"       \
        GPRINT:a:MAX:"%12.0lf"          \
        GPRINT:a:AVERAGE:"%12.0lf"      \
        GPRINT:a:MIN:"%12.0lf"          \
        GPRINT:a:LAST:"%12.0lf\n"       \
        AREA:a11#ffffff                 \
        AREA:b1#800000:"b.dns.tw"       \
        GPRINT:b:MAX:"%12.0lf"          \
        GPRINT:b:AVERAGE:"%12.0lf"      \
        GPRINT:b:MIN:"%12.0lf"          \
        GPRINT:b:LAST:"%12.0lf\n"       \
        AREA:b11#ffffff                 \
        AREA:c1#00ff00:"c.dns.tw"       \
        GPRINT:c:MAX:"%12.0lf"          \
        GPRINT:c:AVERAGE:"%12.0lf"      \
        GPRINT:c:MIN:"%12.0lf"          \
        GPRINT:c:LAST:"%12.0lf\n"       \
        AREA:c11#ffffff                 \
        AREA:d1#008000:"d.dns.tw"       \
        GPRINT:d:MAX:"%12.0lf"          \
        GPRINT:d:AVERAGE:"%12.0lf"      \
        GPRINT:d:MIN:"%12.0lf"          \
        GPRINT:d:LAST:"%12.0lf\n"       \
        AREA:d11#ffffff                 \
        AREA:ns1#0000ff:"ns.twnic.net"  \
        GPRINT:ns:MAX:"%8.0lf"          \
        GPRINT:ns:AVERAGE:"%12.0lf"     \
        GPRINT:ns:MIN:"%12.0lf"         \
        GPRINT:ns:LAST:"%12.0lf\n"      \
        AREA:ns11#ffffff                \
        AREA:f1#000080:"f.dns.tw"       \
        GPRINT:f:MAX:"%12.0lf"          \
        GPRINT:f:AVERAGE:"%12.0lf"      \
        GPRINT:f:MIN:"%12.0lf"          \
        GPRINT:f:LAST:"%12.0lf\n"       \
        AREA:f11#ffffff                 \
        AREA:g1#ff8040:"g.dns.tw"       \
        GPRINT:g1:MAX:"%12.0lf"         \
        GPRINT:g1:AVERAGE:"%12.0lf"     \
        GPRINT:g1:MIN:"%12.0lf"         \
        GPRINT:g1:LAST:"%12.0lf\n"      \
        COMMENT:"note:<0 means no response\n"
done

這個做法很特別,你也可以轉化成像 ping 等的用法,CDEF 那一段主要在產生每個 HOST 有 500 的差距,
描繪原則即是,畫 a (這個值最大),以白色畫 3000 以下,意即去掉 AREA 3000 以下的部份,在 2500 上
畫 b, 再 2500 以下畫白色 (清除)....其他同理, 所以最後呈現每部主機的 DNS 查詢反應時間的結果,
程式稍複雜,但圖的觀感簡單清楚.



其他 DNS 部份,一般人關心是查詢或回應的狀況,若有心者可看一下這篇上的說明
http://bbs.chinaunix.net/forum/viewtopic.php?t=423629
此篇對許多 ISP 或 Domain Name 代管業者應有不少助益.

6.6 Apache Virtual Host 流量偵測
本例不用 mod_accounting ,因為其僅支援 1.3.x, 不過若您有心可以自己看看如何做,本例由 Demonbane
推薦的 mod_watch(http://www.snert.com/Software/mod_watch/index.shtml)來實現,安裝方法參考上述
網址(裝不起來不要問我哦).
代碼: [選擇]

#httpd.conf 部份內容
LoadModule watch_module       modules/mod_watch.so
<IfModule mod_watch.c>
  <Location /watch-info>
  SetHandler watch-info
  </Location>
  <Location /watch-table>
  SetHandler watch-table
  </Location>
</IfModule>
VirtualDocumentRoot /www/htdocs/%0
VirtualScriptAlias  /www/htdocs/%0/cgi-bin/

我們可以試以下列指令求得某一個 VH 的流量
代碼: [選擇]

[root@log study]# /usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://my_someone_virtual_host/watch-info
4538020
235836805
4.37
my_someone_virtual_host

這個東西到這邊巳經很明顯的是 mrtg 的輸出格式,所以你若了解的話基本上 mrtg 的作法就很簡單了

代碼: [選擇]

# 建檔 ,請多注意 $1 用意
#!/bin/sh
vh=$1
rrdtool create /root/study/mod_watch_$vh.rrd -s 300     \
DS:in:COUNTER:600:0:100000000 \
DS:out:COUNTER:600:0:100000000 \
DS:req:COUNTER:600:0:100000000 \
DS:doc:COUNTER:600:0:100000000 \
DS:gabege:COUNTER:600:0:1 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800          \
RRA:AVERAGE:0.5:24:1200         \
RRA:AVERAGE:0.5:288:600         \
RRA:MAX:0.5:1:14400     \
RRA:MAX:0.5:6:4800              \
RRA:MAX:0.5:24:1200             \
RRA:MAX:0.5:288:600


代碼: [選擇]

#更新資料及畫圖
#!/bin/sh
vh=$1
RRDFILE=/root/study/mod_watch_$vh.rrd
IMAGE_PATH=/www/htdocs/211.72.210.251/images
now=`date +%s`
IN_OUT=`/usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://$1/watch-info| head -2 | tr '\n' ':'`
REQ_DOC=`/usr/local/sbin/mod_watch.pl -f ifRequests,ifDocuments http://$1/watch-info|head -2 | tr '\n' ':'`
rrdtool update $RRDFILE $now:${IN_OUT}${REQ_DOC}0

for t in day week month year
do
rrdtool graph $IMAGE_PATH/mod_watch_${vh}_${t}.png -t "mod_watch 範例" \
-s `date -d "-1 $t" +%s`        \
DEF:in=$RRDFILE:in:AVERAGE      \
DEF:out=$RRDFILE:out:AVERAGE    \
DEF:req=$RRDFILE:req:AVERAGE    \
DEF:doc=$RRDFILE:doc:AVERAGE    \
AREA:in#00ff00:"流入      "     \
        GPRINT:in:MAX:"%12.0lf"          \
        GPRINT:in:AVERAGE:"%12.0lf"      \
        GPRINT:in:MIN:"%12.0lf"          \
        GPRINT:in:LAST:"%12.0lf\n"       \
LINE1:out#0000ff:"流出    "     \
        GPRINT:out:MAX:"%12.0lf"          \
        GPRINT:out:AVERAGE:"%12.0lf"      \
        GPRINT:out:MIN:"%12.0lf"          \
        GPRINT:out:LAST:"%12.0lf\n"       \
LINE1:req#ff0000:"Request "     \
        GPRINT:req:MAX:"%12.0lf"          \
        GPRINT:req:AVERAGE:"%12.0lf"      \
        GPRINT:req:MIN:"%12.0lf"          \
        GPRINT:req:LAST:"%12.0lf\n"       \
LINE1:doc#800000:"Document"     \
        GPRINT:doc:MAX:"%12.0lf"          \
        GPRINT:doc:AVERAGE:"%12.0lf"      \
        GPRINT:doc:MIN:"%12.0lf"          \
        GPRINT:doc:LAST:"%12.0lf\n"       \
-w 400 -h 100
done

結果


發現沒 ? 什麼問題呢 ? 仔細想想為什麼 Request/Document 值為 0 呢 !? 該如何解決.....



7. 結語
該說的前面都說了,想不想學 rrdtool 完全看你對系統的掌握度...本來是只介紹 rrdtool 的,不過想說
寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
的地方,不要只看什麼教學文件..那很難學得透徹.

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4053
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #1 於: 2003-08-25 23:46 »
果然是“大作”!
看來要花不少的時間消化吸收了!
不過還是先謝了,感謝你分享!
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #2 於: 2003-08-26 08:04 »
嗯~~
這篇文章花了我十幾個晚上打字,會講"大作" 是因為 rrdtool 我查了各大搜尋引擎及論壇都沒有人寫過....我相信很多網管人員對 rrdtool 應有相當的需求才是   :-?
(當然,用商用的或 ntop 也是很好的選擇,但若你可以自己實作一套符合自己公司環境的 monitor ,再加上一些網頁的控制技巧,絕對比花錢買一套系統更值得)
中間被我那可愛的小 baby 打斷了無數次
其實前幾一我就有貼了一個版本,不過覺得實在寫得不好
就把它 drop 了,如果大家看了上面有什麼意見也可以告訴我一下
讓我將其修得更好 ~~

現在我將 rrdtool 用在
WLAN stat (WLAN 訊號及上線人數)
ROUTE (In/Out, 開機上線人數, DHCP 人數)
29 Switch 每個 Port 及總合 CGI
Snort Report (依主機/事件類別/port ....等區分)Alert  
DNS DNS 流量統計
壓力測試  分別跑 BIND/APACHE....等,再以 DOS/DDOS 手法向其發出 request,以 rrdtool 記錄其間的 CPU/Memory/Network/Perforamce/Uptime/Process 等變化
個人 Mail 收寄信數及各種Reject(Spam,Virus) 數統計
.............

Hawker

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #3 於: 2003-08-26 09:28 »
引述: "abelyang"

前言
(http://www.rrdtool.org)
什麼是 rrdtool 呢 ? 其實他和 mrtg 是同一家族, 主要都是在產生 time-series 的圖檔(如流量,負載,溫度,人數.....),不過因為 mrtg 當初的考量是畫兩種資料在圖上(或四個值),後來原作者覺得不足,所以另外又開發了 rrdtool, rrdtool 本身可和 mrtg 結合,但其結合基本上僅在於將 mrtg 的文字檔的log 轉成 rrd 儲存格式,通常 user 尚需要 mrtg-rrd/rrdcgi 去轉換,不過總覺得美中不足,因為最終其實你用到的還是 rrdtool,雖然還有像 my14all (http://my14all.sourceforge.net/) 這類的 tools 可以轉換並畫圖,但其追根究底 還是以 rrdtool 為 base, 所以 rrdtool 變成了最終也是最好的選擇。

平心而論 rrdtool 的學習遠比 mrtg 來得困難,且相關文件資料也沒有 mrtg多,其中中文的參考又幾乎沒有,如果沒有較深厚的 Linux 基礎(尤其是 Shell Script) 或了解 SNMP,懂得英文及好學的心,否則是不建議學習 rrdtool 的.因為你可能很難去控制或獲得你所要的資料,亦可能難於表現圖檔。


Abel 兄的這篇「大作」小弟佩服,rrdTool 的教學文件大概就屬你這中文版最好了!英文版也未見有如此詳細的說明,頭一次在 IT 領域內覺得看的懂中文是幸福的!讀Abel兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #4 於: 2003-08-26 10:05 »
引用
Abel 兄的這篇「大作」小弟佩服,rrdTool 的教學文件大概就屬你這中文版最好了!英文版也未見有如此詳細的說明,頭一次在 IT 領域內覺得看的懂中文是幸福的!讀Abel兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!


那裏,您過獎了~不過確實,我看 http://www.rrdtool.org 網站許多地方也看得不知所云(我也覺得他在重要地方寫得太簡單了~~還好有一天我終於領悟了)
很多地方也都是反覆推敲~再找資料與看別人範例
我窮數日之力學習~而更花數倍的時間文件化
netman 兄邀我講流量分析的一些經驗,可惜我受限於現在環境而不能遠遊
所以就寫了這篇文件回敬他了 ~~

不過,要將 word 檔再貼回來版面還真是給他有點無聊的辛苦  :o

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #5 於: 2003-08-26 12:33 »
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^

VBird

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 1516
    • 檢視個人資料
    • http://linux.vbird.org
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #6 於: 2003-08-26 17:27 »
引述: "netman"
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^
是啊!真的很讚說! ^_^

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #7 於: 2003-08-26 19:10 »
兩位過獎了 ~~
不過我的個性本就是工程師本色~~

如果 netman 兄或 Vbird 兄可以的話將文件中的圖存在學園 Local 端如何 ?
至少不會因為我的主機斷線而看不到圖 (我的是很少斷線,不過純為預防)


.....嗯, 個人目前沒有太多時間再學 snmptrap 及 snmpset(都開會去了,無會不與呀!),不然這方面的東西應可以做得更好才是

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #8 於: 2003-08-26 22:15 »
這樣吧,等我找個時間,將圖抓下來,再轉成 html ,加進  study-area 網站去,
當然,圖片就會在 local 了...

Hawker

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #9 於: 2003-08-26 22:30 »
引述: "abelyang"

但如果是 COUNTER , 前一值是 98,則會畫 2

能否請教 Abel 兄,上述的說法能否舉個例子呢?這段小弟不懂耶!
 
引述: "abelyang"
因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以 11:53:30~12:02:30 的平均值為主

小弟發覺 Abel 兄有張圖有做修改,新增了「line 1」~「line3」的圖例說明,但這段話沒有改,所以想請教一下!這「11:53:30~12:02:30 」時間區間是怎麼推算的呢?因為我推算結果應該是「11:58:30~12:02:30」,以 12:00 為中間點,前後擴展 150s,是小弟忽略到文中那個重點了嗎?

小弟參考了 Abel 兄的大作和手邊的一些資料,在 Solaris 9 x86 04/03 的平台上做了一個本機網路卡的流量監控,rrdtool database 如下:
代碼: [選擇]
rrdtool create /usr/local/misc/rrdtool-1.0.45/var/rtls0.rrd -s 300 \
DS:in:DERIVE:600:0:1000000000 \
DS:out:DERIVE:600:0:1000000000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460

DST 的型態我選用 DERIVE 而非 COUNTER,是因為有人提到如下的說法,不知Abel 兄有什麼看法呢?:
代碼: [選擇]
According to the RRDTool documentation, you're supposed to use COUNTER for these types of data, but I've found RRDTool generates large spikes in the trends if the traffic counters are unexpectedly reset (ie, when you reboot your linux box).
緊接著畫 rrdtool 的圖,使用如下的 perl:
代碼: [選擇]
#!/usr/local/bin/perl
use RRDs;

# define location of rrdtool binary
my $rrdtool = '/usr/local/bin/rrdtool';
# define location of rrdtool databases
my $rrd = '/usr/local/misc/rrdtool-1.0.45/var';
# define location of images
my $img = '/work/www/htdocs/rrdtool';

# define the network interface
my $iface = 'rtls0';
# define a description for the interface
my $descr = 'local ethernet';

# get network interface info
my $in = `netstat -I $iface |grep athena|awk '{print \$5}' `;
my $out = `netstat -I $iface |grep athena|awk '{print \$7}' `;
# remove eol chars
chomp($in);
chomp($out);

print "$iface traffic in, out: $in, $out\n";

# insert values into rrd
`$rrdtool update $rrd/$iface.rrd -t in:out N:$in:$out`;

# daily traffic graph
RRDs::graph "$img/$iface-day.png",
       "-t", "traffic :: $iface $descr",
       "-h", "80", "-w", "600",
       "-a", "PNG",
       "-v", "bytes/sec",
       "DEF:in=$rrd/$iface.rrd:in:AVERAGE",
       "DEF:out=$rrd/$iface.rrd:out:AVERAGE",
       "AREA:in#11EE11:Incoming",
       "LINE1:in#009900",^M
       "GPRINT:in:MAX:  Max\\: %3.lf %s",
       "GPRINT:in:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:in:LAST: Current\\: %3.lf %Sbytes/sec\\n",
       "LINE2:out#0000FF:Outgoing",
       "GPRINT:out:MAX:  Max\\: %3.lf %S",
       "GPRINT:out:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";
if ($ERROR = RRDs::error) { print "$0: unable to generate daily traffic graph: $ERROR\n"; }

畫出來的結果就如下圖:

output 的部分不是很明顯,感覺很糟,有什麼方法可以改善的嗎?小弟今天的努力先到這了,我得起來走動走動了! :o

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #10 於: 2003-08-27 00:05 »
引用
但如果是 COUNTER , 前一值是 98,則會畫 2

這個狀況是如果你的 rrdtool update 資料如果是一直會加上去的 (如網路流量資料)

12:00  1000
12:05  1200
12:10  1350

則在畫圖時會以 "差值來畫"  ,即是 12:05 分畫 200,12:10 分畫 150 也就是說如果你的 update 資料是累計值,則以差值來畫圖,如果 DST 是 GAUGE 的話,那它就是直接畫那個數字了 (這個狀況則較常發生在 連線數,系統負載,等較無累積特性之資料)

至於使用 COUNTER 在 reset box 後的問題,在 GAUGE 也是會有一點問題, mrtg 也是一樣,在發生時間點:

12:13  linux restart,all data become to 0
12:15  100

會發生 -1250 的狀況,此時用 DRIVER 則會將其視為 0,或您的 COUNTER 宣告時即表示 0:1000000, 理論上應不會有問題 (這個我沒有多注意)
不然要用 CDEF 來特別處理,例如,如果數值小於0 就畫0
原意: v1=if (tr < 0 ) { 0 } else { tr }  (如果 tr 小於 0 則為0,不然為原值)
CDEF:v1=tr,0,LT,0,tr,IF   亦可處理此一狀況(不好理解...,可將 RPN 再多看一點http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/)

引用
小弟發覺 Abel 兄有張圖有做修改,新增了「line 1」~「line3」的圖例說明,但這段話沒有改,所以想請教一下!這「11:53:30~12:02:30 」時間區間是怎麼推算的呢?因為我推算結果應該是「11:58:30~12:02:30」,以 12:00 為中間點,前後擴展 150s,是小弟忽略到文中那個重點了嗎?

嗯~~這是我的筆誤...我等會回頭去修正一下.是您說的狀況沒有錯, step 的 正負一半值 (+-150s)

引用
RRDs::graph "$img/$iface-day.png",
       "-t", "traffic :: $iface $descr",
       "-h", "80", "-w", "600",
       "-a", "PNG",
       "-v", "bytes/sec",
       "DEF:in=$rrd/$iface.rrd:in:AVERAGE",
       "DEF:out=$rrd/$iface.rrd:out:AVERAGE",
       "AREA:in#11EE11:Incoming",
       "LINE1:in#009900",^M
       "GPRINT:in:MAX:  Max\\: %3.lf %s",
       "GPRINT:in:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:in:LAST: Current\\: %3.lf %Sbytes/sec\\n",
       "LINE2:out#0000FF:Outgoing",
       "GPRINT:out:MAX:  Max\\: %3.lf %S",
       "GPRINT:out:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";

首先您 in 畫了兩次 , AREA,LINE2 , AREA 的功能就是 LINE{1|2|3} 至 X 軸間的區間整個都畫成 11EE11 的顏色,此時再加 Line 容易混淆 (您亦可能有自己的深意)
out 值就是一開始提到的,資料數據間相差太大時,數值小的將不容易顯現,解決方法有兩種:

1. 將 in 除以 1024 (以 Kbytes 計算),而 out 值仍為 bytes 算
v_in=in,1024,/      =>AREA:v_in...Incoming(Kb)  的輸出結果將是除過 1024 的值
2. 皆以 AREA 畫圖,但將小值放在上面 (做一次你就會明白我說的)
CDEF:v_out=in,out,+

AREA:v_out....
AREA:in.....

至少疊在上面會得較清楚些..且看到 v_out 的值除了可以看出 out 的量外也可看出 TR+TX 的總合

另外
引用
"GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";

先改成 "GPRINT:out:LAST: Current\\: %3.lf bytes/sec";
將 %S 拿掉也不要用 %s, 此時 rrdtool 將以 bytes 表示

至於您圖中間 "讓幾康(台語)" 我並不了解原因,可能是 cronjob 或您自身因素所致

不錯了呀~~第一天就有這樣的結果了 ...
當初我是 K 了三天才動手做我的第一個實作~~
也是一直出包 , 一定要出過包,不然學不好哦

PS: 若有需要我會直接改第一篇的文字或說明讓大家可以更明白
還請 netman 兄先佔緩 local 端的動作

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #11 於: 2003-08-27 04:59 »
引述: "netman"
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^

的確,自從 abel 兄上了 study area 之後,另各學員獲益不少

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org

robbinl

  • 可愛的小學生
  • *
  • 文章數: 12
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #13 於: 2003-09-06 10:52 »
請問 ,那要用這套工具來取代mrtg, 要如何作

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #14 於: 2003-09-06 16:18 »
引述: "robbinl"
請問 ,那要用這套工具來取代mrtg, 要如何作

就您寫給我的 mail 而言是的
先了解 rrd file 的結構,建出你的 rrd file, 如果像想將 mrtg 的資料直接轉過去
可參考 http://phorum.study-area.org/viewtopic.php?t=17750
但這個例子我只 parser 前面五分鐘的而以,其他時間的數據我並沒有做

所以流程中是建 rrd file, 定期 update
畫圖可於瀏覽時再去畫即可
建議您將全篇來回多看幾次哦~剛開始做會有很多不能貫通之處
多實作才能像我這麼熟哦  :D

polinwei

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
rrdtool
« 回覆 #15 於: 2003-09-16 11:57 »
請問什麼時候才需要作 update 的動作 ? 有需要排在 crontab 裡嗎?
---------------------------------------------------------------------------
.新增資料
rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]
這個很好理解,基本上就是根據 DS來更新資料,如上述之 tcpdump.rrd,若有需要更新時及時
$>rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以
$>timestamp=`date +%s `
來轉現在秒數,如果是某些特定時間,則可以
$>timestamp=`date -d "2003/08/15 12:00" +%s`

通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab 根據你在 rrdtool create 時的 step 來決定執行排程的時間點
http://211.72.210.199/tcpdump.txt 這裏提供一個 update 範例檔給大家,其時間範圍為 2003/08/15~2003/08/25,step 為 300s,根據這個檔您自己可適時的建立自己的 rrd file,最好不要抄上面才好(放不進去 rrdfile,請再將 create 指令再看一次,一定是你漏了什麼了).

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #16 於: 2003-09-16 14:40 »
是的,用 cronjob 做排程,但請注意這段文字
引用
通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab 根據你在 rrdtool create 時的 step 來決定執行排程的時間點

peyyi

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #17 於: 2003-09-24 17:45 »
to~ dear abelyang:
看到這...感覺非常感動...!!竟然有人把rrd用中文寫的這麼透徹,由於我目前學校的專題也是做rrd的,找其相關資料...就很想淚滿面,因為幾乎都是英文...,每次都要從裡面臆測原意,總之頭痛萬分...當我不小心逛到這,彷彿就像在沙漠中看到綠洲,有點傻眼了...不是傻傻的眼花哦...而是佩服的眼神愣住了!! Linux基礎能力一點都沒有的我們,只能用windows2000架設,可是不知道為什麼...架構大致上都出來了,就無法產生圖解...總之目前仍是努力階段...只是看到你的大作...卻忍不住想向你說聲"利害"。

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #18 於: 2003-09-24 22:25 »
那裏~
至於 windows 版的 rrd 我沒有玩過, 我猜問題可能出在 gd 上
如果你一直都無法解決的話可至 www.rrdtool.org 上的 mailist list (rrd-users)
去問問看~我也艾莫能助
也預祝您們成功哦~

觀念若有不懂處歡迎隨時回來問 , CDEF 是一大重點哦!!

vincente

  • 可愛的小學生
  • *
  • 文章數: 24
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #19 於: 2003-09-25 10:48 »
請教abelyang 大大,

小弟寫了一隻 script 來抓 memory 使用量的數字,想要用 rrdtool 來畫,
發現,如果數字不大,它就畫得出來,出果數字像這樣 2015116 它就畫不出來了。

是我哪個地方設錯了嗎?我都是用 GAUGE 來 create 的,是這裡的問題嗎?
可是我試過別的,也都有同樣的情況 ...

不知您是否有遇過類似的情況?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #20 於: 2003-09-25 12:28 »
我猜可能是 DS 值的上下界沒設好
如果方便的話您可貼上來您的 rrdtool create 語法,我再幫您看看

neochen

  • 可愛的小學生
  • *
  • 文章數: 17
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #21 於: 2003-11-12 17:33 »
請教abelyang大大,在你那篇大作中提到的一段
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`
這個'sed -e 's ................g' 我實在不是很了解,可以請你解答一下嗎?

感激不盡

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #22 於: 2003-11-12 17:47 »
引述: "neochen"
請教abelyang大大,在你那篇大作中提到的一段
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`
這個'sed -e 's ................g' 我實在不是很了解,可以請你解答一下嗎?

感激不盡

tcpdump -v 的訊息格式:
17:43:18.505395 xxx.net.tw > u160-71.u61-70.giga.net.tw: icmp: echo reply (ttl 64, id 13669, len 84)
sed 在抓 那個 "84" 的結果,也就是這個封包 size
 "len" 到 ")" 的結果為 \(.*\) 即是 \1 也就是第一個 match
tr 後會變成
N+N+N+N+ , 最後再補一個0成為 echo "N+N+N+N+0" | bc
求出總 size,

neochen

  • 可愛的小學生
  • *
  • 文章數: 17
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #23 於: 2003-11-13 13:34 »
謝啦abelyang大大,經過你一解釋之後......通了~
再次謝謝你

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #24 於: 2003-11-14 16:20 »
再貼一個 Performance Monitor 的例子
這個例子在監測每一部 DNS 伺服器的
53/udp 的反應時間,有點像 ping 的樣子
若你要用在 http , smtp 等上面,可以研究 hping2 的
功能,只要是有開 Port 的 Service 都可以測的出來

# 建立 rrdfile ,共七部主機,每個檢測主機連線狀況的時間點為 1 分鐘
代碼: [選擇]
rrdtool create /root/study/dnsquery.rrd -s 60 \
DS:a:GAUGE:600:-100:10000 \
DS:b:GAUGE:600:-100:10000 \
DS:c:GAUGE:600:-100:10000 \
DS:d:GAUGE:600:-100:10000 \
DS:ns:GAUGE:600:-100:10000 \
DS:f:GAUGE:600:-100:10000 \
DS:g:GAUGE:600:-100:10000 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800 \
RRA:AVERAGE:0.5:24:1200 \
RRA:AVERAGE:0.5:288:600 \
RRA:MAX:0.5:1:14400 \
RRA:MAX:0.5:6:4800 \
RRA:MAX:0.5:24:1200 \
RRA:MAX:0.5:288:600


# 測試該機器之 DNS 連線品質
代碼: [選擇]
#!/bin/sh
RRD_PATH="/root/study/dnsquery.rrd"
image_path="/root/study/html"

host="主機a 主機b ....,這個例子共七部"
rrd_data=""
for dns in $host
do
#取得查詢的反應時間,查的項目為 Root 列表,非其他 Domain
                msec=`dig @$dns . ns | grep 'Total' | sed -e 's/.*: \(.*\) [a-z].*/\1/'`
                if [ -z $msec ];then
#如果沒有抓到 msec 字眼表示這個查詢敗失敗,改以負值表示
                          msec=-100
                 fi
                 rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#更新 rrd file 資料
rrdtool update $RRD_PATH ${now}${rrd_data}



#產生圖檔 (weekly 統計)
# -x 參數為 每六小時為副格線,共七大格,每格一天,時間表示為 幾月幾日
# CDEF:z0 參數為為平均值,為方便圖的表現,填在負值
# 500,1000,1500 等數值為區分不同的主機,不加這個值,線圖會都疊在一起而難看
#      這個值也可以在 dig 那一段程式處,就先處理 (如先加 500,1000 ..)
# CDEF:a11 為一固定值,因為不能寫常數,所以給他一個恆為 3000,2500 等值之運算
代碼: [選擇]
rrdtool graph ./ping-week.jpg --title="DNS 查詢反應時間" -w 800 -h 600 \
-v "53/udp dig response time (msec)" -s `date -d "-1 week" +%s` -X b \
-up-limit=1000 -x HOUR:6:DAY:7:DAY:1:0:"%m月 %d日" \
DEF:a=dnsquery.rrd:a:MAX \
DEF:b=dnsquery.rrd:b:MAX \
DEF:c=dnsquery.rrd:c:MAX \
DEF:d=dnsquery.rrd:d:MAX \
DEF:ns=dnsquery.rrd:ns:MAX \
DEF:f=dnsquery.rrd:f:MAX \
DEF:g=dnsquery.rrd:g:MAX \
CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,* \
CDEF:a1=a,3000,+ \
CDEF:a11=3000,a,a,-,+ \
CDEF:b1=b,2500,+ \
CDEF:b11=2500,a,a,-,+ \
CDEF:c1=c,2000,+ \
CDEF:c11=2000,a,a,-,+ \
CDEF:d1=d,1500,+ \
CDEF:d11=1500,a,a,-,+ \
CDEF:ns1=ns,1000,+ \
CDEF:ns11=1000,a,a,-,+ \
CDEF:f1=f,500,+ \
CDEF:f11=500,a,a,-,+ \
CDEF:g1=g, \
AREA:z0#c0c0c0:"平均反應時間" \
COMMENT:"\n" \
AREA:a1#ff0000:"主機a" \
GPRINT:a:MAX:"%12.0lf" \
        GPRINT:a:AVERAGE:"%12.0lf" \
        GPRINT:a:MIN:"%12.0lf" \
        GPRINT:a:LAST:"%12.0lf\n" \
AREA:a11#ffffff \
AREA:b1#800000:"主機b" \
GPRINT:b:MAX:"%12.0lf" \
        GPRINT:b:AVERAGE:"%12.0lf" \
        GPRINT:b:MIN:"%12.0lf" \
        GPRINT:b:LAST:"%12.0lf\n" \
AREA:b11#ffffff \
AREA:c1#00ff00:"主機c" \
GPRINT:c:MAX:"%12.0lf" \
        GPRINT:c:AVERAGE:"%12.0lf" \
        GPRINT:c:MIN:"%12.0lf" \
        GPRINT:c:LAST:"%12.0lf\n" \
AREA:c11#ffffff \
AREA:d1#008000:"主機d" \
GPRINT:d:MAX:"%12.0lf" \
        GPRINT:d:AVERAGE:"%12.0lf" \
        GPRINT:d:MIN:"%12.0lf" \
        GPRINT:d:LAST:"%12.0lf\n" \
AREA:d11#ffffff \
AREA:ns1#0000ff:"主機ns" \
GPRINT:ns:MAX:"%8.0lf" \
        GPRINT:ns:AVERAGE:"%12.0lf" \
        GPRINT:ns:MIN:"%12.0lf" \
        GPRINT:ns:LAST:"%12.0lf\n" \
AREA:ns11#ffffff \
AREA:f1#000080:"主機f" \
GPRINT:f:MAX:"%12.0lf" \
        GPRINT:f:AVERAGE:"%12.0lf" \
        GPRINT:f:MIN:"%12.0lf" \
        GPRINT:f:LAST:"%12.0lf\n" \
AREA:f11#ffffff \
AREA:g1#ff8040:"主機g" \
GPRINT:g1:MAX:"%12.0lf" \
        GPRINT:g1:AVERAGE:"%12.0lf" \
        GPRINT:g1:MIN:"%12.0lf" \
        GPRINT:g1:LAST:"%12.0lf\n" \
COMMENT:"註1:負值表該時間點主機查詢無回應\n" \
COMMENT:"註2:各階起點差距值為 500"


結果:

cch

  • 憂鬱的高中生
  • ***
  • 文章數: 194
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #25 於: 2004-01-29 15:31 »
請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #26 於: 2004-01-29 15:57 »
引述: "cch"
請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?


第一篇你可能沒有看仔細哦,
DS:telnet:COUNTER:600:0:100000000 \
DS:smtp:COUNTER:600:0:100000000 \
DS:domain:COUNTER:600:0:100000000 \
DS:http:COUNTER:600:0:100000000 \
DS:total:COUNTER:600:0:100000000 \


這裏建了五個 Data Source, rrdtool update 時,若沒有特別指定更新的是那一個 DS, 就要輸入五個,那五個數字就是 DS 的值

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #27 於: 2004-01-30 12:26 »
早上有緣見到了阿伯本人
(ABEL念起來像阿伯 呵呵)
不過他本人可不像阿伯喔
和鳥哥一樣具備書生氣質

重點是阿伯說
一個月內要在酷學園再貢獻三篇像這樣的巨作
PowerDNS+ PowerAdmin  (DB DNS 及網頁介面)
Libnss                             ( 用 DB 做 login/pop3/... 等認證 )
mod_auth_mysql             ( 用 DB 做 htaccess 等帳號認證

大家流口水期待吧
有酷學園和阿伯 人生是彩色的
嘻嘻
佈線深似海!
網路高如天!

damon

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 4227
    • 檢視個人資料
    • http://blog.damon.tw/
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #28 於: 2004-01-30 21:40 »
以趨勢而言,未來將會是ldap auth的時代,其實現在也已經幾乎是了,其他的用db來作認證的方式,都不是主流,且要整合single sing on也不適合

cch

  • 憂鬱的高中生
  • ***
  • 文章數: 194
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #29 於: 2004-02-05 17:29 »
原來如此...再試試!!
引述: "abelyang"
引述: "cch"
請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?


第一篇你可能沒有看仔細哦,
DS:telnet:COUNTER:600:0:100000000 \
DS:smtp:COUNTER:600:0:100000000 \
DS:domain:COUNTER:600:0:100000000 \
DS:http:COUNTER:600:0:100000000 \
DS:total:COUNTER:600:0:100000000 \


這裏建了五個 Data Source, rrdtool update 時,若沒有特別指定更新的是那一個 DS, 就要輸入五個,那五個數字就是 DS 的值