酷!學園

精華區 => 酷!學園 精華區 => 主題作者是: abelyang 於 2003-08-25 23:03

主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-08-25 23:03
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 )熟一點會較好處理.

(http://211.72.210.251/images/image001.gif)
最大  CPU 純系統負載;   27.0 %    平均   CPU 純系統負載;5.0 % 目前   CPU 純系統負載;   0.0 %
最大  CPU 使用者負載;   2.0 %    平均   CPU 使用者負載;0.0 % 目前   CPU 使用者負載;   0.0 %

(http://211.72.210.251/images/image002.gif)
最大 RAM 系統負載; 16.0 %   平均   RAM 系統負載;  4.0 %   目前  RAM 系統負載; 3.0 %  
最大 RAM 使用者負載; 1.0 %  平均   RAM 使用者負載; 0.0 %  目前 RAM 使用者負載; 0.0 %  
 
(http://211.72.210.251/images/image003.gif)
最大   連線數目 : 91.0 %   平均   連線數目 : 3.0 %   目前   連線數目 : 1.0 %  
最大   上線人數 : 6.0 %   平均   上線人數 :  0.0 %   目前   上線人數 : 0.0 %  

使用 rrdtool 匯整:
(http://211.72.210.251/images/image004.png)
綠色為 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
是允許你後來再加工運算的

(http://211.72.210.251/images/image006.gif)
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 再解釋一下大家會較清楚:
(http://211.72.210.251/images/image007.png)

所以, 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 最細)
(http://211.72.210.251/images/image010.gif)

由這張圖可以看出來,以三條線來表示三個 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                

流量小時圖:
(http://211.72.210.251/images/image011.gif)

流量日圖
(http://211.72.210.251/images/image012.gif)

流量週圖
(http://211.72.210.251/images/image013.gif)

上述三圖我們是以區磈(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:
(http://211.72.210.251/images/image014.gif)

day:
(http://211.72.210.251/images/image015.gif)

week:
(http://211.72.210.251/images/image016.gif)

加上數值的顯示是不是更清楚了呢 ?不過請注意 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 所畫出來的圖了.這是一個呈現的範例:
(http://211.72.210.251/images/14all.png)

所以,您看是不是很簡單呢 ? (我是覺得 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

畫出來的樣子:
(http://211.72.210.251/images/sample1_day.png)
如果只有這樣的功能,其實誰會想用呢?用 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 將圖疊在一起,例如,如果您有兩個出口線路,就非常適合這種做法
結果:
(http://211.72.210.251/images/sample2_day.png)

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

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 查詢反應時間的結果,
程式稍複雜,但圖的觀感簡單清楚.
(http://211.72.210.251/dnsquery-day.jpg)
(http://211.72.210.251/dnsquery-week.jpg)

其他 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

結果
(http://211.72.210.251/images/mod_watch_211.72.210.251_day.png)

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



7. 結語
該說的前面都說了,想不想學 rrdtool 完全看你對系統的掌握度...本來是只介紹 rrdtool 的,不過想說
寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
的地方,不要只看什麼教學文件..那很難學得透徹.
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: hoyo2003-08-25 23:46
果然是“大作”!
看來要花不少的時間消化吸收了!
不過還是先謝了,感謝你分享!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-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) 數統計
.............
主題: Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: Hawker2003-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兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-08-26 10:05
引用
Abel 兄的這篇「大作」小弟佩服,rrdTool 的教學文件大概就屬你這中文版最好了!英文版也未見有如此詳細的說明,頭一次在 IT 領域內覺得看的懂中文是幸福的!讀Abel兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!


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

不過,要將 word 檔再貼回來版面還真是給他有點無聊的辛苦  :o
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: netman2003-08-26 12:33
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: VBird2003-08-26 17:27
引述: "netman"
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^
是啊!真的很讚說! ^_^
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-08-26 19:10
兩位過獎了 ~~
不過我的個性本就是工程師本色~~

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


.....嗯, 個人目前沒有太多時間再學 snmptrap 及 snmpset(都開會去了,無會不與呀!),不然這方面的東西應可以做得更好才是
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: netman2003-08-26 22:15
這樣吧,等我找個時間,將圖抓下來,再轉成 html ,加進  study-area 網站去,
當然,圖片就會在 local 了...
主題: Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: Hawker2003-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"; }

畫出來的結果就如下圖:
(http://athena.dd.ncu.edu.tw/rrdtool/rtls0-day.png)
output 的部分不是很明顯,感覺很糟,有什麼方法可以改善的嗎?小弟今天的努力先到這了,我得起來走動走動了! :o
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-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 端的動作
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2003-08-27 04:59
引述: "netman"
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了....  ^_^

的確,自從 abel 兄上了 study area 之後,另各學員獲益不少
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: netman2003-08-30 20:21
okay,文章已收錄至:

http://www.study-area.org/tips/rrdtool/rrdtool.html
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: robbinl2003-09-06 10:52
請問 ,那要用這套工具來取代mrtg, 要如何作
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-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
主題: rrdtool
作者: polinwei2003-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 指令再看一次,一定是你漏了什麼了).
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-09-16 14:40
是的,用 cronjob 做排程,但請注意這段文字
引用
通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab 根據你在 rrdtool create 時的 step 來決定執行排程的時間點
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peyyi2003-09-24 17:45
to~ dear abelyang:
看到這...感覺非常感動...!!竟然有人把rrd用中文寫的這麼透徹,由於我目前學校的專題也是做rrd的,找其相關資料...就很想淚滿面,因為幾乎都是英文...,每次都要從裡面臆測原意,總之頭痛萬分...當我不小心逛到這,彷彿就像在沙漠中看到綠洲,有點傻眼了...不是傻傻的眼花哦...而是佩服的眼神愣住了!! Linux基礎能力一點都沒有的我們,只能用windows2000架設,可是不知道為什麼...架構大致上都出來了,就無法產生圖解...總之目前仍是努力階段...只是看到你的大作...卻忍不住想向你說聲"利害"。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-09-24 22:25
那裏~
至於 windows 版的 rrd 我沒有玩過, 我猜問題可能出在 gd 上
如果你一直都無法解決的話可至 www.rrdtool.org 上的 mailist list (rrd-users)
去問問看~我也艾莫能助
也預祝您們成功哦~

觀念若有不懂處歡迎隨時回來問 , CDEF 是一大重點哦!!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: vincente2003-09-25 10:48
請教abelyang 大大,

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

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

不知您是否有遇過類似的情況?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-09-25 12:28
我猜可能是 DS 值的上下界沒設好
如果方便的話您可貼上來您的 rrdtool create 語法,我再幫您看看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: neochen2003-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' 我實在不是很了解,可以請你解答一下嗎?

感激不盡
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-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,
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: neochen2003-11-13 13:34
謝啦abelyang大大,經過你一解釋之後......通了~
再次謝謝你
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2003-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"


結果:
(http://211.72.210.199/ping-week.jpg)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cch2004-01-29 15:31
請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-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 的值
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: ZMAN2004-01-30 12:26
早上有緣見到了阿伯本人
(ABEL念起來像阿伯 呵呵)
不過他本人可不像阿伯喔
和鳥哥一樣具備書生氣質

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

大家流口水期待吧
有酷學園和阿伯 人生是彩色的
嘻嘻
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: damon2004-01-30 21:40
以趨勢而言,未來將會是ldap auth的時代,其實現在也已經幾乎是了,其他的用db來作認證的方式,都不是主流,且要整合single sing on也不適合
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cch2004-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 的值
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-06-02 14:51
補一下這個 Link For 中文化
感謝 Ada 兄提供給大家的文件
http://phorum.study-area.org/viewtopic.php?t=23822
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-14 16:10
請問一下
例如我要將GPRINT:t2:LAST:%6.0lf的值放到某一變數A中要如何做?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-14 16:21
不就
A='GPRINT:t2:LAST:%6.0lf'
即可 ?
還是您有什麼特別用意沒解釋清楚的地方 !?
太簡單我會懷疑的
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-14 17:06
RRDs::graph "c:\\inetpub\\rrdtool\\$fswrrd.gif",
"-s $start",                  
#"-e $end",               
"-t Cisco-2F-SW-Port-$interface[1]-Traffic(1 Min Average)",
"-h", "150", "-w", "760",            
"-v Bytes/sec ",               
"DEF:t2=$fswrrd.rrd:RX:AVERAGE",
"DEF:t1=$fswrrd.rrd:TX:AVERAGE",
"COMMENT:PORT-----MAX------AVG-----MIN-----NOW(Bytes)\\n",
"AREA:t2#339966:RX",
"GPRINT:t2:MAX:%7.0lf",
"GPRINT:t2:AVERAGE:%6.0lf",
"GPRINT:t2:MIN:%6.0lf",
"GPRINT:t2:LAST:%6.0lf\\n", <------例如想要將這個流量的值放到A這個變數
my $A='GPRINT:t2:LAST:%6.0lf',  <------abelyang您的意思是這樣嗎
"AREA:t1#0000ff:TX",
"GPRINT:t1:MAX:%7.0lf",
"GPRINT:t1:AVERAGE:%6.0lf",
"GPRINT:t1:MIN:%6.0lf",
"GPRINT:t1:LAST:%6.0lf\\n",
"COMMENT:\\n",
"COMMENT:Last Updated: $timenum $timenum2";

PS:我是想藉由這個值來判斷目前traffic.
     我PERL學沒多久,還請不吝指教,謝謝.
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-15 11:15
引用
"GPRINT:t2:LAST:%6.0lf\\n", <------例如想要將這個流量的值放到A這個變數
my $A='GPRINT:t2:LAST:%6.0lf', <------abelyang您的意思是這樣嗎
"AREA:t1#0000ff:TX",

my $A="GPRINT:t2:LAST:%6.0lf";

RRD:GRAPH ...
....
"$A",
....

您如此試看看,我不確定是否可以,因為我沒有用 RRDcgi 或 RRD pm,
這種功能我都是組好 command 字串 (rrdtool graph ....),
去做 system call 為主
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-16 15:01
請問abelyang
像我要將GPRINT:t2:LAST輸出的值----->"346"這個放到變數"A"裡有辦法嗎?
請幫我想像看!謝謝.
(http://myweb.hinet.net/home13/cjp/pic/2fsw14.gif)

下面的做法好像只是將參數給"A"沒辦法單純取得目前流量的值.
my $A="GPRINT:t2:LAST:%6.0lf";
RRD:GRAPH ...
....
"$A",
....
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-16 17:43
果然~是你問的太簡單... :evil: ,文字寫得太簡單之故
下次記得,不然不理你了  :roll: ^^

我看你上面的例子是 --step 60
就用這個來回答好了,這個功能在我沒有說明的
rrdtool fetch 或 rrdtool xport 中
不過 rrdtool fetch 我實在沒弄明白,你想要的這個功能之前我也
做不到,所以那個時候就改了一個 for mysql 的版本,所有的資料
都存 mysql , 只可惜  ada 兄沒興趣.
PS: 存 DB 後面的處理就很好做,只是久了資料就會很多

我用 rrdtool xport 給你參考,你自己再用 perl 的 RE parser 或 XML_Parser 出來吧

rrdtool xport --start -60s DEF:a=dnsquery.rrd:a:AVERAGE XPORT:a:DNS_QUERY

代碼: [選擇]

<?xml version="1.0" encoding="ISO-8859-1"?>

<xport>
  <meta>
    <start>1095328500</start>
    <step>60</step>
    <end>1095328620</end>
    <rows>3</rows>
    <columns>1</columns>
    <legend>
      <entry>DNS_QUERY</entry>
    </legend>
  </meta>
  <data>
    <row><t>1095328500</t><v>1.4800000000e+02</v></row>
    <row><t>1095328560</t><v>3.3933333333e+01</v></row>
    <row><t>1095328620</t><v>NaN</v></row>
  </data>
</xport>


你打 rrdtool xport 就會有語法的解釋...
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-16 21:06
引述: "cjp"
abelyang
很感謝你的教導,跟著你的腳步真的是學了不少東西 :P

請問底下這些欄位各是代表什麼意思???

<data>
 <row><t>1095328500</t><v>1.4800000000e+02</v></row>
 <row><t>1095328560</t><v>3.3933333333e+01</v></row>
.................................................^^^^^^^^^^^^
                                    看起來好像是目前的traffic,不知道我說的對不對
    <row><t>1095328620</t><v>NaN</v></row>
  </data>
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-16 22:01
abelyang
很感謝你的教導,跟著你的腳步真的是學了不少東西 :P

請問底下這些欄位各是代表什麼意思???

<data>
 <row><t>1095328500</t><v>1.4800000000e+02</v></row>
 <row><t>1095328560</t><v>3.3933333333e+01</v></row>
.................................................^^^^^^^^^^^^
                                    看起來好像是目前的traffic,不知道我說的對不對
    <row><t>1095328620</t><v>NaN</v></row>
  </data>
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-17 02:22
你說的沒有錯呀~
至於是否有更好的方法,我只能建議你要自己去找找..

那個 xport 出來的東西,你用  perl 的 XML Parser pm
很簡單就可以解出,自己多練習囉,自己也要多驗證,
你若自己肯去看 rrdtool 官網,你的疑問上面就寫得很明白了
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-17 14:47
請問abelyang用 perl 的 XML Parser pm轉出來是像下面這樣子嗎?最後一行的錯誤訊息是什麼意思呢?
用rrdtool xport匯出來的資料存成"xxx.XML"不可以直接用網頁的方式看嗎?謝謝

 \\ ()
xport || #10;
xport ||
xport \\ ()
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta start || 1095400980
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta step || 60
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta end || 1095401100
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta rows || 3
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta columns || 1
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta legend || #10;
xport meta legend ||
xport meta legend \\ ()
xport meta legend entry || 111
xport meta legend //
xport meta legend || #10;
xport meta legend ||
xport meta //
xport meta || #10;
xport meta ||
xport //
xport || #10;
xport ||
xport \\ ()
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095400980
xport data row //
xport data row \\ ()
xport data row v || 1.5340000000e+004
xport data row //
xport data //
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095401040
xport data row //
xport data row \\ ()
xport data row v || 2.0116666667e+004
xport data row //
xport data //
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095401100
xport data row //
xport data row \\ ()
xport data row v || NaN
xport data row //
xport data //
xport data || #10;
xport data ||
xport //
xport || #10;
 //
 \\ (id me)
foo || Hello World
 //

no element found at line 1, column 0, byte -1 at C:/perl/site/lib/XML/Parser.pm line 187
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-17 18:01
你要好好自己思考吧...如果 XML 不行,沒有別的方法嗎 !?
不需要每件事情都問人,先把 perl 學好,再來想這個問題
難道還需要我教你 perl 或語言
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: cjp2004-09-23 11:27
abelyang說的很有道理
我要的需求都TRY出來了,還是很感謝你的指導.
我是用fetch的方式抓流量,然後再來發mial的告警
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-23 11:59
嗯~您的學習方式是對的...
官網上對 fetch 很清楚的解釋,
我的說明大柢上只是引領大家進入 rrdtool 的路...
(最難的是對 create 的語法理解),再來路怎麼走怎麼修就得看個
人發揮了
主題: [問題]请教rrdtool的问题
作者: realhawk20042004-09-27 13:12
请教:我在create *.rrd和update之后,create graph,为什么出现如下错误。多谢!!

2148 Segmentation fault      rrdtool graph html/example.png --title "Host Port Traffic" DEF:t1=$RRD_FILE:http:AVERAGE LINE3:t1#ff0000:"http" -h 200 -w 480 -s `date -d "-1 week" +%s` -v "Bytes per second"
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-27 13:22
Segmentation fault ,你應該是 rrdtool 沒裝好...
注意看看 make;make install 是否有什麼嚴重警告
另外,就是您的 OS 是 !?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: realhawk20042004-09-27 17:03
引述: "abelyang"
Segmentation fault ,你應該是 rrdtool 沒裝好...
注意看看 make;make install 是否有什麼嚴重警告
另外,就是您的 OS 是 !?

您好!!我的OS是Redhat Enterprise 3.0 我安装rrdtool没有出现错误提示。我的rrdtool版本是:1.0.40,实在不明白怎么会出现这种问题。谢谢提供帮助!!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-09-27 17:59
這種狀況我只能請您多找幾個不同的 rrdtool 版本試看看了
因為我沒有你的環境,不知道你的 complier 條件等
多試試看幾個不同版本
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-06 21:58
看過了abelyang的rrdtool 文章,有幾點不明白
e.g.
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

如abelyang 說,mrtg是每5min 有603筆資料, 所以abelyang 就用603
這數目是否隨意的? 比如我想每5min 有 400筆資料 ? 得嗎?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-12-06 23:20
是的,你愛多少筆就用多少筆沒關係
只是 rrd file 大小會受影響而以,
你可多觀察看看, DS 項目數,及 RRA 的定義,對檔案大小的影響
及您 step 間的關係,儘量先自己做,自己觀察,自己找答案,非到不得巳再來問就好, 因為您這個問題較小 case , 多做就知道了
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 10:36
abelyang學長,

筆數多少只對檔案size 有所影響,這點明白
還會對其他有所影響嗎? e.g. 準確度,
e.g.
RRA:AVERAGE:0.5:1:603 \ 與 RRA:AVERAGE:0.5:1:1000 \

一個每5min 603筆資料,
另一個每5min 1000筆資料

當plot圖時會否有分別?? 是否筆數越多越準確??
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-12-07 11:22
你再把第一篇看仔細一點...

RRA 控制筆數,603 只有 603x5=3015 分鐘
也就是你的五分鐘資料只有最近30小時的而以
超過30小時的就看有沒有其他 RRA 項目支援了

你在另一個主題中的問題:
引用

我想問這修改以rrdtool 支持出中文,
但好像修改的部份是hard code的,e.g. font, char coding

我做的修改只 for 我自己的環境在用,你若有興趣,
自可自己改, 在我改的部份中有一行:
setlocale 我註解掉了,有心您可自己研究
至於 font path 問題,
您可 man mkfontdir 去看看結構問題
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 15:00
mrtg 每筆資料最少要5min
rrdtool有沒有這限制,e.g.我想每1min
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 15:57
引述: "abelyang"
你再把第一篇看仔細一點...
RRA 控制筆數,603 只有 603x5=3015 分鐘
也就是你的五分鐘資料只有最近30小時的而以
超過30小時的就看有沒有其他 RRA 項目支援了
引用


3015 mins為什麼你說只有最近30小時 ??
我的理解是 3015/60 = 50.25小時
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 15:58
50.25小時 即有最近2天資料

是嗎?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-12-07 17:23
是的,是50 小時,筆誤
1min 問題, 您何不自己試就好呢 ?
自己做實驗就知道了吧
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 18:07
我看了一篇官方英文文件與abelyang的中文教學,
大致上都已明白怎樣用rrdtool 來create, update 資料
不過還有一點是mrtg 以
5min for a day graph
30min for a week graph
2hr for a month graph
1day for a year graph
我想知那些, 5min, 30min, 2hr, 1day 是否一定要用這些數字?
換句話說,可否
10min for a day graph
1hr for a week graph
1day for a month graph
1month for a year graph

?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-12-07 18:32
這個問題巳沒什麼好回答的,留給你自己去試吧
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-07 22:38
麻煩abelyang學長給我一看以下是我的rrdtool 配置
用來plot eth1 in & out 流量,但plot 出來的圖沒有數據

不知是那方面出錯

rrdtool create eth1.rrd \
--start `date +%s` \
--step 300 \
DS:eth1_in:COUNTER:600:0:12500000 \
DS:eth1_out:COUNTER:600:0:1250000 \
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:MIN:0.5:1:603 \
RRA:MIN:0.5:6:603 \
RRA:MIN:0.5:24:603 \
RRA:MIN:0.5:288:800 \
RRA:LAST:0.5:1:603 \
RRA:LAST:0.5:6:603 \
RRA:LAST:0.5:24:603 \
RRA:LAST:0.5:288:800


以下shell script 是放在cron 每5min執行一次
#!/bin/bash
now=`date +%s`

in=eval snmpwalk -c public -v 1 localhost ifInOctets.3 | gawk '{ print $4 }'
out=eval snmpwalk -c public -v 1 localhost ifOutOctets.3 | gawk '{ print $4 }'

/usr/local/rrdtool/bin/rrdtool update /usr/local/rrdtool/db/eth1.rrd $now:$in:$out

/usr/local/rrdtool/bin/rrdtool graph /usr/local/httpd/htdocs/mrtg/test.png \
--title "eth1 testing" \
DEF:in=/usr/local/rrdtool/db/eth1.rrd:eth1_in:AVERAGE \
DEF:out=/usr/local/rrdtool/db/eth1.rrd:eth1_out:AVERAGE \
LINE2:in#000080:"incoming" \
LINE2:out#0000FF:"outgoing" \
-v "bytes" -M

但出來的圖沒有數據
(http://vip.cyberec.com/~kaichung/test.png)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-08 17:47
解決了!! 是個shell script 問題!!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-12-10 18:12
我想問有時某個時段有很大流量e.g. 1.5M 其餘時段一般時400k
這造成個圖的比例有太正常,其餘時段的只顯示出很少

如何解決 ?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2004-12-10 18:34
一條線 1 ~1000000 , 結果 1 很小,15000 很大,
結果 1 幾乎看不見,本來就這樣呀 , 您覺得呢 ?
15000 要寫成 150, 1 還是寫 1

若你真要做且不會混淆原來的 150 , 那就去看 CDEF 的用法
想想看你的邏輯有什問題
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-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
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: adrianmak2004-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
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: likerain2004-12-13 09:49
大大..真是太感謝你了....多虧你的這個大作啊
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: russell2004-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:
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: 韓仔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]
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-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 出來看看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: 韓仔2005-01-07 08:50
經過我echo的結果,不論是在命令列或網頁都好像沒有什麼產生耶。

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

那裡有錯誤了呢?謝謝
主題: rrdtool 問題
作者: k19512232005-01-07 16:17
各位學長
   我最近在學習rrdtool 來作一些系統的效能監測
有下列幾個問題,請各位學長幫忙解答一下

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

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

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

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

                                             感謝各位學長的協助
主題: rrdbrowse
作者: k19512232005-01-07 17:45
各位學長
    在查看有關rrdtool 時發現了 rrdbrowse
請問各位學長有沒有人使用過,可以發表一下
使用感想及安裝方法等
網址 http://www.rrdbrowse.org/index.php
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-01-11 12:20
韓仔,
你的問題在於你對 "程式" 或 "script" 沒有概念...
你看 dig 的訊息, grep 的條件自己修改一下即可,
不知如何修改不要問我.

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

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

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

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

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

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

註: 因為要提供使用者在網頁選擇日期後,劃出當天的資料
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: 韓仔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:...
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-01-14 11:30
k 兄的問題不是很清楚您的狀況,或可再描述清楚些

韓兄的問題,可以很明顯感覺得您對 shell script 不是很了解,
建議您先修好要用的語言,並了解其他的 debug 技巧,再來
研究您現在所碰到的問題較好
主題: rrdtool
作者: k19512232005-01-14 11:44
abelyang 學長
   我的問題主要是因為,有需求要查看之前的資料
例如,三天前的每五分鐘一筆,一天的流量圖
在利用rrd 畫圖時,必需要等五分鐘後有新的資
料寫入rrd 去執行 rrd GRAPH 時才會更新圖檔
若是沒有新資料寫入,去執行 rrd GRAPH 並不會
更新圖檔,除非把圖檔刪除,建立新的檔案才會立即
更新,是否有什麼參數之類的,可以立即更新圖檔,
或是有什麼寫法,可以立即產生
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: netboy2005-01-16 15:19
我现在装好了rrd,但是发现它不支持中文啊,请问楼主是否可以共享一下修改后的rrdtool ?谢谢
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-01-18 09:48
k1951223 兄,
您用的東西我可能沒用過,無法幫助您,不過建議您可以自己
在 cgi 產生圖檔前,cgi 先做 delete 圖檔的動作,應可以才是
我自己是都這樣做的

netboy:
請把這串全部看完,裏面有提到..
主題: rrd cgi 畫圖
作者: k19512232005-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
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: Ada2005-02-01 17:20
補充一下,新版的 rrdtool for windows 只剩下 rrdtool.exe 而以...
另外,Windows 上的 rrdtool 一樣有中文字的問題... :(
主題: 圖檔即時更新
作者: k19512232005-03-17 19:43
各位學長
   我現在利用 RRD CGI 作畫圖的動作
己經可以輸入結束時間去查詢過去的流量資料了
但是有幾個問題,使用運作上不是很順利,要請教
各位學長有沒有好一點的作法.

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

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

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


以後,
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: 韓仔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]
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-04-14 14:28
如果有圖,大家會更明瞭您的問題所在 (0.2??)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-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)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-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 流量)
(http://211.72.210.251/tmp/sample1_month.png)

2. 使用 1.2.8 的 start=end-1w 功能(即只要畫最近七天)
(http://211.72.210.251/tmp/sample2_month.png)


3. 使用 1.2.8 的 start/end 功能,依最近7/14/21天來畫圖
(http://211.72.210.251/tmp/sample3_month.png)


4. 使用 1.2.8 的 step 功能...但做不出來
(http://211.72.210.251/tmp/sample4_month.png)

5. 使用 1.2.8 的 VDEF 功能...in 畫出最大線, out 畫出平均線
(http://211.72.210.251/tmp/sample5_month.png)

6. 使用 1.2.8 的 start/end + SHIFT 功能畫出週與週間的比較
(http://211.72.210.251/tmp/sample6_month.png)

7. 使用 1.2.8 的 TICK 功能畫出週與週間的比較
(http://211.72.210.251/tmp/sample7_month.png)

8. 使用 1.2.8 的 PDF 輸出
(http://211.72.210.251/tmp/sample8_month.pdf)
PDF 看不到的話請點這個連結 http://211.72.210.251/tmp/sample8_month.pdf

8. 使用 1.2.8 的字型及大小的處理
(http://211.72.210.251/tmp/sample9_month.png)

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

結語
尚無...要讓他支援中文好辛苦呀 ..
主題: 請問為何我的圖無法正確的顯示中文
作者: coper2005-06-05 00:19
使用了rrdtool後所產生的圖,中文無法正確顯示,請問要如何決解?謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-06-07 15:46
如果你用 1.0.x 版的,本帖中有一個 link Ada 有教, 請參考
如果你用 1.2.x 版的,請自行修改程式,我也是自己改的
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: alvin3632005-06-09 23:49
請問各位前輩
如何在圖表中印出中文?
我每次都會出現亂碼
是不是我疏忽什麼了?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-06-10 14:55
引述: "alvin363"
請問各位前輩
如何在圖表中印出中文?
我每次都會出現亂碼
是不是我疏忽什麼了?

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

在你樓上才解釋過...這麼大的眼睛 !?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-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;
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: v168222005-06-11 01:40
我想請問一下,你做的那些表阿有有改過裡面的程式嗎?有參考什麼要的資料室吼可以告訴我,因為我在找相關的一些抓取封包還是改MRTG的裡面的一些小程式,能否告訴我謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: alvin3632005-06-12 10:23
謝謝前輩指導 ^^

我也開始懷疑我的眼睛了!!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-06-13 14:08
引用
我想請問一下,你做的那些表阿有有改過裡面的程式嗎?有參考什麼要的資料室吼可以告訴我,因為我在找相關的一些抓取封包還是改MRTG的裡面的一些小程式,能否告訴我謝謝

不懂 "那些表" 是什麼 ...?
至於抓封包用 tcpdump 只是一個大家熟悉的程式,你只要了解用法,要抓什麼都可以.


引用
謝謝前輩指導 ^^
我也開始懷疑我的眼睛了!!

眼睛 ? 什麼眼瞔 ? 中文化這種事情,純粹個人好玩,研究而以
只是查 FT2 function 較累而以..相對來說 gd 較熟悉
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: alvin3632005-07-26 14:42
要分別畫出hour day week需要有特殊的設定嗎?
為什麼我三張圖出現都一樣?

另外為什麼image_path又出現一次
不過他沒有""號
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-07-26 14:45
你得回頭再看一次
或是用 -s (--start)-e (--end) 來控制時間範圍
主題: abelyang大哥,请看看我的图为何显示的很乱啊!非常感
作者: fire-phoenix2005-08-02 10:04
我是刚刚学rrdtool不久,参考大哥的大作做了一下可以画出hours, day , week ,但画不出year的那张图,而且图很乱。y轴上显示的数据不准,请大哥看看,以下是我的代码:
建立rrd数据文件:
代碼: [選擇]
#!/bin/bash
RRD_BIN="/usr/local/rrdtool/bin/rrdtool"
DB_PATH="/usr/local/apache2/htdocs/rrd/data"
CONF_PATH="/usr/local/apache2/htdocs/rrd/conf"

conf_arge=`cat $CONF_PATH/server.conf`
for server in $conf_arge
do
        name=`echo $server | awk -F: '{print $1}'`

        #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        # create sys cpu used info rrd data file
        #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        $RRD_BIN create $DB_PATH/${name}_cpu_load.rrd --step 300 \
                DS:id5:GAUGE:600:0:10 \
                DS:id10:GAUGE:600:0:10 \
                DS:id15:GAUGE:600:0:10 \
                RRA:AVERAGE:0.5:1:600 \
                RRA:AVERAGE:0.5:5:700 \
                RRA:AVERAGE:0.5:24:800 \
                RRA:AVERAGE:0.5:288:900 \
                RRA:MAX:0.5:1:600 \
                RRA:MAX:0.5:6:700 \
                RRA:MAX:0.5:24:775 \
                RRA:MAX:0.5:288:797 \
                RRA:MIN:0.5:1:600 \
                RRA:MIN:0.5:6:700 \
                RRA:MIN:0.5:24:775 \
                RRA:MIN:0.5:288:797

        $RRD_BIN create $DB_PATH/${name}_mem.rrd --step 300 \
                DS:mem_free:GAUGE:300:U:U \
                DS:mem_buff:GAUGE:300:U:U \
                DS:mem_cache:GAUGE:300:U:U \
                DS:mem_swapd:GAUGE:300:U:U \
                RRA:AVERAGE:0.5:1:603 \
                RRA:AVERAGE:0.5:5:803 \
                RRA:AVERAGE:0.5:24:803 \
                RRA:AVERAGE:0.5:288:903 \
                RRA:MAX:0.5:1:600 \
                RRA:MAX:0.5:6:700 \
                RRA:MAX:0.5:24:775 \
                RRA:MAX:0.5:288:797 \
                RRA:MIN:0.5:1:600 \
                RRA:MIN:0.5:6:700 \
                RRA:MIN:0.5:24:775 \
                RRA:MIN:0.5:288:797
done
exit 0


更新数据的脚本:
代碼: [選擇]
#!/bin/bash
RRD_BIN="/usr/local/rrdtool/bin/rrdtool"
DB_PATH="/usr/local/apache2/htdocs/rrd/data"
CONF_PATH="/usr/local/apache2/htdocs/rrd/conf"
TMP_FILE="tmp.file"
TIME=`date +%Y%m%d`

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

conf_arge=`cat $CONF_PATH/server.conf`
for server in $conf_arge
do
        ip=`echo $server | awk -F: '{print $2}'`
        name=`echo $server | awk -F: '{print $1}'`

        ssh $ip "uptime" > $TMP_FILE
        id5=`awk '{print substr($10,1,4)}' $TMP_FILE`
        id10=`awk '{print substr($11,1,4)}' $TMP_FILE`
        id15=`awk '{print substr($12,1,4)}' $TMP_FILE`

        ssh $ip "free" > $TMP_FILE
        mem_free=`grep "Mem" $TMP_FILE | awk '{print $3}'`
        mem_buff=`grep "Mem" $TMP_FILE | awk '{print $6}'`
        mem_cache=`grep "Mem" $TMP_FILE | awk '{print $7}'`
        mem_swapd=`grep "Swap" $TMP_FILE | awk '{print $3}'`

        echo "[`date +"%Y:%m:%d %H:%M:%S"`] update $name cpu id5=$id5 id10=$id10 id15=$id15" >> ../log/update_c
pu.log.$TIME
        echo "[`date +"%Y:%m:%d %H:%M:%S"`] update $name mem free=$mem_free buff=$mem_buff cache=$mem_cache swa
pd=$mem_swapd" >> ../log/update_mem.log.$TIME

        $RRD_BIN update $DB_PATH/${name}_cpu_load.rrd N:$id5:$id10:$id15
        $RRD_BIN update $DB_PATH/${name}_mem.rrd N:$mem_free:$mem_buff:$mem_cache:$mem_swapd
done

rm -f $TMP_FILE

exit 0


画图的脚本:
代碼: [選擇]
#!/bin/bash
RRD_BIN="/usr/local/rrdtool/bin/rrdtool"
DB_PATH="/usr/local/apache2/htdocs/rrd/data"
PNG_PATH="/usr/local/apache2/htdocs/rrd/images"
CONF_PATH="/usr/local/apache2/htdocs/rrd/conf"
conf_arge=`cat $CONF_PATH/server.conf`
PNG_TIME="hours day week month year"

for name in $conf_arge; do
        server=`echo $name | awk -F: '{print $1}'`
        for i in $PNG_TIME; do
                $RRD_BIN graph $PNG_PATH/${server}_cpu_${i}.png \
                        --title "${i} "${server}" server CPU Load" \
                        DEF:id5=$DB_PATH/${server}_cpu_load.rrd:id5:AVERAGE \
                        DEF:id10=$DB_PATH/${server}_cpu_load.rrd:id10:AVERAGE \
                        DEF:id15=$DB_PATH/${server}_cpu_load.rrd:id15:AVERAGE \
                        AREA:id5#008080:"5minute cpu load" \
                        AREA:id10#FFFF00:"10minute cpu load" \
                        AREA:id15#FF0000:"15minute cpu load" \
                        -h 100 -w 600 \
                        -s `date -d "-1 $i" +%s` \
                        -v "sys cpu load"
        done

        for i in $PNG_TIME; do
                $RRD_BIN graph $PNG_PATH/${server}_mem_${i}.png \
                        --title "${i} "${server}" server Mem Load" \
                        DEF:mem_free=$DB_PATH/${server}_mem.rrd:mem_free:AVERAGE \
                        DEF:mem_buff=$DB_PATH/${server}_mem.rrd:mem_buff:AVERAGE \
                        DEF:mem_cache=$DB_PATH/${server}_mem.rrd:mem_cache:AVERAGE \
                        DEF:mem_swapd=$DB_PATH/${server}_mem.rrd:mem_swapd:AVERAGE \
                        AREA:mem_free#FFFF00:"memory free" \
                        AREA:mem_cache#00FF00:"memory cache" \
                        AREA:mem_swapd#000000:"memory swapd" \
                        AREA:mem_buff#0080C0:"memory buff" \
                        -h 100 -w 600 \
                        -s `date -d "-1 $i" +%s` \
                        -v "memory information"
        done
done
exit 0


更新数据和画图都是每5分钟在crontab中跑一次,但生成的图却是这样的,图如下。
CPU的图:
(http://www.baiduo/tmp/spider03_cpu_hours.png)

(http://www.baiduo/tmp/spider03_cpu_day.png)

(http://www.baiduo/tmp/spider03_cpu_week.png)

(http://www.baiduo/tmp/spider03_cpu_month.png)

(http://www.baiduo/tmp/spider03_cpu_year.png)

内存的图:
(http://www.baiduo/tmp/spider03_mem_hours.png)

(http://www.baiduo/tmp/spider03_mem_day.png)

(http://www.baiduo/tmp/spider03_mem_week.png)

(http://www.baiduo/tmp/spider03_mem_month.png)

(http://www.baiduo/tmp/spider03_mem_year.png)

还请大哥在百忙之中看一下。小弟在此谢谢了。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-02 10:14
图的地址变了,不好意思,大哥:
CPU:
(http://www.baiduo.com/blog/tmp/spider03_cpu_hours.png)

(http://www.baiduo.com/blog/tmp/spider03_cpu_day.png)

(http://www.baiduo.com/blog/tmp/spider03_cpu_week.png)

(http://www.baiduo.com/blog/tmp/spider03_cpu_month.png)

(http://www.baiduo.com/blog/tmp/spider03_cpu_year.png)

MEM:
(http://www.baiduo.com/blog/tmp/spider03_mem_hours.png)

(http://www.baiduo.com/blog/tmp/spider03_mem_day.png)

(http://www.baiduo.com/blog/tmp/spider03_mem_week.png)

(http://www.baiduo.com/blog/tmp/spider03_mem_month.png)

(http://www.baiduo.com/blog/tmp/spider03_mem_year.png)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-02 12:26
方便只講重點嗎 ?
因為太長,時在不好看
cpu 的y 值,你的 input data ,是小數,所以畫 80m 等是正常的

至於 memory , 有些圖上的時段是空白,你確定有抓到資料 ?
把 rrdtool update 的資料另存一份檔案來看看
中文出不來,請找此帖內有的中文化 Patch
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-02 13:35
引述: "abelyang"
方便只講重點嗎 ?
因為太長,時在不好看
cpu 的y 值,你的 input data ,是小數,所以畫 80m 等是正常的

至於 memory , 有些圖上的時段是空白,你確定有抓到資料 ?
把 rrdtool update 的資料另存一份檔案來看看
中文出不來,請找此帖內有的中文化 Patch


以下为mem写入rrd文件的日志:
[2005:08:02 00:00:00] update localhost mem free=4085772 buff=233420 cache=3513648 swapd=828
[2005:08:02 00:00:08] update clustor01 mem free=8099192 buff=12416 cache=6441332 swapd=770740
[2005:08:02 00:00:08] update spider01 mem free=3246912 buff=95088 cache=1885940 swapd=124464
[2005:08:02 00:00:08] update spider02 mem free=3154444 buff=80120 cache=2273388 swapd=280864
[2005:08:02 00:00:08] update spider03 mem free=3172836 buff=82348 cache=2240108 swapd=543780
[2005:08:02 00:00:08] update spider04 mem free=3340536 buff=69492 cache=1949764 swapd=405040
[2005:08:02 00:00:09] update spider05 mem free=3513676 buff=73784 cache=1950836 swapd=24
[2005:08:02 00:00:09] update spider06 mem free=3445852 buff=80556 cache=1871784 swapd=28
[2005:08:02 00:00:09] update spider07 mem free=3475884 buff=73388 cache=1683936 swapd=2124
[2005:08:02 00:00:09] update spider08 mem free=3231632 buff=77448 cache=2256684 swapd=359684
[2005:08:02 00:05:00] update localhost mem free=4084080 buff=233420 cache=3513664 swapd=828
[2005:08:02 00:05:08] update clustor01 mem free=8100232 buff=13016 cache=6441412 swapd=770740
[2005:08:02 00:05:08] update spider01 mem free=3247232 buff=95416 cache=1886132 swapd=124464
[2005:08:02 00:05:08] update spider02 mem free=3154700 buff=80324 cache=2273444 swapd=280864
[2005:08:02 00:05:08] update spider03 mem free=3172836 buff=82488 cache=2239968 swapd=543780
[2005:08:02 00:05:08] update spider04 mem free=3340920 buff=69912 cache=1949344 swapd=405040
[2005:08:02 00:05:09] update spider05 mem free=3514124 buff=74100 cache=1950780 swapd=24
[2005:08:02 00:05:09] update spider06 mem free=3446044 buff=80912 cache=1871948 swapd=28
[2005:08:02 00:05:09] update spider07 mem free=3476588 buff=73932 cache=1683912 swapd=2124
[2005:08:02 00:05:09] update spider08 mem free=3232208 buff=77952 cache=2256960 swapd=359684

以下为spider03_mem.rrd文件的信息:
rrd_version = "0003"
step = 300
last_update = 1122959292
ds[mem_free].type = "GAUGE"
ds[mem_free].minimal_heartbeat = 60
ds[mem_free].min = NaN
ds[mem_free].max = NaN
ds[mem_free].last_ds = "UNKN"
ds[mem_free].value = 0.0000000000e+00
ds[mem_free].unknown_sec = 192
ds[mem_buff].type = "GAUGE"
ds[mem_buff].minimal_heartbeat = 60
ds[mem_buff].min = NaN
ds[mem_buff].max = NaN
ds[mem_buff].last_ds = "UNKN"
ds[mem_buff].value = 0.0000000000e+00
ds[mem_buff].unknown_sec = 192
ds[mem_cache].type = "GAUGE"
ds[mem_cache].minimal_heartbeat = 60
ds[mem_cache].min = NaN
ds[mem_cache].max = NaN
ds[mem_cache].last_ds = "UNKN"
ds[mem_cache].value = 0.0000000000e+00
ds[mem_cache].unknown_sec = 192
ds[mem_swapd].type = "GAUGE"
ds[mem_swapd].minimal_heartbeat = 60
ds[mem_swapd].min = NaN
ds[mem_swapd].max = NaN
ds[mem_swapd].last_ds = "UNKN"
ds[mem_swapd].value = 0.0000000000e+00
ds[mem_swapd].unknown_sec = 192
rra[0].cf = "AVERAGE"
rra[0].rows = 603
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[0].cdp_prep[1].value = NaN
rra[0].cdp_prep[1].unknown_datapoints = 0
rra[0].cdp_prep[2].value = NaN
rra[0].cdp_prep[2].unknown_datapoints = 0
rra[0].cdp_prep[3].value = NaN
rra[0].cdp_prep[3].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 803
rra[1].pdp_per_row = 5
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = NaN
rra[1].cdp_prep[0].unknown_datapoints = 2
rra[1].cdp_prep[1].value = NaN
rra[1].cdp_prep[1].unknown_datapoints = 2
rra[1].cdp_prep[2].value = NaN
rra[1].cdp_prep[2].unknown_datapoints = 2
rra[1].cdp_prep[3].value = NaN
rra[1].cdp_prep[3].unknown_datapoints = 2
rra[2].cf = "AVERAGE"
rra[2].rows = 803
rra[2].pdp_per_row = 24
rra[2].xff = 5.0000000000e-01
rra[2].cdp_prep[0].value = NaN
rra[2].cdp_prep[0].unknown_datapoints = 13
rra[2].cdp_prep[1].value = NaN
rra[2].cdp_prep[1].unknown_datapoints = 13
rra[2].cdp_prep[2].value = NaN
rra[2].cdp_prep[2].unknown_datapoints = 13
rra[2].cdp_prep[3].value = NaN
rra[2].cdp_prep[3].unknown_datapoints = 13
rra[3].cf = "AVERAGE"
rra[3].rows = 903
rra[3].pdp_per_row = 288
rra[3].xff = 5.0000000000e-01
rra[3].cdp_prep[0].value = NaN
rra[3].cdp_prep[0].unknown_datapoints = 61
rra[3].cdp_prep[1].value = NaN
rra[3].cdp_prep[1].unknown_datapoints = 61
rra[3].cdp_prep[2].value = NaN
rra[3].cdp_prep[2].unknown_datapoints = 61
rra[3].cdp_prep[3].value = NaN
rra[3].cdp_prep[3].unknown_datapoints = 61
rra[4].cf = "MAX"
rra[4].rows = 600
rra[4].pdp_per_row = 1
rra[4].xff = 5.0000000000e-01
rra[4].cdp_prep[0].value = NaN
rra[4].cdp_prep[0].unknown_datapoints = 0
rra[4].cdp_prep[1].value = NaN
rra[4].cdp_prep[1].unknown_datapoints = 0
rra[4].cdp_prep[2].value = NaN
rra[4].cdp_prep[2].unknown_datapoints = 0
rra[4].cdp_prep[3].value = NaN
rra[4].cdp_prep[3].unknown_datapoints = 0
rra[5].cf = "MAX"
rra[5].rows = 700
rra[5].pdp_per_row = 6
rra[5].xff = 5.0000000000e-01
rra[5].cdp_prep[0].value = NaN
rra[5].cdp_prep[0].unknown_datapoints = 1
rra[5].cdp_prep[1].value = NaN
rra[5].cdp_prep[1].unknown_datapoints = 1
rra[5].cdp_prep[2].value = NaN
rra[5].cdp_prep[2].unknown_datapoints = 1
rra[5].cdp_prep[3].value = NaN
rra[5].cdp_prep[3].unknown_datapoints = 1
rra[6].cf = "MAX"
rra[6].rows = 775
rra[6].pdp_per_row = 24
rra[6].xff = 5.0000000000e-01
rra[6].cdp_prep[0].value = NaN
rra[6].cdp_prep[0].unknown_datapoints = 13
rra[6].cdp_prep[1].value = NaN
rra[6].cdp_prep[1].unknown_datapoints = 13
rra[6].cdp_prep[2].value = NaN
rra[6].cdp_prep[2].unknown_datapoints = 13
rra[6].cdp_prep[3].value = NaN
rra[6].cdp_prep[3].unknown_datapoints = 13
rra[7].cf = "MAX"
rra[7].rows = 797
rra[7].pdp_per_row = 288
rra[7].xff = 5.0000000000e-01
rra[7].cdp_prep[0].value = NaN
rra[7].cdp_prep[0].unknown_datapoints = 61
rra[7].cdp_prep[1].value = NaN
rra[7].cdp_prep[1].unknown_datapoints = 61
rra[7].cdp_prep[2].value = NaN
rra[7].cdp_prep[2].unknown_datapoints = 61
rra[7].cdp_prep[3].value = NaN
rra[7].cdp_prep[3].unknown_datapoints = 61
rra[8].cf = "MIN"
rra[8].rows = 600
rra[8].pdp_per_row = 1
rra[8].xff = 5.0000000000e-01
rra[8].cdp_prep[0].value = NaN
rra[8].cdp_prep[0].unknown_datapoints = 0
rra[8].cdp_prep[1].value = NaN
rra[8].cdp_prep[1].unknown_datapoints = 0
rra[8].cdp_prep[2].value = NaN
rra[8].cdp_prep[2].unknown_datapoints = 0
rra[8].cdp_prep[3].value = NaN
rra[8].cdp_prep[3].unknown_datapoints = 0
rra[9].cf = "MIN"
rra[9].rows = 700
rra[9].pdp_per_row = 6
rra[9].xff = 5.0000000000e-01
rra[9].cdp_prep[0].value = NaN
rra[9].cdp_prep[0].unknown_datapoints = 1
rra[9].cdp_prep[1].value = NaN
rra[9].cdp_prep[1].unknown_datapoints = 1
rra[9].cdp_prep[2].value = NaN
rra[9].cdp_prep[2].unknown_datapoints = 1
rra[9].cdp_prep[3].value = NaN
rra[9].cdp_prep[3].unknown_datapoints = 1
rra[10].cf = "MIN"
rra[10].rows = 775
rra[10].pdp_per_row = 24
rra[10].xff = 5.0000000000e-01
rra[10].cdp_prep[0].value = NaN
rra[10].cdp_prep[0].unknown_datapoints = 13
rra[10].cdp_prep[1].value = NaN
rra[10].cdp_prep[1].unknown_datapoints = 13
rra[10].cdp_prep[2].value = NaN
rra[10].cdp_prep[2].unknown_datapoints = 13
rra[10].cdp_prep[3].value = NaN
rra[10].cdp_prep[3].unknown_datapoints = 13
rra[11].cf = "MIN"
rra[11].rows = 797
rra[11].pdp_per_row = 288
rra[11].xff = 5.0000000000e-01
rra[11].cdp_prep[0].value = NaN
rra[11].cdp_prep[0].unknown_datapoints = 61
rra[11].cdp_prep[1].value = NaN
rra[11].cdp_prep[1].unknown_datapoints = 61
rra[11].cdp_prep[2].value = NaN
rra[11].cdp_prep[2].unknown_datapoints = 61
rra[11].cdp_prep[3].value = NaN
rra[11].cdp_prep[3].unknown_datapoints = 61

请大哥看看,谢谢!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-02 13:44
引用
$RRD_BIN create $DB_PATH/${name}_mem.rrd --step 300 \
                DS:mem_free:GAUGE:300:U:U \
                DS:mem_buff:GAUGE:300:U:U \
                DS:mem_cache:GAUGE:300:U:U \
                DS:mem_swapd:GAUGE:300:U:U \

中的 300 改成 600 以上
因為你的時間差有時差超過 300 , 只要過 300 ,就會出現空白
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-02 14:21
引述: "abelyang"
引用
$RRD_BIN create $DB_PATH/${name}_mem.rrd --step 300 \
                DS:mem_free:GAUGE:300:U:U \
                DS:mem_buff:GAUGE:300:U:U \
                DS:mem_cache:GAUGE:300:U:U \
                DS:mem_swapd:GAUGE:300:U:U \

中的 300 改成 600 以上
因為你的時間差有時差超過 300 , 只要過 300 ,就會出現空白

谢谢我已经将GAUGE改为600 --step改为30过一会试试,对了大哥。因为我取的内存的数据有的很大有的很小,画图的时候就有的值我看不到图示有的图示就很大,这种情况如何修改呢??就针对我的内存的图来说,我取的值例如下:
[2005:08:02 00:15:08] update spider03 mem free=3173348 buff=82908 cache=2240068 swapd=543780

我图上的free的色块就很大,swapd的就根本看不到。是什么原因啊大哥。??
谢谢!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-02 14:27
平常是把最大的那個值畫在最下面
1 和 10000  ,在圖上來說, 1 實在太小到看不見,
但若畫 10000 和 1 , 則 rrdtool 可能從 9800 為 base 開始畫
此時,1 就有可能看見

另外,為什麼要改 step ?  step 和 heartbeat 有什麼關係 ?
heartbeat 什麼作用 ?
heartbeat 設為 100000000 會怎麼樣 ?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-02 15:28
引述: "abelyang"
平常是把最大的那個值畫在最下面
1 和 10000  ,在圖上來說, 1 實在太小到看不見,
但若畫 10000 和 1 , 則 rrdtool 可能從 9800 為 base 開始畫
此時,1 就有可能看見

另外,為什麼要改 step ?  step 和 heartbeat 有什麼關係 ?
heartbeat 什麼作用 ?
heartbeat 設為 100000000 會怎麼樣 ?

最大的画的最下面??如何操作大哥。

以我的理解step 和heartbeat之间的关系是这样的。
step是rrd数据中的时间间隔。
heartbeat是在这个时间段之内的是否有数据,没有的话为空值。
step一定得比hearbeat小,如果大的话heartbeat相林的时间段之内一定是没有数据的。不知道对不对大哥。
非常感谢!。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: oicqonly2005-08-02 17:11
以前用MRTG,最短图像间隔是5分钟,请问rrdtool的最短间隔是多少呢?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-02 17:18
如果你在 12:00   建了一個 rrd file , step 是 300 (5min),type gauge
heartbeat 是 1200, 假設資料為,一小時內資料是
1 n 2 n n n n n n n 2 n    (n 表示沒有 update ,即 NaN)

畫出來的圖長什麼樣呢 ?
如果我的理解沒有錯,因為在 1800 秒內沒有資料時,他們往前參考,變成
1 1 2 2 2 2 2 n n n 2 2

也就是 12:05 分會看 12:00 的資料,因為 heartbeat 1200 為 20 分
鐘, 20 分內沒有資料就往前參考

所以,若你細心觀查 mrtg 的 log 檔,就可以知道 , heartbeat 值為多少
較好.
你可以做一個實際,將 mrtg 的 log 轉成 rrd  (這個 shell 很簡單,你應該會才是), 不同的 step=300 , 不同的 heartbeat 成圖的效果如何


至於最大值畫下面的建議,是你要用 AREA+CDEF 堆疊
或直接用 STACK 時才有作用
不然建議您,轉成 百分比(%) 來畫吧, Used/Total =99%
畫這個 99 數字,而不畫原來的值
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-02 17:20
引述: "oicqonly"
以前用MRTG,最短图像间隔是5分钟,请问rrdtool的最短间隔是多少呢?

1 秒
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-02 18:24
引述: "abelyang"
如果你在 12:00   建了一個 rrd file , step 是 300 (5min),type gauge
heartbeat 是 1200, 假設資料為,一小時內資料是
1 n 2 n n n n n n n 2 n    (n 表示沒有 update ,即 NaN)

畫出來的圖長什麼樣呢 ?
如果我的理解沒有錯,因為在 1800 秒內沒有資料時,他們往前參考,變成
1 1 2 2 2 2 2 n n n 2 2

也就是 12:05 分會看 12:00 的資料,因為 heartbeat 1200 為 20 分
鐘, 20 分內沒有資料就往前參考

所以,若你細心觀查 mrtg 的 log 檔,就可以知道 , heartbeat 值為多少
較好.
你可以做一個實際,將 mrtg 的 log 轉成 rrd  (這個 shell 很簡單,你應該會才是), 不同的 step=300 , 不同的 heartbeat 成圖的效果如何


至於最大值畫下面的建議,是你要用 AREA+CDEF 堆疊
或直接用 STACK 時才有作用
不然建議您,轉成 百分比(%) 來畫吧, Used/Total =99%
畫這個 99 數字,而不畫原來的值


大哥,能给个提示吗?AREA+CDEF这一部分我真是没有搞懂,最主要的就是CDEF:(
拿我这个mem的做个例子讲解一下如何?
谢谢了大哥。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-03 12:21
這是 STACK 及 CDEF 的用法
create/data/graph 程式你可以在這裏取得
http://211.72.210.251/images/spam.tgz

重點在
CDEF:total=client,subject,rbl,gb2312,+,+,+      \
...
STACK: ... 要畫成堆疊效果

作用在把那幾個 DSN 加起來,做成總合這個值,STACK 則一個一個把圖疊上去,形成層次效果,成圖效果如下:
(http://log.twnic.net.tw/images/spam-month.png)
(http://log.twnic.net.tw/images/spam-week.png)

等一下再做一個 % 的顯示給您參考
不過重點是你要看懂 www.rrdtool.org 上的教學,才是最重要的
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-03 14:00
谢谢大哥,俺一直在线等着大哥的回复呢,同时也在看rrdtool的文档,期待大哥的百分数(%)的示例。非常感谢。。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-03 14:58
引述: "fire-phoenix"
谢谢大哥,俺一直在线等着大哥的回复呢,同时也在看rrdtool的文档,期待大哥的百分数(%)的示例。非常感谢。。

基本上我會建議您自己先試,並找答案及研讀官網對 CDEF (RPN) 的說明
總比等我的答案來 得好,因為這樣你才能體會到精神所在,不是用 sample
一直改

代碼: [選擇]

#!/bin/sh
RRD_FILE=/root/study/mail.rrd
now=`date`
time="day week month year"
for t in $time
do
rrdtool graph /www/htdocs/211.72.210.251/images/spam-per-$t.png \
--title "abelyang SPAM 統計情形 ($t)" \
-n DEFAULT:12:/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf \
--font-render-mode normal \
--font-smoothing-threshold 10 \
-u 100 -v "SPAM TYPE (%)" \
DEF:client=$RRD_FILE:client:AVERAGE \
DEF:subject=$RRD_FILE:subject:AVERAGE \
DEF:rbl=$RRD_FILE:rbl:AVERAGE \
DEF:gb2312=$RRD_FILE:gb2312:AVERAGE \
COMMENT:"  SPAM類別      最大   平均   最小  
CDEF:total=client,subject,rbl,gb2312,+,+,+ \
CDEF:p_client=100,client,total,/,* \
CDEF:p_subject=100,subject,total,/,* \
CDEF:p_rbl=100,rbl,total,/,*      \
CDEF:p_gb2312=100,gb2312,total,/,*      \
COMMENT:'-------------------------------------------------------------------------------------------\n' \
AREA:p_client#0000ff:'發信軟體 ' \
GPRINT:p_client:MAX:"%5.2lf" \
GPRINT:p_client:AVERAGE:"%5.2lf" \
GPRINT:p_client:MIN:"%5.2lf" \
GPRINT:p_client:LAST:"%5.2lf\n" \
STACK:p_subject#ff0000:'特定字串 ' \
GPRINT:p_subject:MAX:"%5.2lf" \
GPRINT:p_subject:AVERAGE:"%5.2lf" \
GPRINT:p_subject:MIN:"%5.2lf" \
GPRINT:p_subject:LAST:"%5.2lf\n" \
STACK:p_rbl#00ff00:'RBL黑名單  ' \
GPRINT:p_rbl:MAX:"%5.2lf" \
GPRINT:p_rbl:AVERAGE:"%5.2lf" \
GPRINT:p_rbl:MIN:"%5.2lf" \
GPRINT:p_rbl:LAST:"%5.2lf\n" \
STACK:p_gb2312#000040:'簡體信件 ' \
GPRINT:p_gb2312:MAX:"%5.2lf" \
GPRINT:p_gb2312:AVERAGE:"%5.2lf" \
GPRINT:p_gb2312:MIN:"%5.2lf" \
GPRINT:p_gb2312:LAST:"%5.2lf\n" \
COMMENT:'  檔信總合' \
GPRINT:total:MAX:"%5.2lf" \
GPRINT:total:AVERAGE:"%5.2lf" \
GPRINT:total:MIN:"%5.2lf" \
GPRINT:total:LAST:"%5.2lf\n" \
-w 600 -h 200 -s `date -d "-1 $t" +%s`
done


原圖
(http://log.twnic.net.tw/images/spam-week.png)
百分比圖
(http://log.twnic.net.tw/images/spam-per-week.png)

原圖
(http://log.twnic.net.tw/images/spam-month.png)
百分比圖
(http://log.twnic.net.tw/images/spam-per-month.png)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: fire-phoenix2005-08-03 18:22
谢谢大哥,不仅学习大哥提供的学习文档,还有学习大哥的学习精神。非常感谢。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: a2005-08-07 17:20
hi, 楼主,
能再解释一下你对 建档的理解吗? step值和 RRA中xff, steps, rows 值,
按照你的理解和rrdtool官方站点。http://rrdtool.planetmirror.com//tutorial/rrdtutorial.html
中洋例的说明有出入, 样例中的
step 使用默认值 300s
RRA的steps设置1, rows设置24时,ne averages the data every time it is read (e.g. there's nothing to average) and keeps 24 samples (24 times 5 minutes is 2 hours)

RRA的steps设置6, rows设置10时,The other averages 6 values (half hour) and contains 10 of such averages (e.g. 5 hours)

你怎么理解指南样例中的这2句话呢?
如果按你的解释, 这个rows仅仅是一个记录的笔数, 还是象指南样例中参与计算呢?
这个2小时,5小时的意义有何在?
烦有空帮助解释, Thanks.
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-08 10:03
引用
step 使用默认值 300s
RRA的steps设置1, rows设置24时,ne averages the data every time it is read (e.g. there's nothing to average) and keeps 24 samples (24 times 5 minutes is 2 hours)

RRA:CF:xff:steps:rows  
我不知道這有什麼需要解釋的呀 !? 沒有記錯的話前面都有講過
step=5min,row 有 24 筆,不就是 5x24=120(2 hour),不知您所謂"出入"
何在 ?

RRA的steps设置6, rows设置10时,The other averages 6 values (half hour) and contains 10 of such averages (e.g. 5 hours)
所以意思是6個 step (5min) 合成一個資料,共 10 個
6x5x10=300 分鐘 = 5 小時   (6x5=30 分, half hour)
不知您有什麼樣的問題呢 ? 想必全篇您並末詳讀所致

至於您的困擾估記在 DS/RRA, DS 僅是名稱,變數而以, RRA 決定的
這個變數儲存的量及 CF(Min/Max/Average..)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: olderboy2005-08-19 10:41
想請教一下大大,關於更新RRD資料時,你下面的
代碼: [選擇]
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:114:0:50:1199:0:821073這些數值,除了1061811856,是表示一個時間點之外,不知其它的數值呢??也是表示他們要取得數值的時間點嗎??
還請大大指點一下~
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-08-19 12:02
就是 DSN (data source name) 的資料的值
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-15 14:28
abelyang兄您好
  小弟之前安裝了rrdtool1.0版可以用crontab跑一分鐘一次.後來小弟把1.0的rpm移掉,而改成1.2的tar裝好了,可是用crontab卻跑不出來,而script都是一樣的,小弟直接執行這支script也可以跑,不知是不是1.2版的不能用crontab,但是這樣不是很奇怪嗎???還是1.2版的script不一樣呢??煩請指教,謝謝

小弟是參考您的script來跑的,如下
引用
#!/bin/sh
RRDFILE1="/var/www/html/sys/mrtg/192.168.200.254_2.rrd"
RRDFILE2="/var/www/html/sys/mrtg/192.168.200.254_3.rrd"
RRDFILE3="/var/www/html/sys/mrtg/192.168.200.13_65539.rrd"
RRDFILE4="/var/www/html/sys/mrtg/192.168.200.13_65540.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /var/www/html/sys/mrtg/pdcnat$t.png \
--title "pdcnat traffic"  \
-s `date -d "-1 $t" +%s`        \
DEF:in1=$RRDFILE1:ds0:AVERAGE     \
DEF:in2=$RRDFILE2:ds0:AVERAGE     \
DEF:in3=$RRDFILE2:ds0:AVERAGE     \
DEF:in4=$RRDFILE2:ds0:AVERAGE     \
DEF:out1=$RRDFILE1:ds1:AVERAGE    \
DEF:out2=$RRDFILE2:ds1:AVERAGE    \
DEF:out3=$RRDFILE2:ds1:AVERAGE    \
DEF:out4=$RRDFILE2:ds1:AVERAGE    \
COMMENT:"In/Out                MAX         AVG         NOW \n"  \
AREA:in1#ff0000:"pdcnat WAN ": \
        GPRINT:in1:MAX:"%10.0lf"  \
        GPRINT:in1:AVERAGE:"%10.0lf"  \
        GPRINT:in1:LAST:"%10.0lf\n"  \
STACK:in2#00ff00:"pdcnat LAN ": \
        GPRINT:in2:MAX:"%10.0lf"  \
        GPRINT:in2:AVERAGE:"%10.0lf"  \
        GPRINT:in2:LAST:"%10.0lf\n"  \
AREA:in3#ff00ff:"NB LAN     ": \
        GPRINT:in1:MAX:"%10.0lf"  \
        GPRINT:in1:AVERAGE:"%10.0lf"  \
        GPRINT:in1:LAST:"%10.0lf\n"  \
STACK:in4#000f0f:"NB Wirless ": \
        GPRINT:in2:MAX:"%10.0lf"  \
        GPRINT:in2:AVERAGE:"%10.0lf"  \
        GPRINT:in2:LAST:"%10.0lf\n"  \
AREA:out1#ff0000:"pdcnat WAN ": \
        GPRINT:out1:MAX:"%10.0lf"  \
        GPRINT:out1:AVERAGE:"%10.0lf"  \
        GPRINT:out1:LAST:"%10.0lf\n"  \
STACK:out2#00ff00:"pdcnat LAN ": \
        GPRINT:out2:MAX:"%10.0lf"  \
-w 600 -h 150
done
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-09-15 14:37
1. 確定 沒有 PATH 問題 ? 因為路徑可能巳不同,cron 的 PATH 不見得同於 user PATH
2. 確定手動跑能否在一分內跑完 ? 如果跑不完要多注意
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-15 14:47
abelyang兄您好
沒想到您這麼快就回了,小弟好感動,真的是不知要如何表達心中的感激
小弟有設過了PATH,而cron 的path小弟也是有確定過
而手動跑大概4秒就跑完了,所以不知道是什麼原因 :o
還會有其它的可能因素嗎
不然小弟就只好把這個script加到另一個script裡去跑cron看看了 :o
謝謝ableyang兄的指導,也請您繼續指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-09-15 14:54
引述: "peteryang"
abelyang兄您好
沒想到您這麼快就回了,小弟好感動,真的是不知要如何表達心中的感激
小弟有設過了PATH,而cron 的path小弟也是有確定過
而手動跑大概4秒就跑完了,所以不知道是什麼原因 :o
還會有其它的可能因素嗎
不然小弟就只好把這個script加到另一個script裡去跑cron看看了 :o
謝謝ableyang兄的指導,也請您繼續指教,謝謝

如果是這樣的話,
你可能得看一下
/var/log/cron (是否執行)及
cron user 的 mail (結果為何) 來確認了
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-15 15:16
感謝abelyang兄的指教終於找到問題了
原本小弟沒有裝mail,後來就照您的建議,去看mail,所以就把mail給裝起來,果然看到是那邊的錯誤了,原來是script裡rrdtool的路徑沒有指,所以小弟就把路徑再加上去就好了,但是在環境變數裡,小弟有加了rrdtool的路徑,而且也執行過沒有問題,但是為什麼在script裡不能執行呢??難道是只能在目前script所在的路徑裡執行指令,若是沒有在同一目錄下就不能執行嗎??覺得怪怪的,不過終於解決問題了,謝謝abelyang兄的指導,謝謝
主題: 更新rrdtool有問題
作者: peteryang2005-09-26 16:29
abelyang兄您好:
小弟參考您的script寫了一個抓windows的資料,但是在update時出現error,下面是script 的內容
引用
#!/bin/sh
#RRDFILE="/var/www/html/sys/mrtg/rrd/pdcadhw.rrd"
RRDFILE="/etc/mrtg/test/pdcadhw.rrd"
TITLE="PDCAD HardWare Lording"
now=`date "+%Y/%m/%d %H-%M-%S"`
`snmpwalk -On -c public -v 1 192.168.200.1 > pdchw`
cpuad=`cat pdchw | grep .1.3.6.1.2.1.25.3.3.1.2.2`
pdcadcpu=${cpuad:36}
vmm=`cat pdchw | grep .1.3.6.1.2.1.25.2.3.1.6.7`
pdcvmm=${vmm:36}
pm=`cat pdchw | grep .1.3.6.1.2.1.25.2.3.1.6.8`
pdcpm=${pm:36}

echo $pdcadcpu
echo $pdcvmm
echo $pdcpm

/usr/local/rrdtool/bin/rrdtool update $RRDFILE `date +%s`:$pdcadcpu:$pdcvmm:$pdcpm


面是error的訊息
引用
[root@pdcgw test]# ./winhw.sh
0
4236
1806
ERROR: expected 3 data source readings (got 1) from 1127723298::..

小弟看不出來是什麼原因,煩請您及各位先進不吝指教謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-09-26 16:32
/usr/local/rrdtool/bin/rrdtool update $RRDFILE `date +%s`:$pdcadcpu:$pdcvmm:$pdcpm

把這整行輸出....它說應該要有三個 data source , 但是只有得到一個
所以你的問題要在這上面找
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-26 16:53
abelyang兄
小弟後來沒有用變數來做,可以update
那是不是小弟的變數有設錯呢??
煩請指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-09-26 16:57
/usr/local/rrdtool/bin/rrdtool update $RRDFILE `date +%s`:$pdcadcpu:$pdcvmm:$pdcpm

改成
echo /usr/local/rrdtool/bin/rrdtool update $RRDFILE `date +%s`:$pdcadcpu:$pdcvmm:$pdcpm

整行輸出,看看整個 command 對不對
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-26 17:01
abelyang兄
小弟跑出來如下:
代碼: [選擇]
[root@pdcgw test]# ./winhw.sh
1
4284
1819
/usr/local/rrdtool/bin/rrdtool update /etc/mrtg/test/pdcadhw.rrd 1127725236: 1: 4284: 1819

會不會是空白所造成的呢???
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2005-09-26 17:02
引述: "peteryang"
abelyang兄
小弟跑出來如下:
代碼: [選擇]
[root@pdcgw test]# ./winhw.sh
1
4284
1819
/usr/local/rrdtool/bin/rrdtool update /etc/mrtg/test/pdcadhw.rrd 1127725236: 1: 4284: 1819

會不會是空白所造成的呢???

是的~這就是原因所在
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2005-09-26 17:03
小弟後來再試果然是再抓取字串時,有一個空白,但是用echo跑出來卻沒有出現,導致script會判斷錯誤,謝謝abelyang兄的指導,謝謝
主題: 可以教我 rrdtool xport 如何把資料匯出來做分析呢?
作者: ericblue2005-10-21 15:03
引述: "abelyang"
嗯~您的學習方式是對的...
官網上對 fetch 很清楚的解釋,
我的說明大柢上只是引領大家進入 rrdtool 的路...
(最難的是對 create 的語法理解),再來路怎麼走怎麼修就得看個
人發揮了
主題: Re: 可以教我 rrdtool xport 如何把資料匯出來做分析呢?
作者: ericblue2005-10-21 15:05
可以教我 rrdtool xport 如何把資料匯出來做分析呢?





 thanks !!!!!!!!!!!!
主題: Re: 可以教我 rrdtool xport 如何把資料匯出來做分析呢?
作者: abelyang2005-10-21 15:09
引述: "ericblue"
可以教我 rrdtool xport 如何把資料匯出來做分析呢?
 thanks !!!!!!!!!!!!

這問題有點奇怪
你做了什麼努力, xport 輸出是什麼及什麼格式,
你要做什麼分析 ?
你自己不花點心力學習甚至解釋問題,
何以寄望別人呢 ?
主題: RRDTOOL問題
作者: v168222005-12-03 01:26
rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]


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


我想問的是1061811856:114:0:50:1199:0:821073  這些數字是如何產生出來的,還有建完檔後,更新的葯在哪邊執行還是要寫程式要寫在哪哩,還有建檔後如果想再加東西是要怎麼重建,還是要加入東西就好,我想請問有沒有有關主機部分跟封包部分的一些資料
主題: Re: RRDTOOL問題
作者: abelyang2005-12-05 11:08
引述: "v16822"
rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]


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


我想問的是1061811856:114:0:50:1199:0:821073  這些數字是如何產生出來的,還有建完檔後,更新的葯在哪邊執行還是要寫程式要寫在哪哩,還有建檔後如果想再加東西是要怎麼重建,還是要加入東西就好,我想請問有沒有有關主機部分跟封包部分的一些資料

你的問題在於學習方法不對,
請你把本文在看個十次,另外佐以 www.rrdtool.org 再來問題
這個東西不是看三遍就會的東西
主題: rrdtool info输出的数值是怎么回事?
作者: 书剑&2006-02-28 20:04
我是rrdtool的初学者,有些地方不太明白,哪位知道帮忙解答一下,好吗?我用rrdtool info命令看rrd数据库中的记录,怎么.value那一项的数据那么奇怪呢,我更新数据时给的数值是100,可.value那一项却是3.2500000e+04什么的,这是怎么回事呢?还有我按论坛上教的方法做tcpdump的那个图形,我每次更新的数据都是300多,500多,600多的,怎么出来的值那么小呢?我看最大值才是152.rrd的数据到底是怎么回事呢?
主題: Re: rrdtool info输出的数值是怎么回事?
作者: abelyang2006-03-01 13:49
引述: "书剑&"
我是rrdtool的初学者,有些地方不太明白,哪位知道帮忙解答一下,好吗?我用rrdtool info命令看rrd数据库中的记录,怎么.value那一项的数据那么奇怪呢,我更新数据时给的数值是100,可.value那一项却是3.2500000e+04什么的,这是怎么回事呢?还有我按论坛上教的方法做tcpdump的那个图形,我每次更新的数据都是300多,500多,600多的,怎么出来的值那么小呢?我看最大值才是152.rrd的数据到底是怎么回事呢?

3.2500000e+04 的意思是 3.250000*10^4  (10的4次方)
(你們的數學或物理教育沒有教這個嗎?)

至於數值問題
Values       = 300, 600, 900, 1200
Step         = 300 seconds
COUNTER DS   =    1,  1,   1,    1
DERIVE DS    =    1,  1,   1,    1
ABSOLUTE DS  =    1,  2,   3,    4
GAUGE DS     = 300, 600, 900, 1200

你好好想想這個表,再加上我前面說的
或是參考
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tut/rrd-beginners.en.html
主題: 呵呵,问个问题
作者: sunxh2006-03-08 18:04
你好abelyang,首先感谢你的文章使我很快了解了rrd。我在照你的步骤学习的过程中遇到了一些问题,特来请教。
我生成了那个1.cmd,里面也有如下内容:
rrdtool update tcpdump.rrd 1141800554:51:0:15571,
我只画三个数据http、ftp,和total,
可是我做出的图没有数据,不知道那出了问题。

另外我想问一下*.rrd用vi打开是一个规整的数据库,还是一些乱码,我生成的*.rrd用vi打开后什么都看不懂,是乱码,这样正常吗?
主題: Re: 呵呵,问个问题
作者: abelyang2006-03-09 09:32
引述: "sunxh"
你好abelyang,首先感谢你的文章使我很快了解了rrd。我在照你的步骤学习的过程中遇到了一些问题,特来请教。
我生成了那个1.cmd,里面也有如下内容:
rrdtool update tcpdump.rrd 1141800554:51:0:15571,
我只画三个数据http、ftp,和total,
可是我做出的图没有数据,不知道那出了问题。

另外我想问一下*.rrd用vi打开是一个规整的数据库,还是一些乱码,我生成的*.rrd用vi打开后什么都看不懂,是乱码,这样正常吗?

1. 你生成的數據要做 update 幾次,讓它至少有一個完整以上的 step
ex: step=300 時,你每五分做一次,做三次後再來畫圖

2. .rrd 是 binary 檔
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: lorcs2006-03-12 23:25
你好Abel兄!我修改了rrdtool
1.2.12,想将生成的图相的标题能支持中文简体.但不知为什麽连X轴的日期也自动变成中文.请教问题在哪里?怎样才能保留原有的英文?以下是所生图相和rrdtool所改的原码。



/usr/local/rrdtool-1.2.12/bin/rrdtool graph - \
--imgformat=PNG \
--start=1140961169 \
--end=1142170769 \
--title="主网接入 Fa5/0" \
--rigid \
--base=1000 \
--height=120 \
--width=500 \
--alt-autoscale-max \
--lower-limit=0 \
COMMENT:"From 2006/Feb/26 21\:39\:29 To 2006/Mar/12 21\:39\:29\c" \
COMMENT:"  \n" \
--vertical-label="bits per second" \
--slope-mode \
--font TITLE:12:/usr/share/fonts/chinese/TrueType/gkai00mp.ttf \
--font AXIS:8:/usr/share/fonts/chinese/TrueType/gkai00mp.ttf \
--font LEGEND:10:/usr/share/fonts/chinese/TrueType/gkai00mp.ttf \
--font UNIT:8:/usr/share/fonts/chinese/TrueType/gkai00mp.ttf \
DEF:a="/var/www/html/avatac/rra/_traffic_in_60.rrd":traffic_in:AVERAGE \
DEF:b="/var/www/html/avatac/rra/_traffic_in_60.rrd":traffic_out:AVERAGE \
CDEF:cdefa=a,8,* \
CDEF:cdefe=b,8,* \
AREA:cdefa#00CF00:"Inbound"  \
GPRINT:cdefa:LAST:" Current\:%8.2lf %s"  \
GPRINT:cdefa:AVERAGE:"Average\:%8.2lf %s"  \
GPRINT:cdefa:MAX:"Maximum\:%8.2lf %s\n"  \
LINE1:cdefe#002A97:"Outbound"  \
GPRINT:cdefe:LAST:"Current\:%8.2lf %s"  \
GPRINT:cdefe:AVERAGE:"Average\:%8.2lf %s"  \
GPRINT:cdefe:MAX:"Maximum\:%8.2lf %s\n"  \
HRULE:7382833.23#FF0000:"95 Percentile Outbound\: 7.38 mbit\n"  \
HRULE:8258809.65#4668E4:"95 Percentile Inbound\: 8.26 mbit"  \
COMMENT:"The report is last updated in Sun 12 Mar 22\:30\:10 HKT 2006"

From rrd_gfx.c file
/* create a free type glyph string */
gfx_string gfx_string_create(gfx_canvas_t *canvas, FT_Face face,const char
*text,
        int rotation, double tabwidth, double size )
{

  FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
  FT_Bool       use_kerning;
  FT_UInt       previous;
  FT_Vector     ft_pen;

  gfx_string    string = (gfx_string) malloc (sizeof(struct gfx_string_s));

  gfx_char      glyph;          /* current glyph in table */
  int      n;
  int           error;
  int        gottab = 0;

  wchar_t* w_text;

#ifdef HAVE_MBSTOWCS
  wchar_t   *cstr;
  size_t   clen = strlen(text)+1;
  cstr = malloc(sizeof(wchar_t) * clen); /* yes we are allocating probably
too much here, I know */
  string->count=mbstowcs(cstr,text,clen);
  if ( string->count == -1){
  /* conversion did not work, so lets fall back to just use what we got */
   string->count=clen-1;
        for(n=0;text[n] != '\0';n++){
            cstr[n]=(unsigned char)text[n];
        }
  }
#else
  char      *cstr = strdup(text);
  string->count = strlen (text);
#endif

  ft_pen.x = 0;   /* start at (0,0) !! */
  ft_pen.y = 0;


  string->width = 0;
  string->height = 0;
  string->glyphs = (gfx_char) calloc (string->count,sizeof(struct
gfx_char_s));
  string->num_glyphs = 0;
  string->transform.xx = (FT_Fixed)( cos(M_PI*(rotation)/180.0)*0x10000);
  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);

w_text = (wchar_t) calloc (string->count,sizeof(wchar_t));
  mbstowcs(w_text,text,string->count);


  use_kerning = FT_HAS_KERNING(face);
  previous    = 0;
  glyph = string->glyphs;
  for (n=0; n<string->count;glyph++,n++) {
    FT_Vector   vec;
    /* handle the tabs ...
       have a witespace glyph inserted, but set its width such that the
distance
    of the new right edge is x times tabwidth from 0,0 where x is an
integer. */
    unsigned int letter = cstr[n];
   letter = afm_fix_osx_charset(letter); /* unsafe macro */

    gottab = 0;
    if (letter == '\\' && n+1 < string->count && cstr[n+1] == 't'){
            /* we have a tab here so skip the backslash and
               set t to ' ' so that we get a white space */
            gottab = 1;
            n++;
            letter  = ' ';
    }
    if (letter == '\t'){
   letter = ' ';
        gottab = 1 ;
    }
    /* initialize each struct gfx_char_s */
    glyph->index = 0;
    glyph->pos.x = 0;
    glyph->pos.y = 0;
    glyph->image = NULL;

    glyph->index = FT_Get_Char_Index( face, w_text[n]);

    /* compute glyph origin */
    if ( use_kerning && previous && glyph->index ) {
      FT_Vector kerning;
      FT_Get_Kerning (face, previous, glyph->index,
          ft_kerning_default, &kerning);
      ft_pen.x += kerning.x;
      ft_pen.y += kerning.y;
    }

    /* load the glyph image (in its native format) */
    /* for now, we take a monochrome glyph bitmap */
    error = FT_Load_Glyph (face, glyph->index, size >
canvas->font_aa_threshold ?
                            canvas->aa_type == AA_NORMAL ?
FT_LOAD_TARGET_NORMAL :
                            canvas->aa_type == AA_LIGHT ?
FT_LOAD_TARGET_LIGHT :
                            FT_LOAD_TARGET_MONO : FT_LOAD_TARGET_MONO);
    if (error) {
      DPRINTF("couldn't load glyph:  %c\n", letter)
      continue;
    }
    error = FT_Get_Glyph (slot, &glyph->image);
    if (error) {
      DPRINTF("couldn't get glyph %c from slot %d\n", letter, (int)slot)
      continue;
    }
    /* if we are in tabbing mode, we replace the tab with a space and shift
the position
       of the space so that its left edge is where the tab was supposed to
land us */
    if (gottab){
       /* we are in gridfitting mode so the calculations happen in 1/64
pixles */
        ft_pen.x = tabwidth*64.0 * (float)(1 + (long)(ft_pen.x / (tabwidth *
64.0))) - slot->advance.x;
    }
    /* store current pen position */
    glyph->pos.x = ft_pen.x;
    glyph->pos.y = ft_pen.y;


    ft_pen.x   += slot->advance.x;
    ft_pen.y   += slot->advance.y;

    /* rotate glyph */
    vec = glyph->pos;
    FT_Vector_Transform (&vec, &string->transform);
    error = FT_Glyph_Transform (glyph->image, &string->transform, &vec);
    if (error) {
      DPRINTF("couldn't transform glyph id %d\n", letter)
      continue;
    }

    /* convert to a bitmap - destroy native image */
    error = FT_Glyph_To_Bitmap (&glyph->image, size >
canvas->font_aa_threshold ?
                            canvas->aa_type == AA_NORMAL ?
FT_RENDER_MODE_NORMAL :
                            canvas->aa_type == AA_LIGHT ?
FT_RENDER_MODE_LIGHT :
                            FT_RENDER_MODE_MONO : FT_RENDER_MODE_MONO, 0,
1);
    if (error) {
      DPRINTF("couldn't convert glyph id %d to bitmap\n", letter)
      continue;
    }

    /* increment number of glyphs */
    previous = glyph->index;
    string->num_glyphs++;
  }
  free(cstr);
/*  printf ("number of glyphs = %d\n", string->num_glyphs);*/
  compute_string_bbox( string );
  /* the last character was a tab */
  /* if (gottab) { */
      string->width = ft_pen.x;
  /* } else {
      string->width = string->bbox.xMax - string->bbox.xMin;
  } */
  string->height = string->bbox.yMax - string->bbox.yMin;

  free(w_text);

  return string;
}

From rrd_graph.c

rrd_graph_init(image_desc_t *im)
{
    unsigned int i;

#ifdef HAVE_TZSET
    tzset();
#endif
#ifdef HAVE_SETLOCALE
    setlocale(LC_ALL,"zh_CN.UTF-8");
#endif
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: twu22006-03-13 08:27
man 一下 setlocale() 看看吧. 不要用 LC_ALL, 改成你要的那些項目設成 zh_CN.UTF-8 就好了.
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-03-13 08:51
man setlocale
你要排除 LC_TIME
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: lorcs2006-03-14 23:30
多謝TWU2和Abel兄,我的問題解決了。

Ray
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: tigershen2006-04-03 17:38
FreeBSD的使用者要改這個才能使用中文.
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool-trac/changeset/772
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: 书剑&2006-04-06 09:16
楼主,有个问题能不能帮帮忙 .我想将rrdtool生成的图形放到网页上,用rrdcgi,我的脚本内容如下:
#!/usr/local/rrdtool/bin/rrdcgi
<RRD::GOODFOR 300>
<HTML>
<HEAD> <TITLE> RRD CGI DEMO </TITLE></HEAD>
<BODY bgcolor="#000000" text="#ffffff">
<RRD::SETVAR rrdname /home/zlf/shell/protocol.rrd>
<RRD::SETVAR imgedir /home/zlf/shell>
<RRD::GRAPH
<RRD::GETVAR imgedir>/tcp.png
--imginfo '<IMG SRC=/images/%s WIDTH=%lu HEIGHT=%lu>'
--lazy -w 800 -h 200
-c BACK#000000 -c CANVAS#000000 -c GRID#808080 -c MGID#ffffff
-c FONT#ffffff -c FRAME#808080
DEF:v1=<RRD::GETVAR rrdname>:TCP:AVERAGE "CDEF:t1=v1,1024,/"
AREA:t1#0066ff:"TCP"
>
</BODY>
</HTML>
可在地址栏内一输入地址就说ERROR: opening '/home/zlf/shell/protocol.rrd': Permission denied,我protocol.rrd的权限改成777都不行,这是怎么回事呢?楼主能帮一下忙吗?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-04-07 10:09
我不知道為什麼,因為我沒有用過 rrdcgi
我想可能是 rrdcgi 先 delete 再做 create 圖檔的動作
所以你 rrd 777 可能仍有問題,把目錄也改成 777 試試看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2006-04-27 18:53
我照著設定, ok 了, 不過想問怎樣控制 x axis 的東西?

1. 使用 rrdtool graph -s `date -d "-1 day" +"%s"`
但是 x axis 的東西是 00:00 02:00 etc...
怎樣改成 00:00 , 06:00 這樣?不想太密...

2. 使用 rrdtool graph -s `date -d "-1 week" +"%s"`
但是 x axis 的東西是 00:00 02:00 etc...
怎樣改成星期一, 星期二 這樣?

看了幾次也看不出應在哪裏設
謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-04-28 10:20
代碼: [選擇]

Grid

    X-Axis
        [-x|--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM]

        [-x|--x-grid none]

        The x-axis label is quite complex to configure. If you don't have very special needs it is probably best to rely on the autoconfiguration to get this right. You can specify the string none to suppress the grid and labels altogether.

        The grid is defined by specifying a certain amount of time in the ?TM positions. You can choose from SECOND, MINUTE, HOUR, DAY, WEEK, MONTH or YEAR. Then you define how many of these should pass between each line or label. This pair (?TM:?ST) needs to be specified for the base grid (G??), the major grid (M??) and the labels (L??). For the labels you also must define a precision in LPR and a strftime format string in LFM. LPR defines where each label will be placed. If it is zero, the label will be placed right under the corresponding line (useful for hours, dates etcetera). If you specify a number of seconds here the label is centered on this interval (useful for Monday, January etcetera).

        --x-grid MINUTE:10:HOUR:1:HOUR:4:0:%X

        This places grid lines every 10 minutes, major grid lines every hour, and labels every 4 hours. The labels are placed under the major grid lines as they specify exactly that time.

        --x-grid HOUR:8:DAY:1:DAY:1:0:%A

        This places grid lines every 8 hours, major grid lines and labels each day. The labels are placed exactly between two major grid lines as they specify the complete day and not just midnight.


 把官網上的 rrdgraph 看一下,因為這個功能我很少用,所以不做介紹
而且實際上我也覺得這個不好用
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2006-04-28 12:44
其實我又不是太刻意想修改 x axis:

(http://211.72.210.251/images/image004.png)

(http://211.72.210.251/images/image010.gif)

我看到大大可以做到, 而我做不到, 但是看設定的步驟找不到那裏是
所以這樣問

也許我貼一貼我的設定檔:

引述: "create"
rrdtool create ./remoteserver.domain.com.rrd -s 600 -b `date +"%s"` \
DS:cpuSys:GAUGE:600:0:100 \
DS:cpuUser:GAUGE:600:0:100 \
DS:cpuIO:GAUGE:600:0:100 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800 \
RRA:AVERAGE:0.5:24:1200 \
RRA:AVERAGE:0.5:288:600


引述: "cron"
#!/bin/bash
host=remoteserver.domain.com

cd /tmp
wget http://$host/cpu_user.html
wget http://$host/cpu_sys.html
wget http://$host/cpu_io.html
cpuUser=`cat cpu_user.html`
cpuSys=`cat cpu_sys.html`
cpuIO=`cat cpu_io.html`
# $cpu* store a int between 0~100
rm -f cpu_user.html cpu_sys.html cpu_io.html
/bin/rrdtool update /var/www/html/rrdtool/$host/$host.rrd N:$cpuUser:$cpuSys:$cpuIO


引述: "genGraph"
#!/bin/bash
host=remoteserver.domain.com

RRD_FILE=/var/www/html/rrdtool/$host/$host.rrd
rrdtool graph /var/www/html/rrdtool/$host/$host\_$1.png \
--title "$host CPU loading" \
DEF:t1=$RRD_FILE:cpuSys:AVERAGE \
DEF:t2=$RRD_FILE:cpuUser:AVERAGE \
DEF:t3=$RRD_FILE:cpuIO:AVERAGE \
STACK:t3#0000ff:"IO" \
STACK:t2#00ff00:"user" \
STACK:t1#ff0000:"system" \
-h 180 -w 480 -s `date -d "-1 $1" +"%s"` -v "(%)"


引述: "index.php"
<?php

$host="remoteserver.domain.com";

shell_exec("./genGraph day");
shell_exec("./genGraph week");

echo "<img src=".$host."_day.png><BR>";
echo "<img src=".$host."_week.png>";

?>
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-04-28 13:42
看起來有什麼問題呀,圖畫出來是如何呢 ?

你這個話圖的語法沒有問題嗎 ?
STACK:t3#0000ff:"IO" \
STACK:t2#00ff00:"user" \
STACK:t1#ff0000:"system" \
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2006-04-28 14:07
引述: "abelyang"
看起來有什麼問題呀,圖畫出來是如何呢 ?


圖是這樣

(http://s01.no-ip.org/rrdtool/mailfilter01.xtrapower.org/mailfilter01.xtrapower.org_day.png)

(http://s01.no-ip.org/rrdtool/mailfilter01.xtrapower.org/mailfilter01.xtrapower.org_week.png)

那些時間有些怪符號, 咦, 難道是其他編碼的關係… (猜的)


引述: "abelyang"
你這個話圖的語法沒有問題嗎 ?
STACK:t3#0000ff:"IO" \
STACK:t2#00ff00:"user" \
STACK:t1#ff0000:"system" \


看似沒問題...
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-04-28 14:14
是的,我可想是
你的 rrd 不支援 8bit 但你的 Locale 為 8bit 性質語系
或你的 rrd 巳是中文化版本,但是 Locale 不對
應這是這兩種可能之一
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2006-04-28 16:40
嗯... 試過使用 abelyang 的 patch 和 rrdtool-1.0 abelyang 的 big5 版本
還未行, 比較麻煩... 我會再試

另外對於我所劃的圖有沒有什麼建議, 因為 cpu loading 的數據變動得大, 一時很高一時很低
不懂得怎樣弄靚它= =
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-04-28 17:52
CPU system+user+idle +nice =100
但一般 nice 幾乎不佔比,所以把它算成
system+user+idle =100 話成 STACK 圖就會很穩定
IO 的話就看情況需要視要不要 x10 或 x100
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: paulso2006-04-29 12:42
當 .rrd create 了之後, 有沒有辦法新增多一個 DS ?
我看過官方網站, 沒有新增 DS 的指令, 有 RRA resize 的指令
http://oss.oetiker.ch/rrdtool/doc/rrdresize.en.html

若果沒正常途徑的辦法去新增, 有沒有其他方法去新增?
因為假設今天做了 5 個 server 的 loading monitoring
日後有新 server, 想把它也加入已 create 的 loading monitoring graph

謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-05-02 11:42
引述: "paulso"
當 .rrd create 了之後, 有沒有辦法新增多一個 DS ?
我看過官方網站, 沒有新增 DS 的指令, 有 RRA resize 的指令
http://oss.oetiker.ch/rrdtool/doc/rrdresize.en.html

若果沒正常途徑的辦法去新增, 有沒有其他方法去新增?
因為假設今天做了 5 個 server 的 loading monitoring
日後有新 server, 想把它也加入已 create 的 loading monitoring graph

謝謝

你應該做好正規化,一個 Server 一個 RRD (或一個項目)
全建在一起日後其實不好處理,且對畫圖, update 等操作也花費 cpu
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: tseng312006-05-10 09:53
這篇作的有夠好
雖依時間無法完全了解
慢慢研究
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: gabril2006-07-12 16:35
看了一遍,接近一年的持需帖,真是感激涕零。几日前有相同的需求,尋找了很多方法。今天才找到這里,真是非常感謝阿
主題: rrdtool 显示的LAST纪录不准确?
作者: caci2006-07-15 00:14
rrdtool装好了,用得不错,突然发现在最终结果的图片中显示的当前纪录根本不是准确地数字,而是似乎做了某种运算的结果,

我是用来测试监控目录下的文件总数,简略的配置如下:

./rrdtool create /tmp/file.rrd -s 300 \
DS:filen:GAUGE:1200:0:10000 \
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603          \
RRA:AVERAGE:0.5:24:603         \
RRA:AVERAGE:0.5:288:800        

#!/usr/bin/bash
while ((1))
do

./rrdtool update /tmp/file.rrd N:`ls -l /test | wc | awk '{print $1}'`


./rrdtool graph \
/tmp/file.png --title "Test file total number" \
DEF:t1=/tmp/file.rrd:filen:AVERAGE  \
LINE1:t1#FF0000:"total files number" \
GPRINT:t1:LAST:"Current\:  %6.0lf" \
GPRINT:t1:AVERAGE:"AVERAGE\:  %6.0lf\j" \

sleep 300
done

按照我的理解,GPRINT:t1:LAST:"Current\:  %6.0lf" \这个应该是返回最新的“RRA:AVERAGE:0.5:1:603 “结果,也就是最近的一个原数值,

但是,我发现显示的根本不是实际数值,比如当前是10个文件,但是他返回的可能是12或者什么,似乎了做了什么运算,为什么?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-07-17 11:17
建檔時間取 300 可整除之值
rrdtool create xxx.rrd -b ??????
 
???? 取時間值,不要是預設的 now, 因為 now 決定了 now+step 為一個 RRA , 你五分做一次就取一個五分可整除之值

http://phorum.study-area.org/viewtopic.php?t=23725&highlight=rrdtool
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-17 21:43
非常感谢abelyang老兄的回复,我测试看看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-18 00:12
emmm,还是有点问题,值依然不是非常准确,是否rrdtool graph画图的时候也要取能被300整除的时间?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-18 00:31
又考虑了一会儿,还是有些疑惑,

“now 決定了 now+step 為一個 RRA,你五分做一次就取一個五分可整除之值 ” ,abelyang的意思是这个决定的是开始时间点吧,这样的话,每个做rrdgraph的时间点应该也是必须能被300整除的时间才行,所以单单改-b的似乎还不够,假若后来调整rrdgraph,如果做rrdgraph的时间不能被300整除,依然不是精确值对么?

请abelyang兄弟指教了,非常感谢!

另外哪里有关于这个rrd时间的介绍文档么?我看了rrdtool的,没有仔细讨论这个问题。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-18 00:38
抱歉,写错了,我的意思是做update动作,不是graph动作
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-18 01:00
copy过来abelyang老兄给的那个link,这样的话岂不是说要每个update都要“确定“能被300整除才可以?

--------
從這邊來看
21:45 是 1085665500
但你多了 60 ..
你定 step 是 300 ,但和正常 N+300 的狀況都差了 60s

把這多的 60 處理掉就不會這樣了

300/60=5

所以很多數字看起來有 N+1/5 or N+2/5 ...
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-18 07:09
修改了shell,改由shell执行到crontab里面执行update动作,情况得到较大改善,但是对于多个DS统计的实验(比如监控多个端口的出现次数),出现了最终图片里面部分ds正确部分ds不正确的情况,郁闷中..
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-07-18 12:24
你可以多了解 rrdtool fetch 的用法,
把資料 fetch 出來看看,到底實際的 時間 和 數值的關係
至於你為什麼不準我不知道,但是個人用時是很準的
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: caci2006-07-19 00:32
我再招招原因,无论如何非常感谢abelyang!
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2006-08-14 17:27
各位先進大家好:
小弟在執行時,出現一個Error,如下
引用

ERROR: invalid rpn expression in: 21422080,hdused,100,*,/


小弟執行rrdtool graph的程式如下:

引用

#!/bin/sh
RRDFILE="/var/www/mrtg/AS400/400hd.rrd"
TITLE="AS400 System ASP Userage"
now=`date "+%Y/%m/%d %H-%M-%S"`
`snmpwalk -On -c public -v 1 172.30.248.1 > 400no`
hduse=`cat 400no | grep .1.3.6.1.2.1.25.2.3.1.6.1`
hdused=${hduse:37}

#echo $hdused

/usr/local/rrdtool-1.2.15/bin/rrdtool graph /var/www/mrtg/AS400/400_ind.ps \
--title "$TITLE"  \
-s `date -d "-1 day" +%s`        \
DEF:sysasp=$RRDFILE:sysasp:AVERAGE    \
CDEF:sysaspuse=21422080,hdused,100,*,/  \
COMMENT:"                             MAX  AVERAGE   MIN   NOW \n"   \
AREA:hdus#ffff00:"SYSTEM ASP Userage(%)        "  \
GPRINT:hdus:MAX:"%5.0lf"  \
GPRINT:hdus:AVERAGE:"%5.0lf"  \
GPRINT:hdus:MIN:"%5.0lf"  \
GPRINT:hdus:LAST:"%5.0lf \n"  \
COMMENT:"\n"  \
COMMENT:"Last Updated $now"  \
-v "per second (%)" \
-w 550 -h 350


不知是那裡有問題,煩請各位先進不吝指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-08-14 17:34
CDEF 的這個式子有問題 21422080,hdused,100,*,/
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2006-08-14 17:38
abelyang兄您好:
小弟也是猜這個式子有問題,但是小弟看不出來是那裡錯了,小弟echo hdused有數字,小弟也有試著把hdused改成數字也是有一樣的錯誤訊息,不知還有那裡可能會有錯,煩請不吝指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-08-14 17:47
1. CDEF:sysaspuse=21422080,hdused,100,*,/ \  應為 CDEF:sysaspuse=21422080,$hdused,100,*,/ \   才對 ?

2. 我記得 CDEF 中的東西一定要有一個DEF變數,不能全是常數,所以如果即使是 (1) 的狀況,可能仍會有錯
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2006-08-15 11:46
abelyang兄您好:
小弟照您的指示將變數加上去了,但是又出現了另一個錯誤訊息,如下:
引用

ERROR: rpn expressions without DEF or CDEF variables are not supported

而小弟的程式如下:
代碼: [選擇]

#!/bin/sh
RRDFILE="/var/www/mrtg/AS400/400hd.rrd"
TITLE="AS400 System ASP Userage"
now=`date "+%Y/%m/%d %H-%M-%S"`
`snmpwalk -On -c public -v 1 172.30.248.1 > 400no`
hduse=`cat 400no | grep .1.3.6.1.2.1.25.2.3.1.6.1`
hdused=${hduse:37}

#echo $hdused

/usr/local/rrdtool-1.2.15/bin/rrdtool graph /var/www/mrtg/AS400/400_ind.png \
--title "$TITLE"  \
-s `date -d "-1 day" +%s`        \
DEF:sys=$RRDFILE:sysasp:AVERAGE    \
CDEF:sysuse=21422080,$hdused,100,*,/  \
COMMENT:"                             MAX  AVERAGE   MIN   NOW \n"   \
AREA:sysuse#ffff00:"SYSTEM_ASP_Userage(%)"  \
GPRINT:sys:MAX:"%5.0lf"  \
GPRINT:sys:AVERAGE:"%5.0lf"  \
GPRINT:sys:MIN:"%5.0lf"  \
GPRINT:sys:LAST:"%5.0lf \n"  \
COMMENT:"\n"  \
COMMENT:"Last Updated $now"  \
-v "per second (%)" \
-w 300 -h 150

不知是那裡有問題,煩請您不吝指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-08-15 12:04
ERROR: rpn expressions without DEF or CDEF variables are not supported

"2. 我記得 CDEF 中的東西一定要有一個DEF變數,不能全是常數,所以如果即使是 (1) 的狀況,可能仍會有錯"

你如果要這樣用,那直接在 script 中算出來那個值是多少,然後用
HRULE:value#color[:legend]
把值畫上去
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2006-08-18 10:38
abelyang兄您好:
小弟後來有畫出圖來了,謝謝您的指導,但是小弟要畫出日,週,月,年的圖,卻都全部出現日的圖,不知是小弟那裡有設錯了,煩請您指教,下面是小弟的全部程式碼,請您看一下:
代碼: [選擇]

#!/bin/sh
RRDFILE="/var/www/mrtg/Windows/exchange.rrd"
TITLE="Exchange CPU & RAM Lording"
now=`date "+%Y/%m/%d %H-%M-%S"`
`snmpwalk -On -c public -v 1 172.30.248.4 > exchange`
cpuuse1=`cat exchange | grep .1.3.6.1.2.1.25.3.3.1.2.1`
cpu1=${cpuuse1:37}
cpuuse2=`cat exchange | grep .1.3.6.1.2.1.25.3.3.1.2.2`
cpu2=${cpuuse2:37}
cpuuse3=`cat exchange | grep .1.3.6.1.2.1.25.3.3.1.2.3`
cpu3=${cpuuse3:37}
cpuuse4=`cat exchange | grep .1.3.6.1.2.1.25.3.3.1.2.4`
cpu4=${cpuuse4:37}

#vmtal=`cat exchange | grep .1.3.6.1.2.1.25.2.3.1.5.3`
#vm1=${vmtal:37}
#phtal=`cat exchange | grep .1.3.6.1.2.1.25.2.3.1.5.4`
#ph1=${phtal:37}
vmuse=`cat exchange | grep .1.3.6.1.2.1.25.2.3.1.6.3`
vmm=${vmuse:37}
phuse=`cat exchange | grep .1.3.6.1.2.1.25.2.3.1.6.4`
pm=${phuse:37}

#echo $vm1
#echo $ph1
#echo vm2=$vm2
#echo $ph2

/usr/local/rrdtool-1.2.15/bin/rrdtool graph /var/www/mrtg/Windows/exchange_ind.png \
--title "$TITLE"  \
-s `date -d "-1 day" +%s`        \
DEF:cpu1=$RRDFILE:cpu1:AVERAGE     \
DEF:cpu2=$RRDFILE:cpu2:AVERAGE     \
DEF:cpu3=$RRDFILE:cpu3:AVERAGE     \
DEF:cpu4=$RRDFILE:cpu4:AVERAGE     \
DEF:vmm=$RRDFILE:vmm:AVERAGE     \
DEF:pm=$RRDFILE:pm:AVERAGE     \
CDEF:vmmused=100,vmm,63157,/,*  \
CDEF:pmused=100,pm,32756,/,*   \
COMMENT:"                             MAX  AVERAGE   MIN   NOW \n"   \
AREA:cpu1#ffff00:"CPU Lording(%)        "  \
GPRINT:cpu1:MAX:"%5.0lf"  \
GPRINT:cpu1:AVERAGE:"%5.0lf"  \
GPRINT:cpu1:MIN:"%5.0lf"  \
GPRINT:cpu1:LAST:"%5.0lf \n"  \
AREA:cpu2#a2f200:"CPU Lording(%)        "  \
GPRINT:cpu2:MAX:"%5.0lf"  \
GPRINT:cpu2:AVERAGE:"%5.0lf"  \
GPRINT:cpu2:MIN:"%5.0lf"  \
GPRINT:cpu2:LAST:"%5.0lf \n"  \
AREA:cpu3#b3f300:"CPU Lording(%)        "  \
GPRINT:cpu3:MAX:"%5.0lf"  \
GPRINT:cpu3:AVERAGE:"%5.0lf"  \
GPRINT:cpu3:MIN:"%5.0lf"  \
GPRINT:cpu3:LAST:"%5.0lf \n"  \
AREA:cpu4#c4f400:"CPU Lording(%)        "  \
GPRINT:cpu4:MAX:"%5.0lf"  \
GPRINT:cpu4:AVERAGE:"%5.0lf"  \
GPRINT:cpu4:MIN:"%5.0lf"  \
GPRINT:cpu4:LAST:"%5.0lf \n"  \
AREA:vmmused#339966:"Virtual Memory Use(%) " \
GPRINT:vmmused:MAX:"%5.0lf"  \
GPRINT:vmmused:AVERAGE:"%5.0lf"  \
GPRINT:vmmused:MIN:"%5.0lf"  \
GPRINT:vmmused:LAST:"%5.0lf \n"  \
AREA:pmused#FF0000:"Physical Memory Use(%)" \
GPRINT:pmused:MAX:"%5.0lf"  \
GPRINT:pmused:AVERAGE:"%5.0lf"  \
GPRINT:pmused:MIN:"%5.0lf"  \
GPRINT:pmused:LAST:"%5.0lf \n"  \
COMMENT:"\n"  \
COMMENT:"Last Updated $now"  \
-v "per second (%)" \
-w 300 -h 150

/usr/local/rrdtool-1.2.15/bin/rrdtool update $RRDFILE `date +%s`:$cpu1:$cpu2:$cpu3:$cpu4:$ph2:$vm2
date_range="day week month year"
for t in $date_range
do
/usr/local/rrdtool-1.2.15/bin/rrdtool graph /var/www/mrtg/Windows/exchange_$t.png \
--title "$TITLE"  \
-s `date -d "-1 day" +%s`        \
DEF:cpu1=$RRDFILE:cpu1:AVERAGE     \
DEF:cpu2=$RRDFILE:cpu2:AVERAGE     \
DEF:cpu3=$RRDFILE:cpu3:AVERAGE     \
DEF:cpu4=$RRDFILE:cpu4:AVERAGE     \
DEF:vmm=$RRDFILE:vmm:AVERAGE     \
DEF:pm=$RRDFILE:pm:AVERAGE     \
CDEF:vmmused=100,vmm,63157,/,*  \
CDEF:pmused=100,pm,32756,/,*   \
COMMENT:"                             MAX  AVERAGE   MIN   NOW \n"   \
AREA:cpu1#ffff00:"CPU Lording(%)        "  \
GPRINT:cpu1:MAX:"%5.0lf"  \
GPRINT:cpu1:AVERAGE:"%5.0lf"  \
GPRINT:cpu1:MIN:"%5.0lf"  \
GPRINT:cpu1:LAST:"%5.0lf \n"  \
AREA:cpu2#f2f200:"CPU Lording(%)        "  \
GPRINT:cpu2:MAX:"%5.0lf"  \
GPRINT:cpu2:AVERAGE:"%5.0lf"  \
GPRINT:cpu2:MIN:"%5.0lf"  \
GPRINT:cpu2:LAST:"%5.0lf \n"  \
AREA:cpu3#f3f300:"CPU Lording(%)        "  \
GPRINT:cpu3:MAX:"%5.0lf"  \
GPRINT:cpu3:AVERAGE:"%5.0lf"  \
GPRINT:cpu3:MIN:"%5.0lf"  \
GPRINT:cpu3:LAST:"%5.0lf \n"  \
AREA:cpu4#f4f400:"CPU Lording(%)        "  \
GPRINT:cpu4:MAX:"%5.0lf"  \
GPRINT:cpu4:AVERAGE:"%5.0lf"  \
GPRINT:cpu4:MIN:"%5.0lf"  \
GPRINT:cpu4:LAST:"%5.0lf \n"  \
AREA:vmmused#339966:"Virtual Memory Use(%) " \
GPRINT:vmmused:MAX:"%5.0lf"  \
GPRINT:vmmused:AVERAGE:"%5.0lf"  \
GPRINT:vmmused:MIN:"%5.0lf"  \
GPRINT:vmmused:LAST:"%5.0lf \n"  \
AREA:pmused#FF0000:"Physical Memory Use(%)" \
GPRINT:pmused:MAX:"%5.0lf"  \
GPRINT:pmused:AVERAGE:"%5.0lf"  \
GPRINT:pmused:MIN:"%5.0lf"  \
GPRINT:pmused:LAST:"%5.0lf \n"  \
COMMENT:"\n"  \
COMMENT:"Last Updated $now"  \
-v "per second (%)" \
-w 550 -h 350
done

煩請您不吝指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-08-21 10:33
-s `date -d "-1 day" +%s`        \
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: peteryang2006-08-21 14:35
謝謝abelyang兄指導,原來小弟Copy錯了,謝謝abelyang的細心指教,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: runner9242006-09-06 14:19
abel兄
请问您用过opennms这个网管监控软件么,它里面的取性能数据,如硬盘,内存,流量。。还有画图好似用的就是rrdtool
您知道它们之间是怎么整合的吗,工作方式是什么
rrdtool在这里的主要功能是不是在采集数据,以文件方式存储,然后再自定义画图?

望解答,不甚感激 :oops: ,最近公司要研究一下网管opennms.我以前一直做web上的j2ee,对linux跟rrdtool不熟悉,不过对snmp,script还是比较熟
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-09-12 08:23
引述: "runner924"
abel兄
请问您用过opennms这个网管监控软件么,它里面的取性能数据,如硬盘,内存,流量。。还有画图好似用的就是rrdtool
您知道它们之间是怎么整合的吗,工作方式是什么
rrdtool在这里的主要功能是不是在采集数据,以文件方式存储,然后再自定义画图?

望解答,不甚感激 :oops: ,最近公司要研究一下网管opennms.我以前一直做web上的j2ee,对linux跟rrdtool不熟悉,不过对snmp,script还是比较熟

opennms 沒用過,但想也可以知道是以 snmp 的模式來進行監管
snmp 用於讀取數據,而 rrdtool 只用於儲存數據及畫圖而以
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: runner9242006-09-12 13:06
谢谢abel的回复
这个opennms这几天差不多搞明白了。
主要是snmp采集数据,用jni控制rrdtool储存,再画图显示。
对rrdtool的配置定义还是不太会用,在使用过程中如用问题,再过来请教。
谢谢指导^_^
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: Audi2006-10-25 13:52
引用
補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數,如上 COUNTER 例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值

請問 COUNTER/DERIVE/AVSOLVTE 會再除以 STEP 之間的秒數後儲存。我看官方的文件也是寫 "The counter is stored as a per-second rate."。如果我想要的值是不經過除以 STEP 的值的話,有何方法可行?是在畫圖時,使用 CDEF 功能乘上 STEP 值還原?

我的構想是使用 NTOP 監控,dump 其網路流量資料,對想要統計的某些 IP,畫出每小時每個 IP 使用的總流量 (NTOP 在 restart 後這些資料會 reset)。這樣就需要 current 流量值減去前一小時的流量值,但使用 COUNTER/DERIVE,會再除以 3600 (一小時之 STEP),這樣就不是我需要的值。

請問是否有其他技巧可行?我的想法是使用 CDEF 功能乘上 STEP 值還原。
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-10-25 14:42
引述: "audi"
引用
補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數,如上 COUNTER 例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值

請問 COUNTER/DERIVE/AVSOLVTE 會再除以 STEP 之間的秒數後儲存。我看官方的文件也是寫 "The counter is stored as a per-second rate."。如果我想要的值是不經過除以 STEP 的值的話,有何方法可行?是在畫圖時,使用 CDEF 功能乘上 STEP 值還原?

我的構想是使用 NTOP 監控,dump 其網路流量資料,對想要統計的某些 IP,畫出每小時每個 IP 使用的總流量 (NTOP 在 restart 後這些資料會 reset)。這樣就需要 current 流量值減去前一小時的流量值,但使用 COUNTER/DERIVE,會再除以 3600 (一小時之 STEP),這樣就不是我需要的值。

請問是否有其他技巧可行?我的想法是使用 CDEF 功能乘上 STEP 值還原。

你想不除秒數 update 時的數值 x step
主題: 很郁闷~
作者: sky200882006-10-30 11:20
配置完成后,无法显示图片,出现红色叉叉
看配置提示,是取不到数值,不知道为什么,是snmpd。conf配置的问题吗
下面是配置提示
Localhost (127.0.0.1)  
SNMP Information
System: Linux d3091 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686
Uptime: 26379805 (3 days, 1 hours, 16 minutes)
Hostname: d3091
Location: Unknown (edit /etc/snmp/snmpd.conf)
Contact: Root root@localhost (configure /etc/snmp/snmp.local.conf)
 
Location: Unknown是无法取道数值吧~
请协助一下,谢谢
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: sky200882006-10-30 18:41
同上,补充一下,下面是点叉图片(图片无法显示)的小调试扳手,出现如下信息
/usr/local/bin/rrdtool graph - \
--imgformat=PNG \
--start=1162118701 \
--end=1162205101 \
--title="Localhost - Memory Usage" \
--rigid \
--base=1000 \
--height=120 \
--width=500 \
--alt-autoscale-max \
--lower-limit=0 \
COMMENT:"From 2006/10/29 18:45:01 To 2006/10/30 18:45:01\c" \
COMMENT:"  \n" \
--vertical-label="kilobytes" \
DEF:a="/usr/local/http/htdocs/catct/rra/localhost_mem_buffers_3.rrd":mem_buffers:AVERAGE \
CDEF:cdefa=a,1024,* \
CDEF:cdefe=a,1024,* \
AREA:cdefa#FF4105:"Free"  \
GPRINT:cdefa:LAST:"Current\:%8.2lf %s"  \
GPRINT:cdefa:AVERAGE:"Average\:%8.2lf %s"  \
GPRINT:cdefa:MAX:"Maximum\:%8.2lf %s\n"  \
STACK:cdefe#FFC73B:"Swap"  \
GPRINT:cdefe:LAST:"Current\:%8.2lf %s"  \
GPRINT:cdefe:AVERAGE:"Average\:%8.2lf %s"  \
GPRINT:cdefe:MAX:"Maximum\:%8.2lf %s"
请问无法显示图片,也是无法取得数据吧,不知道什么原因
请协助分析一下,多谢一直等候&&
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-10-31 08:42
您是大陸來的吧!!
"请协助分析一下,多谢一直等候&&"
看到這句話這邊恐怕就沒有多少人願意幫你
由 php/cgi 畫圖畫不出來都多是權限的問題
不然你手動執行那個 command 也不就知道是不是語法的錯誤 ?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: yfang2006-11-25 11:10
我使用HotSaNIC,自己寫了一個module
可是數據有時候變化很厲害,有時候又變化很小
我用RRD::graph作圖的時候參數不是很熟悉,我想控制一下縂軸的grid
基本上就是達到任何時候都有縱坐標綫
看到MAN中提到一個參數-Y,使用之後果然有了,不過精度默認的是:%.1lf
我看到的圖片裏顯示的是四捨五入后的值(因爲這個時候變化比較小),很多數值都是一樣的
我想提高精度顯示兩位或者三位小數,請問怎麽做?
有一個-y參數,猜想應該是這個,不過後面的格式不太會寫。

希望大家指點,多謝。 8)
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-11-27 13:15
看不懂,有個圖,然後再舉例說明看看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: yfang2006-11-27 14:28
是這樣的,如果沒有加-Y參數,顯示結果是這樣的
(http://www.yfang.cn/tmp/default_site-hour_no_y.gif)
(http://www.yfang.cn/tmp/default_site-6h_no_y.gif)
加上-Y參數后顯示結果如下
(http://www.yfang.cn/tmp/default_site-hour.gif)
(http://www.yfang.cn/tmp/default_site-6h.gif)
我希望得到後面的y-grid,可是不想看到相等的y值,所以考慮提高精度
不知道怎麽設定,希望您多多指教
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-11-27 14:34
你用 -X 試試
若不行請多看看 -Y + -X 用法
詳情看
http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: yfang2006-11-28 10:37
非常感謝大大的熱心回復
那篇rrdtool的doc以前看過的,就是這個裏面的-y參數看不懂使用方法才來這裡求教的
我試用過"-X", "M", "-Y"
看上去圖片如下
(http://www.yfang.cn/tmp/default_site-hour-X-Y.gif)
這樣使用有兩個問題
第一,因爲我的數據量大小不定,如果制定好M或者K都不合适,會造成一部分圖沒有識別度或者識別度過細
第二,這樣表示數據,黨數據比較大的時候會看到很長的一個數字,導致視覺效果比較差
我還是希望能夠通過精度控制,比如保留兩位或者三位小數
希望大大指點,謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2006-11-28 10:43
這我就不明白了,如果你的數字經常是 4710000 左右,如果一個大的落差到 1 , 那不管怎麼看一定會 "導致視覺效果比較差"
這個用參數是無法解決的,一定要用 CDEF,透過適當的計算及色差來標示
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: twu22006-12-15 20:23
前幾個星期, 我家的 Debian 把  RRDTool 由 1.2.11 升到 1.2.15, 結果發現使用這兒的中文化的 patch 沒有效果.

今天特定花了一些時間看了一下, 發現在 rrd_gfx.c 的 patch 多此一舉, 因為原本的程式就有做相同的事情. 所以... 加上 patch, 也只是做一樣的事情. 也就是基本上在 1.2.1x 上頭, 就應該能正確的畫出中文才對. (1.2.11 之前的 source 沒看, 不太確定, 不過看原本的 1.2.8 的 patch, 似乎也是有才對)

而這次造成原本的功能不能用 (或者說原本的 patch 不能用), 是因為在 rrd_graph.c 中, 在原本最後的 setlocale() 之後, 再加上了一個 setlocale(LC_CTYPE, ""), 造成中文會變成亂碼.

我們只要把這個 setlocale() 拿掉, 加上一個 setlocale(LC_ALL, "zh_TW.UTF-8") 或 setlocale(LC_ALL, "en_US.UTF-8") 就可以了. 以我個人來說, 比較喜歡用 en_US.UTF-8, 因為時間日期還是習慣用英文格式的.

patch 可以參考: http://blog.teatime.com.tw/post/1/168
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: gabril2007-05-09 16:03
引用
所以,若我們再看一個例子
代碼:

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 ,為什麼就看您的理解囉


我不是很明白如何得到这个结果所以写了脚本测试,结果跟是迷茫希望赐教下。
代碼: [選擇]
#!/usr/bin/perl -w

my $timestamp=`date  +%s`;
chomp $timestamp;
`rrdtool create sample.rrd -s 600 -b $timestamp DS:DS1:COUNTER:6000:0:100 RRA:MAX:0.5:5:1000`;
my @array = (1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100);

for ( my $i = 0;$i < 19;$i++){
$timestamp+=600;
print "rrdtool update sample.rrd  $timestamp:$array[$i]\n" ;
`rrdtool update sample.rrd  $timestamp:$array[$i]` ;

}
`rrdtool xport DEF:DS1=sample.rrd:DS1:MAX XPORT:DS1:MAX>sample.xml`;



代碼: [選擇]

<?xml version="1.0" encoding="ISO-8859-1"?>

<xport>
  <meta>
    <start>1178610000</start>
    <step>3000</step>
    <end>1178697000</end>
    <rows>30</rows>
    <columns>1</columns>
    <legend>
      <entry>MAX</entry>
    </legend>
  </meta>
  <data>
    <row><t>1178610000</t><v>NaN</v></row>
    <row><t>1178613000</t><v>NaN</v></row>
    <row><t>1178616000</t><v>NaN</v></row>
    <row><t>1178619000</t><v>NaN</v></row>
    <row><t>1178622000</t><v>NaN</v></row>
    <row><t>1178625000</t><v>NaN</v></row>
    <row><t>1178628000</t><v>NaN</v></row>
    <row><t>1178631000</t><v>NaN</v></row>
    <row><t>1178634000</t><v>NaN</v></row>
    <row><t>1178637000</t><v>NaN</v></row>
    <row><t>1178640000</t><v>NaN</v></row>
    <row><t>1178643000</t><v>NaN</v></row>
    <row><t>1178646000</t><v>NaN</v></row>
    <row><t>1178649000</t><v>NaN</v></row>
    <row><t>1178652000</t><v>NaN</v></row>
    <row><t>1178655000</t><v>NaN</v></row>
    <row><t>1178658000</t><v>NaN</v></row>
    <row><t>1178661000</t><v>NaN</v></row>
    <row><t>1178664000</t><v>NaN</v></row>
    <row><t>1178667000</t><v>NaN</v></row>
    <row><t>1178670000</t><v>NaN</v></row>
    <row><t>1178673000</t><v>NaN</v></row>
    <row><t>1178676000</t><v>NaN</v></row>
    <row><t>1178679000</t><v>NaN</v></row>
    <row><t>1178682000</t><v>NaN</v></row>
    <row><t>1178685000</t><v>NaN</v></row>
    <row><t>1178688000</t><v>NaN</v></row>
    <row><t>1178691000</t><v>NaN</v></row>
    <row><t>1178694000</t><v>NaN</v></row>
    <row><t>1178697000</t><v>1.6666666667e-03</v></row>
  </data>
</xport>


为什么是三十笔不应该是取1000笔的么,1。666。。如何取到的阿。迷茫阿
rrdtool info sample.rrd 的信息是
代碼: [選擇]

filename = "sample.rrd"
rrd_version = "0003"
step = 600
last_update = 1178705986
ds[DS1].type = "COUNTER"
ds[DS1].minimal_heartbeat = 6000
ds[DS1].min = 0.0000000000e+00
ds[DS1].max = 1.0000000000e+02
ds[DS1].last_ds = "100"
ds[DS1].value = 9.7666666667e+00
ds[DS1].unknown_sec = 0
rra[0].cf = "MAX"
rra[0].rows = 1000
rra[0].pdp_per_row = 5
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = 1.6666666667e-02
rra[0].cdp_prep[0].unknown_datapoints = 0

主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2007-05-09 16:21
引述: "gabril"
引用
所以,若我們再看一個例子
代碼:

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 ,為什麼就看您的理解囉


我不是很明白如何得到这个结果所以写了脚本测试,结果跟是迷茫希望赐教下。
代碼: [選擇]
#!/usr/bin/perl -w

my $timestamp=`date  +%s`;
chomp $timestamp;
`rrdtool create sample.rrd -s 600 -b $timestamp DS:DS1:COUNTER:6000:0:100 RRA:MAX:0.5:5:1000`;
my @array = (1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100);

for ( my $i = 0;$i < 19;$i++){
$timestamp+=600;
print "rrdtool update sample.rrd  $timestamp:$array[$i]\n" ;
`rrdtool update sample.rrd  $timestamp:$array[$i]` ;

}
`rrdtool xport DEF:DS1=sample.rrd:DS1:MAX XPORT:DS1:MAX>sample.xml`;



代碼: [選擇]

<?xml version="1.0" encoding="ISO-8859-1"?>

<xport>
  <meta>
    <start>1178610000</start>
    <step>3000</step>
    <end>1178697000</end>
    <rows>30</rows>
    <columns>1</columns>
    <legend>
      <entry>MAX</entry>
    </legend>
  </meta>
  <data>
    <row><t>1178610000</t><v>NaN</v></row>
    <row><t>1178613000</t><v>NaN</v></row>
    <row><t>1178616000</t><v>NaN</v></row>
    <row><t>1178619000</t><v>NaN</v></row>
    <row><t>1178622000</t><v>NaN</v></row>
    <row><t>1178625000</t><v>NaN</v></row>
    <row><t>1178628000</t><v>NaN</v></row>
    <row><t>1178631000</t><v>NaN</v></row>
    <row><t>1178634000</t><v>NaN</v></row>
    <row><t>1178637000</t><v>NaN</v></row>
    <row><t>1178640000</t><v>NaN</v></row>
    <row><t>1178643000</t><v>NaN</v></row>
    <row><t>1178646000</t><v>NaN</v></row>
    <row><t>1178649000</t><v>NaN</v></row>
    <row><t>1178652000</t><v>NaN</v></row>
    <row><t>1178655000</t><v>NaN</v></row>
    <row><t>1178658000</t><v>NaN</v></row>
    <row><t>1178661000</t><v>NaN</v></row>
    <row><t>1178664000</t><v>NaN</v></row>
    <row><t>1178667000</t><v>NaN</v></row>
    <row><t>1178670000</t><v>NaN</v></row>
    <row><t>1178673000</t><v>NaN</v></row>
    <row><t>1178676000</t><v>NaN</v></row>
    <row><t>1178679000</t><v>NaN</v></row>
    <row><t>1178682000</t><v>NaN</v></row>
    <row><t>1178685000</t><v>NaN</v></row>
    <row><t>1178688000</t><v>NaN</v></row>
    <row><t>1178691000</t><v>NaN</v></row>
    <row><t>1178694000</t><v>NaN</v></row>
    <row><t>1178697000</t><v>1.6666666667e-03</v></row>
  </data>
</xport>


为什么是三十笔不应该是取1000笔的么,1。666。。如何取到的阿。迷茫阿
rrdtool info sample.rrd 的信息是
代碼: [選擇]

filename = "sample.rrd"
rrd_version = "0003"
step = 600
last_update = 1178705986
ds[DS1].type = "COUNTER"
ds[DS1].minimal_heartbeat = 6000
ds[DS1].min = 0.0000000000e+00
ds[DS1].max = 1.0000000000e+02
ds[DS1].last_ds = "100"
ds[DS1].value = 9.7666666667e+00
ds[DS1].unknown_sec = 0
rra[0].cf = "MAX"
rra[0].rows = 1000
rra[0].pdp_per_row = 5
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = 1.6666666667e-02
rra[0].cdp_prep[0].unknown_datapoints = 0


我建議您再把 COUNTER 和 RRA 特性再看一下,
1.66..e-03 就是 0.00166...
能理解是最重要的
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: gabril2007-05-09 16:45
非常感谢,您说的1.6666666667e-02这个我明白,我问题是为什么只有一个值,不是应该有3个值么,那个1.66。。。我刚刚明白,是不是拿最大的差值除以step 600?
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: gabril2007-05-09 16:53
代碼: [選擇]
filename = "sample.rrd"
rrd_version = "0003"
step = 600
last_update = 1178705986
ds[DS1].type = "COUNTER"
ds[DS1].minimal_heartbeat = 6000
ds[DS1].min = 0.0000000000e+00
ds[DS1].max = 1.0000000000e+02
ds[DS1].last_ds = "100"
ds[DS1].value = 9.7666666667e+00
ds[DS1].unknown_sec = 0
rra[0].cf = "MAX"
rra[0].rows = 1000
rra[0].pdp_per_row = 5
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = 1.6666666667e-02
rra[0].cdp_prep[0].unknown_datapoints = 0

这个ds[DS1].value = 9.7666666667e+00是如何出现的,并被计算的阿?
附上我的update log
代碼: [選擇]

rrdtool update sample.rrd  1178695186:1
rrdtool update sample.rrd  1178695786:2
rrdtool update sample.rrd  1178696386:3
rrdtool update sample.rrd  1178696986:4
rrdtool update sample.rrd  1178697586:5
rrdtool update sample.rrd  1178698186:6
rrdtool update sample.rrd  1178698786:7
rrdtool update sample.rrd  1178699386:8
rrdtool update sample.rrd  1178699986:9
rrdtool update sample.rrd  1178700586:10
rrdtool update sample.rrd  1178701186:20
rrdtool update sample.rrd  1178701786:30
rrdtool update sample.rrd  1178702386:40
rrdtool update sample.rrd  1178702986:50
rrdtool update sample.rrd  1178703586:60
rrdtool update sample.rrd  1178704186:70
rrdtool update sample.rrd  1178704786:80
rrdtool update sample.rrd  1178705386:90
rrdtool update sample.rrd  1178705986:100
[/code]
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: gabril2007-05-09 16:54
代碼: [選擇]
filename = "sample.rrd"
rrd_version = "0003"
step = 600
last_update = 1178705986
ds[DS1].type = "COUNTER"
ds[DS1].minimal_heartbeat = 6000
ds[DS1].min = 0.0000000000e+00
ds[DS1].max = 1.0000000000e+02
ds[DS1].last_ds = "100"
ds[DS1].value = 9.7666666667e+00
ds[DS1].unknown_sec = 0
rra[0].cf = "MAX"
rra[0].rows = 1000
rra[0].pdp_per_row = 5
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = 1.6666666667e-02
rra[0].cdp_prep[0].unknown_datapoints = 0

这个ds[DS1].value = 9.7666666667e+00是如何出现的,并被计算的阿?
附上我的update log
代碼: [選擇]

rrdtool update sample.rrd  1178695186:1
rrdtool update sample.rrd  1178695786:2
rrdtool update sample.rrd  1178696386:3
rrdtool update sample.rrd  1178696986:4
rrdtool update sample.rrd  1178697586:5
rrdtool update sample.rrd  1178698186:6
rrdtool update sample.rrd  1178698786:7
rrdtool update sample.rrd  1178699386:8
rrdtool update sample.rrd  1178699986:9
rrdtool update sample.rrd  1178700586:10
rrdtool update sample.rrd  1178701186:20
rrdtool update sample.rrd  1178701786:30
rrdtool update sample.rrd  1178702386:40
rrdtool update sample.rrd  1178702986:50
rrdtool update sample.rrd  1178703586:60
rrdtool update sample.rrd  1178704186:70
rrdtool update sample.rrd  1178704786:80
rrdtool update sample.rrd  1178705386:90
rrdtool update sample.rrd  1178705986:100
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2007-05-09 17:05
引述: "gabril"
代碼: [選擇]
filename = "sample.rrd"
rrd_version = "0003"
step = 600
last_update = 1178705986
ds[DS1].type = "COUNTER"
ds[DS1].minimal_heartbeat = 6000
ds[DS1].min = 0.0000000000e+00
ds[DS1].max = 1.0000000000e+02
ds[DS1].last_ds = "100"
ds[DS1].value = 9.7666666667e+00
ds[DS1].unknown_sec = 0
rra[0].cf = "MAX"
rra[0].rows = 1000
rra[0].pdp_per_row = 5
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = 1.6666666667e-02
rra[0].cdp_prep[0].unknown_datapoints = 0

这个ds[DS1].value = 9.7666666667e+00是如何出现的,并被计算的阿?
附上我的update log
代碼: [選擇]

rrdtool update sample.rrd  1178695186:1
rrdtool update sample.rrd  1178695786:2
rrdtool update sample.rrd  1178696386:3
rrdtool update sample.rrd  1178696986:4
rrdtool update sample.rrd  1178697586:5
rrdtool update sample.rrd  1178698186:6
rrdtool update sample.rrd  1178698786:7
rrdtool update sample.rrd  1178699386:8
rrdtool update sample.rrd  1178699986:9
rrdtool update sample.rrd  1178700586:10
rrdtool update sample.rrd  1178701186:20
rrdtool update sample.rrd  1178701786:30
rrdtool update sample.rrd  1178702386:40
rrdtool update sample.rrd  1178702986:50
rrdtool update sample.rrd  1178703586:60
rrdtool update sample.rrd  1178704186:70
rrdtool update sample.rrd  1178704786:80
rrdtool update sample.rrd  1178705386:90
rrdtool update sample.rrd  1178705986:100

last_update = 1178705986
你把 -s 的時間對齊 600 秒再來看看
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: chenglee2007-07-24 19:21
Dear abelyang and 各位大大:
拜讀完上述文章後,想要將自己環境每天的AP transations數量繪製成圖表,但因trx數量來源為每日統計一次,故想法是一日餵一次資料給rrdtool,所寫的create指令如下:
代碼: [選擇]
rrdtool create "trx.rrd" --start 1184688000 --step 86400 DS:count:GAUGE:172800:0:999999 RRA:AVERAGE:0.5:1:365
其中start time 1184688000 為 Wed Jul 18 00:00:00 CST 2007
      86400為一日之總秒數
但我以rrdtoo updatev指令,欲每日00:00更新data..
所下的指令如
代碼: [選擇]
rrdtool updatev trx.rrd 1184774400:1234
其中所下的1184774400更新時間為 Thu Jul 19 00:00:00 CST 2007
可是show出來的訊息卻是[AVERAGE][1]DS[12A] = 1.2340000000e+03
[/list] 其中時間戳記1184716800為Wed Jul 18 08:00:00 CST 2007

再一直以每日00:00的時間下去更新,但所回覆的訊息還是都是每日8點~~
rrdtool fetch --start 建檔時間戳記 --end now 裡的時間也都是每日8點~~
所以畫出的圖也當然爾都是每日8點資料量才會變動....

但我想做到的是一天當中的圖都是水平線而資料變動就是每日的00:00時間點...

想請問我有哪個地方做錯了~或是哪裡觀念錯誤了嗎?
還煩請各位指導...謝謝
主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
作者: abelyang2007-07-24 22:23
引述: "chenglee"
Dear abelyang and 各位大大:
拜讀完上述文章後,想要將自己環境每天的AP transations數量繪製成圖表,但因trx數量來源為每日統計一次,故想法是一日餵一次資料給rrdtool,所寫的create指令如下:
代碼: [選擇]
rrdtool create "trx.rrd" --start 1184688000 --step 86400 DS:count:GAUGE:172800:0:999999 RRA:AVERAGE:0.5:1:365
其中start time 1184688000 為 Wed Jul 18 00:00:00 CST 2007
      86400為一日之總秒數
但我以rrdtoo updatev指令,欲每日00:00更新data..
所下的指令如
代碼: [選擇]
rrdtool updatev trx.rrd 1184774400:1234
其中所下的1184774400更新時間為 Thu Jul 19 00:00:00 CST 2007
可是show出來的訊息卻是
    return_value = 0
    [1184716800]RRA
[AVERAGE][1]DS[12A] = 1.2340000000e+03
[/list] 其中時間戳記1184716800為Wed Jul 18 08:00:00 CST 2007

再一直以每日00:00的時間下去更新,但所回覆的訊息還是都是每日8點~~
rrdtool fetch --start 建檔時間戳記 --end now 裡的時間也都是每日8點~~
所以畫出的圖也當然爾都是每日8點資料量才會變動....

但我想做到的是一天當中的圖都是水平線而資料變動就是每日的00:00時間點...

想請問我有哪個地方做錯了~或是哪裡觀念錯誤了嗎?
還煩請各位指導...謝謝

+0800 問題
你自己再想想看, 用力想哦, 對你自己會有幫助的