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

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

adrianmak

  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #60 於: 2004-12-10 18:12 »
我想問有時某個時段有很大流量e.g. 1.5M 其餘時段一般時400k
這造成個圖的比例有太正常,其餘時段的只顯示出很少

如何解決 ?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #61 於: 2004-12-10 18:34 »
一條線 1 ~1000000 , 結果 1 很小,15000 很大,
結果 1 幾乎看不見,本來就這樣呀 , 您覺得呢 ?
15000 要寫成 150, 1 還是寫 1

若你真要做且不會混淆原來的 150 , 那就去看 CDEF 的用法
想想看你的邏輯有什問題

adrianmak

  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #62 於: 2004-12-11 07:20 »
I try to use tcpdump.sh but I got a problem
sed: -e expression #1, char 19: Unterminated `s' command
sed: -e expression #1, char 19: Unterminated `s' command
sed: -e expression #1, char 20: Unterminated `s' command

adrianmak

  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #63 於: 2004-12-11 07:28 »
這個是我修改一點abelyang提供的tcpdump.ssh
用來plot http, bittorrent
代碼: [選擇]

RRD_PATH="/usr/local/rrdtool/db/tcpdump.rrd"
image_path="/usr/local/httpd/htdocs/mrtg"
sec=300
killall tcpdump
mv ip.packet ip.packet.1
/usr/sbin/tcpdump -w ip.packet  tcp or udp or icmp &
scan_port="80 9000"
rrd_data=""
for sport in $scan_port
do
        port=`/usr/sbin/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=`/usr/sbin/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 "/usr/local/rrdtool/bin/rrdtool update tcpdump.rrd $now:$rrd_data$total" >>tcpdump.cmd
/usr/local/rrdtool/bin/rrdtool update tcpdump.rrd $now:$rrd_data$total

image_path=/usr/local/httpd/htdocs/mrtg
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/rrdtool/bin/rrdtool graph $image_path/example-$t.png \
--title "Application port traffic analysis"   \
DEF:t1=$RRD_PATH:bt:AVERAGE \
DEF:t2=$RRD_PATH:http:AVERAGE \
DEF:t3=$RRD_PATH:total:AVERAGE \
CDEF:v1=t1,t2,+ \
CDEF:v2=t1 \
CDEF:v3=t3,1024,/ \
COMMENT:"PORT analysis---max---average----min-----now\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#FF0000:"BT" \
GPRINT:t2:MAX:"      %12.0lf " \
GPRINT:t2:AVERAGE:"%12.0lf " \
GPRINT:t2:MIN:"%12.0lf " \
GPRINT:t2:LAST:"%12.0lf \n" \
LINE2:v3#000000:"Total(Kb)" \
GPRINT:v3:MAX:"  %12.0lf " \
GPRINT:v3:AVERAGE:"%12.0lf " \
GPRINT:v3:MIN:"%12.0lf " \
GPRINT:v3: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

但執行是有以下錯誤
sed: -e expression #1, char 19: Unterminated `s' command
sed: -e expression #1, char 19: Unterminated `s' command
sed: -e expression #1, char 20: Unterminated `s' command

likerain

  • 憂鬱的高中生
  • ***
  • 文章數: 104
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #64 於: 2004-12-13 09:49 »
大大..真是太感謝你了....多虧你的這個大作啊

russell

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #65 於: 2004-12-17 01:24 »
請教abel兄...

rrd檔產生後,可否"新增"or"刪除"某幾個欄位
例如,我有一個rrd file,collect mem_usage,free,page_fault,page-in,page-out
二個月後,覺得pages的三個欄位已不需要,是否可以只刪這三個欄位,
而不需重新 create rrd.(考量到舊資料的保留)
或是有其它方式可以將要保留的欄位資料轉到新的rrd file.
謝謝. :wink:

韓仔

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #66 於: 2005-01-06 10:44 »
請教abel兄.

我用rrdtool來監測dns server,我的作法如下:
一、rrdtool為1.0.41版
二、參考您的語法建立rrd file
rrdtool create /root/dns/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

三、用vi建立check.sh
#!/bin/sh
RRD_PATH="/root/dns/dnsquery.rrd"
image_path="/var/www/html/rrdtool"


