站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

MRTG-Cband Status 流量圖表化

前言

實作完 [Apache mod_cband 流量限制] 功能後雖然可以即時看到流量,但也希望為流量留下歷史記錄,因此安裝文字模式網頁瀏覽器 lynx 去抓取 cband-status 成果網頁中 Limit 及 Current 的流量數值來畫出 MRTG 圖,在開始玩本次實作以前請先確定您的 MRTG 已安裝並正確定設定,若無可參考本站 MRTG-主機網卡流量統計 文章。

實作環境

安裝及設定

有關於如何設定 Apache mod_cband 請參考站內文章 [Apache mod_cband 頻寬限制]

步驟1.安裝 lynx 套件

安裝文字模式網頁瀏覽器 lynx 已便屆時可順利抓取需要的欄位值。

 #cd /usr/ports/www/lynx             //切換至安裝路徑
 #make install clean                 //安裝套件並清除安裝過程中產生不必要檔案

測試抓取 Limit 及 Current 欄位值,環境說明如下

將 cband-status 網頁資料 Dump 出來後再利用 grep 及 cut 指定來過濾出我們要抓取目前流量中的 Limit、Current 欄位值,如下為抓取 Limit 數值

 #lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1

建立 jiakai.sh 內容就是抓取目前流量中 Limit、Current 欄位值 (編輯完後記得權限要設為 755 哦)

 #vi /usr/local/etc/mrtg/weithenn.sh
 #!/bin/sh
 CURRENT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
 LIMIT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
 echo $CURRENT
 echo $LIMIT
 echo '0'
 echo '0'

步驟2.建立 MRTG 設定檔 weithenn.cfg

抓取 Limit、Current 欄位值後便利用 MRTG 把抓取的數值畫出圖來了,MRTG 設定檔 weithenn.cfg 內容如下

 Target[apache]: `/usr/local/etc/mrtg/weithenn.sh`                        //抓取 Limit、Current 欄位值
 Options[apache]: growright,gauge                                         //growright 流量圖由右向左 gauge 數值不累加
 Title[apache]: Bandwidth Traffic Status -- www.weithenn.org              //網頁的 title (Browser 左上方文字)
 PageTop[apache]: <H1>Bandwidth Traffic Status -- www.weithenn.org</H1>   //流量網頁內的標題
 MaxBytes[apache]: 1024                                                   //流量圖表的最大值 (因為此例限制流量為 1Mbps 也就是 1024kbps)
 YLegend[apache]: Limit(1024 kbps)                                        //流量圖的 Y 軸顯示名稱
 ShortLegend[apache]: kbps                                                //每個流量圖下最大、平均、目前的數值說明文字 (單位)
 LegendI[apache]: Current                                                 //每個流量圖表中顯示的綠色字體     
 LegendO[apache]: Limit                                                   //每個流量圖表中顯示的藍色字體
 Legend1[apache]: Current Bandwidth                                       //綠色字體說明文字 (最下面)
 Legend2[apache]: Limit Bandwidth                                         //藍色字體說明文字 (最下面)
 WorkDir:/home/web/mrtg                                                   //指定存放流量圖檔的路徑
 Language:big5                                                            //使用語系

步驟3.產生檔案

產生檔案,下列指令執行 2 ~ 3 次到沒錯誤訊息後就代表完成了,因為我的環境為 zh_TW.UTF-8 所以必須加上 env LANG=C 才可順利執行,並於執行後將結果寫入 mrtg.log 中。

 #env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/weithenn.cfg --logging /var/log/mrtg.log 

步驟4.寫入排程

將如下指令寫入排程內以便達成自動產生流量圖表 (每五分鐘執行一次)

 #crontab -e
 */5 * * * *   `env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/weithenn.cfg --logging /var/log/mrtg.log`     //每五分鐘執行一次

補充:如何快速分析 MRTG Log

