监控cacti中的RRDtool用法详解
RRDtool
作為一個合格的運(yùn)維工程師,監(jiān)控技能必須是要掌握的,當(dāng)然監(jiān)控的軟件很多很多(cacti,nagios,zabbix...)。而生產(chǎn)環(huán)境中一般只運(yùn)用1、2種而已。所以全部掌握這些有點不靠譜。所以選擇其中一種掌握之即可,當(dāng)工作環(huán)境變化后還可以以之為跳板進(jìn)行別的監(jiān)控的學(xué)習(xí)。。。
筆者不記得什么時候收集的rrdtool的用法了,所以參考的地址也不能貼出來了。忘原作者看到相似的地方見諒。
筆者老師為馬哥教育的馬老師。這篇文章也參考了其講課視頻。大家可以通過鏈接到馬哥那觀看其cacti視頻。
一、建立RRD數(shù)據(jù)庫(.rrd文件)
rrdtool [options] command command_options
而commands包括:
create, update, updatev, graph, dump, restore,last, first, info, fetch, tune, resize, xport
這一講我們將著重介紹一下creat命令的使用
| 123456 | rrdtool create filename[--start|-b start time][--step|-s step][DS:ds-name:DST:heartbeat:min:max]// DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max[RRA:CF:xff:steps:rows] |
我們用一個例子對整個語法進(jìn)行解釋(以下都用這個例子說明參數(shù)的使用):
| 123456 | rrdtool create target.rrd--start 1023654125--step 300DS:mem:GAUGE:600:0:671744RRA:AVERAGE:0.5:12:24RRA:AVERAGE:0.5:288:31 |
簡單的先說吧:
create 很容易理解,就是創(chuàng)建一個新的Round Robin Database (RRD) 數(shù)據(jù)庫文件以存儲信息。
filename習(xí)慣上會以 .rrd 結(jié)尾,請記住這個數(shù)據(jù)庫文件的名字。
--start 這個參數(shù)可以指定 filename 的數(shù)據(jù)記錄起始日期,你可以指定為 1970 年至今的秒數(shù)(參數(shù)為-b `date -d "1970/01/01" +%s`),如果你不指定,那么起始時間默認(rèn)就是現(xiàn)在。
--step 采集數(shù)據(jù)的間隔時間,習(xí)慣上我們會設(shè) 300 (秒),當(dāng)然你可以自行調(diào)整,這也是RRD的優(yōu)勢所在。但是采集周期不應(yīng)該過短也不應(yīng)小于你的update rrd文件周期,否則可能會造成服務(wù)器負(fù)載過重。
后面兩個參數(shù)需要慢慢理解,我把語法和例子拿下來對比一下,大家就可能明白了。
[DS:ds-name:DST:heartbeat:min:max]
// DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
對比例子
DS:mem:GAUGE:600:0:671744
下面以例子來說明:
DS:用來聲明數(shù)據(jù)源的,也可以理解為聲明數(shù)據(jù)變量的關(guān)鍵字。這個是必須寫的,不能按照你的意愿修改成其他表述方式。
DS-NAME:變量名,可以理解為你給這個數(shù)據(jù)源起的助記符(簡稱DSN)。當(dāng)每一個刷新周期到來的時候,數(shù)據(jù)文檔中各變量對應(yīng)的值就會被更新。這個變量對應(yīng)的值在官方文檔中也叫做主要數(shù)據(jù)點――PDP(Primary Data Point)。
DST:DS的類型,通常有:GAUGE, COUNTER, DERIVE, 和ABSOLUTE 四種,下面依次介紹:
GAUGE:
我們用的最多的就是GAUGE了,它的中文解釋是:測量。在這里它表示實際的值。比如說輸入次序為98 100 98,那么輸出順序也是98 100 98。
COUNTER:
累計值,自己進(jìn)行計算,比如說輸入次序為98 100 98,那么輸出順序也是2 -2,怎么出來的這兩個數(shù)值呢?100-98 98-100,其實就是兩個差值,它表示的是經(jīng)過一個刷新周期的變化率。
DERIVE:
也是累計值,和COUNTER一樣的,唯一不同的是它不存在負(fù)值,最小的是0,不如-2那么它就只劃0,結(jié)果為 2 0
ABSOLUTE:
如同COUNTER,但COUNTER可能overflow(數(shù)值過大),所以會取絕對值
補(bǔ)充:COUNTER/DERIVE/AVSOLVTE 雖然都是取差值,但會再除以兩次間隔間的秒數(shù)。
例,兩次間隔間為300秒,那畫出來的就是 2/300,-2/300 的值
再給出一個例子幫助大家理解:
Values = 300, 600, 900, 1200 實際值輸入值(每隔300S輸入一個)
Step = 300 seconds 刷新周期
COUNTER DS = 1, 1, 1, 1 COUNTER定義的DS的值
DERIVE DS = 1, 1, 1, 1 DERIVE定義的DS的值
ABSOLUTE DS = 1, 2, 3, 4 ABSOLUTE定義的DS的值
GAUGE DS = 300, 600, 900, 1200 GAUGE定義的DS的值
heartbeat 心跳有效期
比如在例子中,我們定義了心跳有效時間是600秒,也就是兩個刷新周期。舉個例子,在12點的時候沒有產(chǎn)生數(shù)據(jù),那么前后300S(共600S)的平均值就 會繪成12點的值,但如果在兩個刷新周期內(nèi),都沒有接收到數(shù)據(jù)更新,那么這個時候,必須往數(shù)據(jù)文檔中寫入一個(UN)UNKNOWN值。這是 ?RRDTool的一個特別的地方。要知道MRTG在處理網(wǎng)絡(luò)中斷的時候,記錄的是0值。這個0和UN還是有一定區(qū)別的。
min:max 記錄數(shù)據(jù)的最小值和最大值
DS數(shù)值的有效范圍,超出就是UN嘍。也可以寫成 U:U 代表不限范圍。
小技巧:將數(shù)據(jù)源建立方式記為 "三文字,三數(shù)字"
DS講完了就該講RRA了,那么什么是RRA呢?
RRA: 更簡單,它的作用就是定義更新的數(shù)據(jù)是如何記錄的,RRA 即 Round Robin Archive,Archive是什么,存檔。比如我們每5分鐘 產(chǎn)生一條刷新的數(shù)據(jù),那么一個小時就是12條。每天就是288條。這么龐大的數(shù)據(jù)量,一定不可能都存下來。肯定有一個合并(consolidate)數(shù)據(jù) 的方式,那么這個就是RRA的作用了。
下面具體介紹怎么應(yīng)用RRA:
使用方法:RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
RRA:用以聲明RRAs的關(guān)鍵字
CF:consolidation function 合并方式,包含四類:
AVERAGE, MIN,MAX, LAST //平均值,最大值,最小值,最后一筆
上面說過了,經(jīng)過一個刷新周期,會獲得一個主數(shù)據(jù)點(PDP),將若干個PDPs使用合并方式(CF)合并后會產(chǎn)生一個合并數(shù)據(jù)點CDP(consolidated data point)。
xff:xfiles factor 和unkown數(shù)據(jù)有關(guān),很多資料都取0.5
step:有step條PDP合并形成一條CDP
row:記錄的合并數(shù)據(jù)點CDP條數(shù)
我們在例子中對RRA是這樣定義的:
RRA:AVERAGE:0.5:12:24 //1天
RRA:AVERAGE:0.5:288:31 //1月
對于第一個RRA,12條的PDP(每經(jīng)過一個刷新周期產(chǎn)生一個PDP)經(jīng)過CFed(AVERAGE),也就是取平均值,產(chǎn)生一個CDP,24個 ?CDPs存檔。我們一起來計算一下時間,如果一個周期是300秒,那么12個PDP的產(chǎn)生時間就是一個小時,也就是一個小時產(chǎn)生一個CDP。24個 ?CDPs時間就是一天。說明這條通過這條RRA,我們可以取得一天的數(shù)據(jù)值。一天后,又經(jīng)過一個小時。就會產(chǎn)生第25條,那么如何記錄這個第25條數(shù)據(jù) 呢?根據(jù)我們這個RRA的定義,它將會替代第一條CDP的位置。
實例(檢測某核心交換的端口)(create_nic_7609.sh)
/usr/local/rrd/bin/rrdtool create /www/rrd/NIC_7609.rrd -s 300 \
DS:ifInOctets1:COUNTER:600:U:U \
DS:ifInOctets2:COUNTER:600:U:U \
DS:ifInOctets9:COUNTER:600:U:U \
DS:ifInOctets11:COUNTER:600:U:U \
DS:ifInOctets14:COUNTER:600:U:U \
DS:ifInOctets53:COUNTER:600:U:U \
DS:ifOutOctets1:COUNTER:600:U:U \
DS:ifOutOctets2:COUNTER:600:U:U \
DS:ifOutOctets9:COUNTER:600:U:U \
DS:ifOutOctets11:COUNTER:600:U:U \
DS:ifOutOctets14:COUNTER:600:U:U \
DS:ifOutOctets53:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:4800 \
RRA:AVERAGE:0.5:6:2400 \
RRA:AVERAGE:0.5:24:1200 \
RRA:AVERAGE:0.5:288:600 \
RRA:MAX:0.5:1:4800 \
RRA:MAX:0.5:6:2400 \
RRA:MAX:0.5:24:1200 \
RRA:MAX:0.5:288:600
我們舉例來看
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
解釋一下,首先你要記得step我們設(shè)置為300秒,那么
0.5:1:603
因為我們將step設(shè)置為300秒,若原計算時間點為12:00,記錄時11:57:30~12:02:30的平均值為主,這個值若在此時間點內(nèi)只有一筆資料的話,其意即是平均值,所以此一值即表共要記錄幾筆,603是指要存603筆,超過603筆,則最早一筆將被移出。
0.5:6:603 僅就6解釋,取6筆資料(每筆為step值,在此意即5分鐘)為平均值( 30 分鐘), 存 603 筆
0.5:24:603 24 即2小時
0.5:288:800 288 即1天
請注意,不是0.5:1:603中的1 就是五分鐘,這個是依據(jù)你的--step值而定,如果--step 3600,那0.5:6:603這一行就是六小 時合起來的平均值了。若將 AVERAGE 換成MIN/MAX 的意義則是取該時間點中 (如上例之5min/30min/2hr..)之最大值或最小 值,而通常在監(jiān)測系統(tǒng)時最大值與平均值是比較有實際意義的。下面這個圖來幫助你記憶。
RRA:MIN:0.5:1:600 \
RRA:MIN:0.5:6:700 \
RRA:MIN:0.5:24:775 \
RRA:MIN:0.5:288:797 //一般可按cacti標(biāo)準(zhǔn)取值
第二講:rrd數(shù)據(jù)的更新(update)
在創(chuàng)建好文檔后,我們要用程序定時更新數(shù)據(jù)文檔(.rrd)然后才能根據(jù)數(shù)據(jù)文檔畫圖。以采集核心交換流量為例,首先我們要抓到各端口的流量,可以通過 ?snmp協(xié)議來取得數(shù)據(jù)。如果你機(jī)器上沒有snmp,那么安裝最新的net-snmp包(PS:被監(jiān)控端一般上安裝的是net-snmp, 監(jiān)控端安裝的是net-snmp-utils,當(dāng)然,如果你需要被監(jiān)控端添加通知故障功能的話,也需要安裝net-snmp),安裝完成后測試snmp,在提示符下鍵入:
| 12345678910 | $ snmpwalkNo hostname specified.Usage: snmpwalk [options...] <hostname> {<community>} [<objectID>]UCD-snmp version: 5.1.2-h thishelp message.-H Display configuration file directives understood.-V display version number.-v 1|2c|3specifies snmp version to use.SNMP Version 1or 2c specific…… |
出現(xiàn)以上信息表示net-snmp安裝成功。
snmp的使用:
# snmpwalk -v 2c 核心交換IP地址 設(shè)備的community_string OID
具體的snmp用法及系統(tǒng)默認(rèn)的OID還有Shell文件的執(zhí)行方法可參考 cacti 中文論壇 的相關(guān)文檔,這里我就不廢話了。我們這一講將主要說說如何更新rrd文件信息。
語法:
| 1 | rrdtool{update|updatev} filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] ...] |
例如:
$ rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
上面的 1061811856 即時間值,如果就是要現(xiàn)在的時間值,可以 N 代表,但要轉(zhuǎn)換成秒值,通常我們都會用
$ timestamp=`date +%s `
來轉(zhuǎn)現(xiàn)在秒數(shù),如果是某些特定時間,則可以
$ timestamp=`date -d "2003/08/15 12:00" +%s`
后面跟著所有的更新的數(shù)據(jù),按照DS定義的順序用冒號格開。
關(guān)于更新的數(shù)據(jù)需要你寫個小程式取數(shù)據(jù),或用snmpget/snmpwalk抓資料來做rrdtool update,然后用crontab根據(jù)你在rrdtool create 時的step決定執(zhí)行的時間點。這里就應(yīng)該用到shell的知識了,最常見的就是用Shell的正則表達(dá)式過濾通過 snmp取得的信息
我們看到了,通過snmp取得的核心交換的信息是非常之多的,這些信息當(dāng)然不可能都用到,我們要從中選取我們要的信息。我們使用正則表達(dá)式對字符流進(jìn)行過濾并排列成我們需要的方式。
對于正則表達(dá)式,這里不做解釋,大家可以通過參考一些書輔助一些例子學(xué)習(xí)。
我們要取得的是端口的流入和流出的數(shù)據(jù),所以我們使用snmp中的兩個選項:ifInOctets和ifOutOctets 。分別對應(yīng)的是端口的流入流量和流出流量。
特別地,對于采集100M及其以下的端口流量,這兩個參數(shù)是完全正確的,但是如果是1000M的端口,就會出現(xiàn)流量和實際值相差甚遠(yuǎn)。在查過很多資料后發(fā) 現(xiàn),原因是這樣方式的計數(shù)模式,計數(shù)字長為32bit,如果采集1000M端口數(shù)據(jù)會發(fā)生數(shù)據(jù)溢出。我們要使用64bit的字長來計數(shù)。所以我們應(yīng)該選用 的OID參數(shù)為:ifHCInOctets和ifHCOutOctets。
讓我們來看個例子
RRD_FILE=/www/rrd/NIC_7609.rrd (.rrd數(shù)據(jù)文檔的位置)
sec=300 //睡眠時間,也就是采集周期
while [ 1 ] //用一個循環(huán)
do
rrd_data="" //下面實際用到的是正則表達(dá)式的串拼接
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.1 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.2 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.9 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.11 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.14 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCInOctets |grep ".*ifHCInOctets.53 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.1 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.2 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.9 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.11 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.14 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' ':'`
rrd_data =$rrd_data`snmpwalk -v 2c IP地址 -c snmp團(tuán)體名 ?ifHCOutOctets |grep ".*ifHCOutOctets.53 = " | sed -e 's/.*: \(.*\)$/\1/'| tr '\n' '\0'`
now=`date +%s` //當(dāng)前時間距離1970的秒數(shù)
/usr/local/rrd/bin/rrdtool update $RRD_FILE $now:${rrd_data} //調(diào)用更新指令
sh ./NIC_7609_Graph.sh //調(diào)用繪圖腳本畫圖,下面一節(jié)就介紹
sleep $sec //休息,等待下一個周期的到來
done //循環(huán)體結(jié)束
[補(bǔ)充]如果你得到了如下提示:
IF-MIB::ifHCInOctets = No Such Object available on this agent at this OID
有可能你的網(wǎng)卡是100M,那么就用ifOutOctets來測試就可以了。
rrdtool第三講:畫圖
畫圖的語法很多,我只把最有用的列出來,有興趣的朋友可以到官方網(wǎng)站上去查Manual。
方法:rrdtool graph p_w_picpath-filename,參數(shù)介紹如下
p_w_picpath-filename:圖的文件名,比如test.png等
[-s|--start seconds]:繪圖起始時間,預(yù)設(shè)是一天前(-1d),可用-s `date …`來指定時間
[-e|--end time]:繪圖結(jié)束時間, 預(yù)設(shè)是現(xiàn)在(now),除date 的應(yīng)用外,可用 -e -1w 表示繪圖的時間結(jié)束于一周前
[-t|--title title]:圖上顯示的標(biāo)題
[-v|--vertical-label text]:Y軸上的說明文字
[-w|--width pixels]:繪圖區(qū)域,畫圖區(qū)寬的大小
[-h|--height pixels]:繪圖區(qū)域,畫圖區(qū)高的大小
-u:Y軸正值高度
-l:Y軸負(fù)值高度
--no-minor 不要副格線
DEF(Define):就是定義一個變量
語法:
DEF:vname=rrd_filename:DS_name:CF
用如下表示更清楚一些
DEF:vname=rrd_filename:DS_name:[AVERAGE|MAX..]
主要用處在于您要取出哪個 RRD 檔案的 DSN 到這個 graph 來。
從上很容易看出,你要定義一個虛擬的變量,變量從(.rrd)數(shù)據(jù)文件中取得數(shù)據(jù)源(DS)經(jīng)過數(shù)據(jù)合并(CF)后的數(shù)據(jù)。看到這里,大家應(yīng)該知道,前面在定義文檔中為什么有那么多的參數(shù),其實都是為了繪圖做準(zhǔn)備的。
① vname:虛擬變量名,我們自己取的,以后還要用到。
② rrd_filename:DS_name:CF :數(shù)據(jù)文件(.rrd)的全路徑->數(shù)據(jù)源變量->合并方法。
舉個例子吧:DEF:in_bytes_1=$RRD_PATH:ifInOctets1:AVERAGE
然而,我們覺得光有記錄的數(shù)據(jù)源變量還是不夠的,我們希望這些數(shù)據(jù)源變量可以計算。比如我希望把某兩個端口的流量加在一起作為一個變量畫圖,那么這是我們就需要CDEF
CDEF 一個虛擬的變數(shù),其值為 DEF 的某些運(yùn)算,語法如下:
語法:CDEF:vname=rpn-expression
先舉一個例子,我們從例子中說明問題。我們?nèi)〉媚扯丝诹魅肓髁康淖止?jié)數(shù),我們希望畫在圖上的是bit為單位,很明顯我們要將字節(jié)數(shù)乘以8。
例:
DEF:in_bytes_1=$RRD_PATH:ifInOctets1:AVERAGE ? ? ? ? ? //這句剛剛說過了
CDEF:in_bits_1= 8,in_bytes_1,* ? ? ? ?//將DEF中定義的in_bytes_1×8放在in_bits_1
很好理解吧?那為什么不寫成in_bits_1= in_bytes_1* 8?現(xiàn)在我們回到語法解釋:
rpn(Reverse Polish Notation)逆波蘭表達(dá)式,它的語法規(guī)定,表達(dá)式必須以逆波蘭表達(dá)式的方式給出。那么什么是逆波蘭表達(dá)式呢?逆波蘭表達(dá)式又叫做后綴表達(dá)式。哈哈google吧。
正常的表達(dá)式 逆波蘭表達(dá)式
a+b a,b,+
a+(b-c) a,b,c,-,+
a+(b-c)*d a,d,b,c,-,*,+
那么a=1+3 就寫成 a=1,3 +了。
http=(smtp+http+telnet)/1024 寫成什么呢?
http=1024,smtp,http,telnet,+,+,/
下面終于到畫圖了,最常用的是:線和區(qū)域。
從圖中可以看出有兩種表示流量的方式,流入用綠色的區(qū)域(AREA),流出用藍(lán)色的線(LINE)。這就是畫圖的幾個元素。我們還是先看一下語法。
AREA:vname[#rrggbb[:legend]]
LINE{1|2|3}:vname[#rrggbb[:legend]]
STACK:vname[#rrggbb[:legend]]
① vname:根據(jù)虛擬變量(vname)畫圖。
② #rrggbb:顏色的16進(jìn)制表示,可以找個軟件來看。
③ legend:對該顏色的提示,最后會寫在圖上的。
④ 特別的,畫線有粗細(xì)之分,所以有LINE1-LINE3,line1最細(xì),LINE3最粗。
⑤ AREA 可以畫出資料數(shù)值至0之間的區(qū)塊圖
⑥ STACK 是表現(xiàn)在的圖的值,疊在上一個值上
例子:
AREA:in_bits_1#00cc00: " Current In"
LINE1:out_bits_1#0000ff: " Current Out "
請注意,如果使用 AREA/STACK 則需特別注意圖蓋圖的問題,一定要先畫大的值, 再畫小的值,才會有層次的效果,不然,最大的數(shù)據(jù)若最后畫,你就看不到前面的值了,都被最后一個圖給壓過去了。
關(guān)于圖下面的提示怎么畫呢?我們必須使用這兩條指令GPRINT和COMMENT
語法:
GPRINT:vname:CF:format
COMMENT:text
沒有什么難點,有點像C語言的表達(dá)式,舉兩個例子大家就會很好理解的。例:
COMMENT: "Hello World .\c " 以居中的方式顯示Hello world
GPRINT:in_bits_1:AVERAGE:"Average Current\:%8.2lf %S bps"
//顯示in_bits_1的值,精確到小數(shù)點后面兩位
這些說明性文字都可以用 \n 等換行符號
例如:
GPRINT:telnet:AVERAGE:"%10.0lf \n"
意即要輸出這段時間中 (-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置)
例子1:
#tcpdump.sh
RRD_PATH="/root/study/tcpdump.rrd"
p_w_picpath_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
p_w_picpath_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 $p_w_picpath_path/example-$t.png \
--title "本機(jī)重要 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 流量統(tǒng)計---最大------平均-------最小-------?#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
例子2(NIC_7609_Graph.sh):
繪圖的時候,我們還特別畫出了采集端口的日流量、周流量、月流量和年流量。配合Shell腳本的使用,可以達(dá)到很好的效果。
p_w_picpath_path=/www/web/nicp_w_picpaths
RRD_PATH=/www/rrd/FJNUNIC_7609.rrd
port="1 2 9 11 14 53" #端口列表
for p in $port #對每個端口的循環(huán)
do
DEFin="DEF:in_bytes_$p=$RRD_PATH:ifInOctets$p:AVERAGE"
DEFout="DEF:out_bytes_$p=$RRD_PATH:ifOutOctets$p:AVERAGE"
CDEF="CDEF:in_bits_$p=8,in_bytes_$p,* CDEF:out_bits_$p=8,out_bytes_$p,*"
ddate=`date` #取得當(dāng)前日期
#以下流入
DRAW_IN="COMMENT:\"Last updated time : $ddate\c\"" #最后更新
DRAW_IN="${DRAW_IN} COMMENT:\"\n\"" #換行
DRAW_IN="${DRAW_IN} AREA:in_bits_$p#00cc00:\" Current In \n\" " #流入流量
DRAW_IN="${DRAW_IN} COMMENT:\" \" GPRINT:in_bits_$p:LAST:\"Last Current\:%.2lf%S bps\"" #流入當(dāng)前流量文字提示
DRAW_IN="${DRAW_IN}GPRINT:in_bits_$p:AVERAGE:\"Average Current\:%.2lf%S bps\"" #流入平均流量文字提示
DRAW_IN="${DRAW_IN} GPRINT:in_bits_$p:MAX:\"Max Current\:%.2lf%S bps\n\""
#流入最大流量文字提示
#以下流出
DRAW_OUT="LINE1:out_bits_$p#0000ff:\" Current Out\n\" " #流出流量
DRAW_OUT="${DRAW_OUT}COMMENT:\" \" GPRINT:out_bits_$p:LAST:\"Last Current\:%.2lf%S bps\"" #流出當(dāng)前流量文字提示
DRAW_OUT="${DRAW_OUT}GPRINT:out_bits_$p:AVERAGE:\"Average Current\:%.2lf%S bps\"" #流出平均流量文字提示
DRAW_OUT="${DRAW_OUT} GPRINT:out_bits_$p:MAX:\"Max Current\:%.2lf%S bps\n\"" #流出最大流量文字提示
ttime="d w m y" #時間列表;d日;w周;m月;y年
for t in $ttime #對每個時間循環(huán)
do
sec=`date -v-1$t +%s` #繪圖起始時間的確定
cmd="/usr/local/rrd/bin/rrdtool graph \
$p_w_picpath_path/FJNUNIC_7609_IF${p}_${t}.png \
--title '${ttitle}' \
-v ' Bits Per Second' \
-s $sec \
-l 0 -h 150 -w 500 $DEFin $DEFout $CDEF $DRAW_IN $DRAW_OUT
--color CANVAS#ffffff
--color BACK#ffffff \
--color FONT#000000 \
--color MGRID#80C080 \
--color GRID#808020 \
--color FRAME#808080 \
--color ARROW#ff0000 \
--color SHADEA#404040 \
--color SHADEB#404040"
eval $cmd # 執(zhí)行畫圖
done #時間循環(huán)結(jié)束
done #端口循環(huán)結(jié)束
轉(zhuǎn)載于:https://blog.51cto.com/liyanxin/1342837
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的监控cacti中的RRDtool用法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++基础知识(五)—— 基本输入输出
- 下一篇: vue3开发实践笔记