#host="10.12.10.151  10.12.10.155 10.12.10.201 10.12.10.202 10.12.10.12 10.10.10.1 10.10.10.2 "
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}

四、在crontab中加入一筆

0-59/5 * * * *  /root/dns/check.sh

五、畫圖
#rrdtool graph ./ping-week.jpg --title="ASEK DNS response time" -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:"%mMonth %dDay" \
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:"AVG response time" \
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:"DNS server  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:"DNS server  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:"DNS server  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:"DNS server  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:"DNS server  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:"DNS server  g" \
GPRINT:g1:MAX:"%12.0lf" \
        GPRINT:g1:AVERAGE:"%12.0lf" \
        GPRINT:g1:MIN:"%12.0lf" \
        GPRINT:g1:LAST:"%12.0lf\n" \
COMMENT:"1:negative value mean no response\n" \
COMMENT:"2:GAP=500"

六、從圖中卻沒有看到什麼流量耶,不知道那裡有錯誤,希望abel兄幫忙一下,謝謝。[/img]

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #67 於: 2005-01-06 18:58 »
引用
#host="10.12.10.151 10.12.10.155 10.12.10.201 10.12.10.202 10.12.10.12 10.10.10.1 10.10.10.2 "
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}

請先確定這一段有執行結果
echo 出來看看

韓仔

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #68 於: 2005-01-07 08:50 »
經過我echo的結果,不論是在命令列或網頁都好像沒有什麼產生耶。

我是在command line直接把那些指令貼上執行,不含那些中文。

那裡有錯誤了呢?謝謝

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
rrdtool 問題
« 回覆 #69 於: 2005-01-07 16:17 »
各位學長
   我最近在學習rrdtool 來作一些系統的效能監測
有下列幾個問題,請各位學長幫忙解答一下

1. 如何在要瀏覽資料時 ,再畫圖

     有不少篇文章提到要查資料時再畫圖,可以減少系統的負擔
     但是大多數的範例都是在更新資料時順便更新圖檔
     在文章中提到的 mrtg + rrdtool 使用 my14all.cgi
    我有實作成功,他會去讀取 mrtg的.cfg 檔案 , 作為畫圖的
     設定資料,但是我用 rrdtool 去更新 rrd 檔案時, 要如何直
     接讀取 rrd 檔作畫圖, 若是要自己寫 cfg 檔, 那要如何寫
    是否有格式及範例

2. 在更新資料及畫出日,週,月,年 的統計資料時,大多使用
     date %s 及 date -d 等功能,因為我的環境須要跨平台
     在 AIX 及 Solaris 上也要使用 , 但是在 某些平台上並
     沒有上列的功能可以使用,不知有什麼好的方法可以取代

3. 若是要查一天以前的詳細資料, 以五分鐘為單位的,
    一定要寫入資料庫嗎,有什麼辦法可以作到,
    另外若是要寫入資料庫的話要如何作

                                             感謝各位學長的協助

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
rrdbrowse
« 回覆 #70 於: 2005-01-07 17:45 »
各位學長
    在查看有關rrdtool 時發現了 rrdbrowse
請問各位學長有沒有人使用過,可以發表一下
使用感想及安裝方法等
網址 http://www.rrdbrowse.org/index.php

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #71 於: 2005-01-11 12:20 »
韓仔,
你的問題在於你對 "程式" 或 "script" 沒有概念...
你看 dig 的訊息, grep 的條件自己修改一下即可,
不知如何修改不要問我.

k1951223,
rrdtool 本身可以指定時間,不見得要用 date 來做,
例如, -s -1d 是一天前, rrdtool 會自動把他換成秒
這樣的問題,建議您自己研究一下 AIX 等 date 的用法
或在 rrdtool 的 graph 指令上多研究,
至於 rrdbrowse  沒有用過,因為只要了解
rrdtool/snmp/language , 這些東西都可以自己做

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
rrdcgi
« 回覆 #72 於: 2005-01-11 18:06 »
感謝 abelyang 的回覆

我現在使用RRDCGI 作劃圖的動作,
相關及用法介結連結如下

http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/rrdcgi.html

可以在查看網頁時才劃圖更新資料,而且語法很簡單