當執行 MRTG Log 後會產生執行後的記錄檔,其實也是用這個記錄檔來比較前後的量並畫出流量圖的,若您想直接把數據做成報告可利用如下指令快速達成,MRTG Log 總共五個欄位:

  1. 時間 TimeStamp: 以秒數表達從 1970 年 1 月 1日 GMT 開始計算
  2. 流入 Incoming: 流入平均值,單位為 bytes per second (Bps)
  3. 流出 Outgoing: 流出平均值,單位為 bytes per second (Bps)
  4. 流入 Incoming Maximum: 流入平均值統計中最大值,單位為 bytes per second (Bps)
  5. 流出 Outgoing Maximum: 流出平均值統計中最大值,單位為 bytes per second (Bps)

了解各欄位值後比較麻煩的大概就只有時間 TimeStamp 的部份而以,我們可以利用如下 Perl 指令來將 TimeStamp 轉換成 Localtime,若 MRTG Log 名稱為 weithenn.log 如下指令即可轉換欄位一 TimeStamp 為 Localtime

 #perl -p -e 's/^\d+/localtime $&/e' < weithenn.log
 Wed Sep  9 14:40:03 2009 6557273 5389256 6557273 5389256
 Wed Sep  9 14:35:04 2009 7343261 5728073 7343261 5728073
 Wed Sep  9 14:35:00 2009 7343199 5729406 7343261 5808085
 Wed Sep  9 14:30:00 2009 7350242 5810427 8140328 5983772
 Wed Sep  9 14:25:00 2009 8139665 5984683 8140328 6052102
 ...略...

參考

[MRTG - description of the mrtg-2 logfile format]

[OHaHa's學習心得 lynx: 文字模式網頁瀏覽器]

Me FAQ

Q1.ERROR: Target[efg][_IN_] ' $target->[0]{$mode} ' did not eval into defined data?

Error Meaage:

建立 jiakai.sh 內容就是抓取目前流量中 Limit、Current 欄位值的 weithenn.sh 直接執行可以正確抓到流量數值,但透過 crontab 執行後無法畫出正確的流量圖,且查看 /var/log/mrtg.log 出現如下錯誤訊息說 MRTG 抓不到我們給的 IN、OUT 數值?

 #tail /var/log/mrtg.log
 2009-09-09 11:10:00: WARNING: Problem with External get '/usr/local/etc/mrtg/weithenn.sh':   Expected a Number for 'in' but got ''
 2009-09-09 11:10:00: WARNING: Problem with External get '/usr/local/etc/mrtg/weithenn.sh':   Expected a Number for 'out' but got ''
 2009-09-09 11:10:00: ERROR: Target[efg][_IN_] ' $target->[0]{$mode} ' did not eval into defined data
 2009-09-09 11:10:00: ERROR: Target[efg][_OUT_] ' $target->[0]{$mode} ' did not eval into defined data

Ans:

原因在於 lynx 指令沒有採用絕對路徑且 weithenn.sh 內也沒有指定 PATH,因為 weithenn.sh 是用 sh shell 而預設載入的 PATH 只有 /usr/bin 及 /bin 而以,但 lynx 指令路徑在 /usr/local/bin/lynx 所以就造成直接執行該 script 可以抓到數值 (因為預設會把 /usr/local/bin 載入至 PATH) 但透過 crontab 時會無法載入,就造成上述的錯誤訊息了。

解決方式請將 weithenn.sh 的 lynx 指令改為絕對路徑或宣告路徑。

 #cat /usr/local/etc/mrtg/weithenn.sh
 #!/bin/sh
 CURRENT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
 LIMIT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
 echo $CURRENT
 echo $LIMIT
 echo '0'
 echo '0'
 #cat /usr/local/etc/mrtg/weithenn.sh
 #!/bin/sh
 export PATH=/usr/bin:/bin:/usr/local/bin
 CURRENT=`lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
 LIMIT=`lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
 echo $CURRENT
 echo $LIMIT
 echo '0'
 echo '0'
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com