如 abelyang 的回覆 利用 --start -1d --end now 可以指定要劃圖的時間

但是有一個問題是劃新的圖時會根據設定來制作圖檔,
隔一段時間再執行時也會更新資料
但是若是更改cgi 檔案的內容再劃圖則不會根據新的設定重新制作圖檔
不知是否有學長知道要如何處理,

註: 因為要提供使用者在網頁選擇日期後,劃出當天的資料

韓仔

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #73 於: 2005-01-14 09:08 »
請教abel兄.
我在command line打入
#dig @10.10.10.1 . ns | grep 'Query time' | sed -e 's/.*: \(.*\) [a-z].*/\1/'
得到以下結果
3

但是我將整個script改成以下
#!/bin/sh
RRD_PATH="/root/dns/dnsquery.rrd"
image_path="/var/www/html/rrdtool"
#host="10.12.10.151,10.12.10.155,10.12.10.201,10.12.10.202,10.12.10.12,10.10.10.1,10.10.10.2"
rrd_data=""
for dns in $host
do
msec=`dig @$dns . ns | grep 'Query time' | sed -e 's/.*: \(.*\) [a-z].*/\1/'`
                if [ -z $msec ];then
  msec=-100
                 fi
                 rrd_data="$rrd_data:$msec"
done
now=`date +%s`
rrdtool update $RRD_PATH ${now}${rrd_data}

卻得到以下的結果,可以幫我檢查一下嗎?

#./check.sh
ERROR: expected 7 data source readings (got 0) from 1105664563:...

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #74 於: 2005-01-14 11:30 »
k 兄的問題不是很清楚您的狀況,或可再描述清楚些

韓兄的問題,可以很明顯感覺得您對 shell script 不是很了解,
建議您先修好要用的語言,並了解其他的 debug 技巧,再來
研究您現在所碰到的問題較好

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
rrdtool
« 回覆 #75 於: 2005-01-14 11:44 »
abelyang 學長
   我的問題主要是因為,有需求要查看之前的資料
例如,三天前的每五分鐘一筆,一天的流量圖
在利用rrd 畫圖時,必需要等五分鐘後有新的資
料寫入rrd 去執行 rrd GRAPH 時才會更新圖檔
若是沒有新資料寫入,去執行 rrd GRAPH 並不會
更新圖檔,除非把圖檔刪除,建立新的檔案才會立即
更新,是否有什麼參數之類的,可以立即更新圖檔,
或是有什麼寫法,可以立即產生

netboy

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #76 於: 2005-01-16 15:19 »
我现在装好了rrd,但是发现它不支持中文啊,请问楼主是否可以共享一下修改后的rrdtool ?谢谢

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #77 於: 2005-01-18 09:48 »
k1951223 兄,
您用的東西我可能沒用過,無法幫助您,不過建議您可以自己
在 cgi 產生圖檔前,cgi 先做 delete 圖檔的動作,應可以才是
我自己是都這樣做的

netboy:
請把這串全部看完,裏面有提到..

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
rrd cgi 畫圖
« 回覆 #78 於: 2005-01-21 18:55 »
各位學長
   發現一個網站 http://donitor.shows.it/
有利用rrdtool 去統計 eDonkey 的伺服器流量
在按下圖檔時會秀出不同時間區間的資料
分為 12h , 2d , 8d , 32d 幾種

示範  http://www.edu.uni-klu.ac.at/~splattne/donitor/monitor_12h.html

下載 http://aleron.dl.sourceforge.net/sourceforge/donitor/donitor_1.3.2.tgz

Ada

  • 懷疑的國中生
  • **
  • 文章數: 33
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #79 於: 2005-02-01 17:20 »
補充一下,新版的 rrdtool for windows 只剩下 rrdtool.exe 而以...
另外,Windows 上的 rrdtool 一樣有中文字的問題... :(

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
圖檔即時更新
« 回覆 #80 於: 2005-03-17 19:43 »
各位學長
   我現在利用 RRD CGI 作畫圖的動作
己經可以輸入結束時間去查詢過去的流量資料了
但是有幾個問題,使用運作上不是很順利,要請教
各位學長有沒有好一點的作法.

1. 產生圖檔不會更新的問題,有參考 abelyang 的建議
    先將圖檔刪除再去,產生新的圖檔及顥示在網頁上

   但是這樣變成會有重覆性的 io 動作,是否有辦法將圖
   檔產生在記憶體或是變數之類的,就不用將圖存入硬碟
   中了

2. 我是利用在url 加上查詢時間以更改畫圖的時間區段,
    但是在更改了查詢的時間後,輸入 Enter 鍵圖檔並不會
     更新,要按下重新整埋或是 F5 鍵 ,才會顥示新的圖檔,
   我也有在html 的輸出加上 no-cache 的設定,還是會有
    一様的情形.
   
   請問是否有方法解決上列的情形,不過如果能找到問題一的
   解決方法,也許就不會有問題二了


以後,

韓仔

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #81 於: 2005-04-13 16:34 »
關於之前詢問rrd的問題,目前已經測試ok了。跟大家分享一下。

先建立rrd file 用以下的指令

#rrdtool create /dnsrrd/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

建立查詢的script,以七台dns server為例,測試root server的response time

#vi check.sh
#!/bin/sh
RRD_PATH="/dnsrrd/dnsquery.rrd"
image_path="/var/www/html/rrd"

host="10.10.10.5 10.10.10.7 10.12.10.72 10.15.10.13 10.12.11.121 10.13.10.155 10.12.10.84"
rrd_data=""
for dns in $host
do
                msec=`dig @$dns . ns | grep 'Query' | sed -e 's/.*: \(.*\) [a-z].*/\1/'`
                if [ -z $msec ];then
                          msec=-100
                 fi
                 rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#?? rrd file ??
rrdtool update $RRD_PATH ${now}${rrd_data}



#??
image_path="/var/www/html/rrd"
image_path=/var/www/html/rrd
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2005/04/13 16:00" +%s`
time="hour day week "
for t in $time
do
/usr/bin/rrdtool graph $image_path/eek_dns$t.png \
--title "EEK DNS response time" -h 700 -w 600 \
-v "53/udp dig response time (msec)" -s `date -d "-1 week" +%s` \
-up-limit=1000 -x HOUR:6:DAY:7:DAY:1:0:"%mMonth %dDay" \
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:"AVG response time" \
COMMENT:"\n" \
AREA:a1#ff0000:"DNS server 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:"DNS server 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:"DNS server 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:"DNS server 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:"DNS server e" \
GPRINT:ns:MAX:"%12.0lf" \
GPRINT:ns:AVERAGE:"%12.0lf" \
GPRINT:ns:MIN:"%12.0lf" \
GPRINT:ns:LAST:"%12.0lf\n" \
AREA:ns11#ffffff \
AREA:f1#000080:"DNS server 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:"DNS server g" \
GPRINT:g1:MAX:"%12.0lf" \
GPRINT:g1:AVERAGE:"%12.0lf" \
GPRINT:g1:MIN:"%12.0lf" \
GPRINT:g1:LAST:"%12.0lf\n" \
COMMENT:"1:negative value mean no response\n" \
COMMENT:"2:GAP=500"  \
COMMENT:"Last Updated: $now"
done


目前只有一個問題,產生出來的格式旁的刻度為0.2 ...等等,不知道要如何改成2 4 6這些整數呢?[/b]

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #82 於: 2005-04-14 14:28 »
如果有圖,大家會更明瞭您的問題所在 (0.2??)

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #83 於: 2005-05-10 01:52 »
rrdtool 1.2.X 巳出來一陣子囉...
大家可研究看看...
與上星期同一時間的圖如何畫 ?
我要 DsA 全部,但 DsB 要一個月前就好...
有好幾個新功能...
代碼: [選擇]
Usage: rrdtool [options] command command_options

* graph - generate a graph from one or several RRD

        rrdtool graph filename [-s|--start seconds] [-e|--end seconds]
                [-x|--x-grid x-axis grid and label]
                [-Y|--alt-y-grid]
                [-y|--y-grid y-axis grid and label]
                [-v|--vertical-label string] [-w|--width pixels]
                [-h|--height pixels] [-o|--logarithmic]
                [-u|--upper-limit value] [-z|--lazy]
                [-l|--lower-limit value] [-r|--rigid]
                [-g|--no-legend]
                [-F|--force-rules-legend]
                [-j|--only-graph]
                [-n|--font FONTTAG:size:font]
                [-m|--zoom factor]
                [-A|--alt-autoscale]
                [-M|--alt-autoscale-max]
                [-R|--font-render-mode {normal,light,mono}]
                [-B|--font-smoothing-threshold size]
                [-E|--slope-mode]
                [-N|--no-gridfit]
                [-X|--units-exponent value]
                [-L|--units-length value]
                [-S|--step seconds]
                [-f|--imginfo printfstr]
                [-a|--imgformat PNG]
                [-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]
                [DEF:vname=rrd:ds-name:CF]
                [CDEF:vname=rpn-expression]
                [VDEF:vdefname=rpn-expression]
                [PRINT:vdefname:format]
                [GPRINT:vdefname:format]
                [COMMENT:text]
                [SHIFT:vname:offset]
                [TICK:vname#rrggbb[aa][:[fraction][:legend]]]
                [HRULE:value#rrggbb[aa][:legend]]
                [VRULE:value#rrggbb[aa][:legend]]
                [LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]
                [AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]
                [PRINT:vname:CF:format] (deprecated)
                [GPRINT:vname:CF:format] (deprecated)
                [STACK:vname[#rrggbb[aa][:legend]]] (deprecated)

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #84 於: 2005-05-26 17:47 »
還沒寫好,先借這裏貼一下,看看 layout 情形

RRDTOOL 1.2.x 的差異

1.說明
自從上次的 rrdtool 教學後,頗受好評,不過實至今日, rrdtool 巳從 1.0.x 昇級至 1.2.x 版本,這個 1.2.x
版本基本除了 graph 外,並沒有太多太大的變動,而在 graph 上新增了許多功能,本文的目的主要是向大家解釋
這些新的東西,至於原有的東西您可自參考
http://phorum.study-area.org/viewtopic.php?t=18496 之說明.

2.安裝
這一版的安裝是較費事的,因為它用了幾個較少用的東西(對我而言真的是較少用),你可以在
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/pub/?M=D
下載到最新版的 tarball , 這個 URL 下有一個 libs/ 的目錄內的東西最好也都一次下載,因為裝 1.2.x
版的 rrdtool 一定會用到. contrib/ 下的東西也值得有興趣的人好好研究.

下載後的東西,請先安裝 libs 下的東西,基本上的裝法就是(每一個 tarball 都要)
代碼: [選擇]

$>./configure --help   #看好好看一下有什麼要注意的
$>./configure --prefix=/usr   #把東西裝到 /usr 目錄下
$>make ; make install #編譯及安裝


是的,的確有點費事,且有些 libs 裝起來也要花不少時間,只好耐心等囉.



感覺上的差異
1.2.x 版的 rrdtool 繪圖不再使用 GD , 而使用 libart 及 freetype 等功能來畫圖,所以,我個人在用起
來時,感覺速度上較 1.0.x 版慢了許多,
代碼: [選擇]

#以 1.2.8 畫 100 張圖,time 所計算之時間
real    1m23.076s
user    0m52.855s
sys     0m7.021s
#以 1.0.42 畫 100 張圖,time 所計算之時間
real    0m27.234s
user    0m21.629s
sys     0m5.209s

所以,可以明顯感覺到 1.2.x 較 1.0.x 版本畫圖上慢上了許多,一般公認大概差了 2~3 倍的時間,主要因為
作者(oetiker) 要讓 rrdtool 的 output 可以產生 PDF 檔,所以才造成這種現象,至於使用上的取捨,就看
您的需求囉, 並沒有說新版的一定會較好這種理由.



新的東西(以下介紹皆針對 rrdtool graph)
DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>]
VDEF:vname=RPN expression
SHIFT:vname:offset
[TICK:vname#rrggbb[aa][:[fraction][:legend]]]
可以產生 PDF 檔
[-n|--font FONTTAG:size:font]

這裏面的文字意義如下:

更具彈性空間的定義特性 DEF
定義從那一個 RRD FILE取出裏面的那一個 DS 資料(Data Source Name,DSN)
vname: rrdtool graph 用的變數名稱,可任意取名
rrdfile: 意即那個 rrd 檔案
ds-name: 在建立 RRD FILE 時,用的名稱
CF: 即 MAX/AVERAGE/MIN/LAST 等
*step:    在繪圖時,資料的取用原則,例如,你的 RRD FILE 在建立時,設了 --step 為 300 秒,所以每
   個資料點距為 300 秒,畫一小時共有 12 點,此時,在 DEF 定義 step=1800, 畫一小時就會變
   成兩個點,而其取用則試 CF 而定,例如 CF 為 AVERAGE, 則合併的 6 個點 (1800=300x6),
   其會畫出平均值出來(官網是這麼講,但是我設了做不出來效果,不知原因何在)
*start:   資料起始時間,如果你在 graph 時,以時間參數畫圖,但你只想要某個 DSN 只畫某一段時間,可
   以利用此參數來做,例如, start=end-1w , 即表示要畫這個 DSN 一個星期內的資料,而其他的
   畫全部的資料
*end:   其意同 start, 旨在定義時間區間



標示水平線 VDEF
例如 ,VDEF:avg=mydata,AVERAGE ,
avg 如同一般的 DSN, 而 mydata 為 DEF 之 DSN,AVERAGE 表示求取平均值(時間區間內),並在圖上畫出
之一橫線,以供比較(sample5),

時間徧移 SHIFT
SHIFT:vname:offset
這個功能較特別,主要在 "徧移" 整個資料,例如,你要把過去三個星期以來的數據互相比較時:
DEF:out0=$RRDFILE:ifOutOctets$INT:AVERAGE:start=end-1w  \      #現在以前的七天
DEF:out1=$RRDFILE:ifOutOctets$INT:AVERAGE:start=now-2w:end=now-1w \    #8-14 天前
DEF:out2=$RRDFILE:ifOutOctets$INT:AVERAGE:start=now-3w:end=now-2w \    #15-21 天前
SHIFT:out1:604800   \   # out2 的資料時間向後移  604800 秒,意即一週
SHIFT:out2:1209600   \   # out3 的資料時間向後移 1209600 秒,意即二週

所以我們可以想像,同一個 DSN 我們有三段數據,每段各代表一週的時間,把時間對齊後,我們就可
以週與週間互相比較了,所以像 "與上月比較","與去年同期比較","特定時間區間互相比較",也都可
以信手拈來,只要弄清楚 DEF 中的 start/end 用法,再加上 SHIFT 的 offset 功能,即可達成

透明處理 [TICK:vname#rrggbb[aa][:[fraction][:legend]]]
可以在圖的資料區,畫上一個顏色.有點類似底色,但會更據 DSN 來晝,而不畫 0 值或是 UNKNOWN 值
vname   即 DSN , 不過看來畫起來沒有什麼意義
#rrggbb[aa]   rgb 即顏色, aa 是透明度,數值介於 (最透明)00~ff(最不透明)
fraction   佔資料區的比例,以 0.0~1.0 表示, 0.5 表示佔一半
legend      圖例名稱

可以產生 PDF 檔
以 rrdtool graph xxx.pdf .... 即可產生 PDF 格式之檔案

變更字型及字體的大小 [-n|--font FONTTAG:size:font]
FONTTAG   依圖上的地區,分為 DEFAULT/TITLE/AXIS/UNIT/LEGEND, DEFAULT 代表後四種
size   為字體大小
font   使用那個 TTF 字型檔 (請注意官方 1.2.8 版並不支援中文處理)
範例:
代碼: [選擇]

-n TITLE:20:/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf \
-n AXIS:10:/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf \
-n UNIT:30:/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf \
-n LEGEND:14:/usr/share/fonts/zh_TW/TrueType/bkai00mp.ttf \



以例子來說明
1. 原來標準原圖(in/out 流量)


2. 使用 1.2.8 的 start=end-1w 功能(即只要畫最近七天)



3. 使用 1.2.8 的 start/end 功能,依最近7/14/21天來畫圖



4. 使用 1.2.8 的 step 功能...但做不出來


5. 使用 1.2.8 的 VDEF 功能...in 畫出最大線, out 畫出平均線


6. 使用 1.2.8 的 start/end + SHIFT 功能畫出週與週間的比較


7. 使用 1.2.8 的 TICK 功能畫出週與週間的比較


8. 使用 1.2.8 的 PDF 輸出

PDF 看不到的話請點這個連結 http://211.72.210.251/tmp/sample8_month.pdf

8. 使用 1.2.8 的字型及大小的處理


以上網頁 及 script 程式,您可在 http://211.72.210.251/tmp/ 取得

結語
尚無...要讓他支援中文好辛苦呀 ..

coper

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
請問為何我的圖無法正確的顯示中文
« 回覆 #85 於: 2005-06-05 00:19 »
使用了rrdtool後所產生的圖,中文無法正確顯示,請問要如何決解?謝謝

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #86 於: 2005-06-07 15:46 »
如果你用 1.0.x 版的,本帖中有一個 link Ada 有教, 請參考
如果你用 1.2.x 版的,請自行修改程式,我也是自己改的

alvin363

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #87 於: 2005-06-09 23:49 »
請問各位前輩
如何在圖表中印出中文?
我每次都會出現亂碼
是不是我疏忽什麼了?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #88 於: 2005-06-10 14:55 »
引述: "alvin363"
請問各位前輩
如何在圖表中印出中文?
我每次都會出現亂碼
是不是我疏忽什麼了?

這是必然的!
http://phorum.study-area.org/viewtopic.php?t=23822
請看一下中文化做法 , 1.2.x 版目前無中文化文件
請自修改原始程式

在你樓上才解釋過...這麼大的眼睛 !?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
« 回覆 #89 於: 2005-06-10 17:09 »
樓上的兩位朋友,在中文化 patch 如下:
代碼: [選擇]
diff -u rrdtool-1.2.8/src/rrd_gfx.c rrdtool-1.2.8-big5/src/rrd_gfx.c
--- rrdtool-1.2.8/src/rrd_gfx.c Fri Jun 10 16:54:58 2005
+++ rrdtool-1.2.8-big5/src/rrd_gfx.c Fri Jun 10 16:45:42 2005
@@ -378,6 +378,9 @@
   unsigned int  n;
   int           error;
   int        gottab = 0;    
+  // 雙字元處理 multi-bytes 問題
+  wchar_t* w_text;
+
   ft_pen.x = 0;   /* start at (0,0) !! */
   ft_pen.y = 0;
 
@@ -391,6 +394,11 @@
   string->transform.xy = (FT_Fixed)(-sin(M_PI*(rotation)/180.0)*0x10000);
   string->transform.yx = (FT_Fixed)( sin(M_PI*(rotation)/180.0)*0x10000);
   string->transform.yy = (FT_Fixed)( cos(M_PI*(rotation)/180.0)*0x10000);
+  // pointer malloc
+  w_text = (wchar_t) calloc (string->count,sizeof(wchar_t));
+  //  轉換為 wide 型式
+  mbstowcs(w_text,text,string->count);
+
 
   use_kerning = FT_HAS_KERNING(face);
   previous    = 0;
@@ -419,8 +427,8 @@
     glyph->pos.x = 0;
     glyph->pos.y = 0;
     glyph->image = NULL;
-
-    glyph->index = FT_Get_Char_Index( face, letter );
+ // 字符隻轉換
+    glyph->index = FT_Get_Char_Index( face, w_text[n]);
 
     /* compute glyph origin */
     if ( use_kerning && previous && glyph->index ) {
@@ -495,6 +503,8 @@
   } */
   string->height = string->bbox.yMax - string->bbox.yMin;
 
+  free(w_text);
+
   return string;
 }
 
diff -u rrdtool-1.2.8/src/rrd_graph.c rrdtool-1.2.8-big5/src/rrd_graph.c
--- rrdtool-1.2.8/src/rrd_graph.c Fri Jun 10 16:54:58 2005
+++ rrdtool-1.2.8-big5/src/rrd_graph.c Fri Jun 10 16:36:04 2005
@@ -2793,7 +2793,9 @@
     tzset();
 #endif
 #ifdef HAVE_SETLOCALE
-    setlocale(LC_TIME,"");
+    //setlocale(LC_TIME,"");
+    // 可以不定 locale , 由系統自動判斷
+    setlocale(LC_ALL,"zh_TW.BIG5");
 #endif
     im->yorigin=0;
     im->xorigin=0;