rrdtool 畫mrtg log數據

簡述:公司已經有mrtg畫流量圖了,這裏需要對現有的流量圖彙總。想利用rrdtool畫出總流量圖。

1.瞭解mrtg log格式:

1233645600 1543128 37293414 1724764 39253194
1233645300 1585731 38744665 1794511 41541920
1233645000 2006102 47017612 2433360 53782126
……
MRTG日誌分爲兩部分:

+ 第一部分

日誌的第一行是第一部分。有三列,分別代表MRTG上次的運行時間戳,輸入
總流量和輸出總流量。

+ 第二部分

除去第一行剩下的部分爲第二部分,總共5列,分別代表:
1. A(第一列) 這一列相關數據的時間戳,需要注意的是開始時每行之間的時間間
隔爲5分鐘,最後爲一天.
perl -e 'print scalar localtime(x),"\n"'

2. B(第二列) 每秒的平均輸入(average incoming)流量,以字節爲單位。

3. C(第三列) 每秒的平均輸出(average outgoing)流量,以字節爲單位。

4. D(第四列) 當前間隔內每秒的最大輸入流量(maximum incoming),以字節爲單
位。這是從當前間隔內所有的更新中計算出來的。假設當前時隔爲1小時,每5分
鍾更新一次,那麼這個值就是所有12次數據中最大的那個。

5. E(第五列) 當前間隔內每秒的最大輸出流量(maximum outgoing),以字節爲單
位。計算方法同上。


2.彙總mrtg日誌:

[root@hj addflow]# cat addflow.sh
#!/bin/sh
if [ $# -ne 3 ] ; then
    echo "usage: $0 log_file log_dir swfile"
    echo "Example usage: $0 all_sw.log all all_sw"
    exit 1
fi
curdir="/usr/local/NetFlow/All_mrtg_log"
vlan1="$curdir/$1"
swfile="$curdir/$2"
swlog=`cat $swfile`
log_dir=$3
for i in $swlog
do
  rsync -avL --timeout=120 $curdir/log/$i $curdir/addflow/$log_dir
done
#getti()
#{
#    ti=$1
#}
#while read LINE
#do
#    getti $LINE
#    break
#done < $vlan1
addto()
{
    to1=`expr $to1 + $2 `
    to2=`expr $to3 + $3 `
}
addport()
{
    ti1=`expr $ti1 + $2 `
    ti2=`expr $ti2 + $3 `
    ti3=`expr $ti3 + $4 `
    ti4=`expr $ti4 + $5 `
}
sumport()
{
    file="$dir/$1"
    num=0
    while read PORT
    do
        if [ $num -gt 1 ]; then
            break
        fi
        if [ $num -lt 1 ]; then
            addto $PORT
        else
            addport $PORT
        fi
        num=`expr $num + 1 `
    done < $file
}
ti=`date +%s`
port=`ls $curdir/addflow/$log_dir/*.log`
for i in $port
do
    sumport $i
done
sed -i '1,2d' $vlan1
sed -i "1 i$ti $ti1 $ti2 $ti3 $ti4" $vlan1
sed -i "1 i$ti $to1 $to2" $vlan1

3.創建rrd文件

這裏選用GAUGE類型,計算的數據直接存入rrd。

[root@hj NetFlow]# cat create_rrd.sh
#!/bin/bash
/usr/bin/rrdtool create all_sw.rrd --step 300 DS:input:GAUGE:600:0:U DS:output:GAUGE:600:0:U RRA:AVERAGE:0.5:1:2400 RRA:AVERAGE:0.5:4:2400 RRA:AVERAGE:0.5:24:2400 RRA:AVERAGE:0.5:288:2400

update rrd和畫圖都寫到一個bash腳本。

4.更新rrd文件函數

update_rrd()
{
   rrdfile=$1
   log_file=$2
   STEP=2
   HEARTBEAT=4
   now=`date +%s`
   input=`less $log_file|awk '{if( NR == 2) print $2}'`
   output=`less $log_file|awk '{if( NR == 2) print $3}'`
   echo -e "input:$input\noutput:$output"
   /usr/bin/rrdtool updatev $rrdfile $now:$input:$output
}

5.rrdtool畫過去24小時的圖

update_png()
{
  DIR=$1
  image_path="${DIR}/$2"
  rrdfile="${DIR}/$3"
  PIC=${image_path}/$4
  dk=$5
  title1=$6
  now=`date "+%Y/%m/%d %H\:%M\:%S"`
 rrdtool graph $PIC\
  --title "$title1"\
  --vertical-label "單位:(Bits per Second)"\
  --end now --start end-86400\
  -w 700 -h 200 \
  -Y -X 9 -b 1000\
  --x-grid MINUTE:12:HOUR:1:HOUR:1:0:'%H'\
  --lower-limit=0\
  --font TITLE:10: \
  --font AXIS:7: \
  --font LEGEND:8: \
  --font UNIT:7: \
  DEF:in=$rrdfile:input:AVERAGE\
  DEF:out=$rrdfile:output:AVERAGE\
  CDEF:v1=in,8,*\
  CDEF:v2=out,8,*\
  AREA:v1#00FF00:"上傳" \
  GPRINT:v1:LAST:"當前:%8.2lf%s" \
  GPRINT:v1:MAX:"最大:%8.2lf%s" \
  GPRINT:v1:MIN:"最小:%8.2lf%s" \
  GPRINT:v1:AVERAGE:"平均:%8.2lf%s\n" \
  LINE1:v2#0000ff:"下載" \
  GPRINT:v2:LAST:"當前:%8.2lf%s" \
  GPRINT:v2:MAX:"最大:%8.2lf%s" \
  GPRINT:v2:MIN:"最小:%8.2lf%s" \
  GPRINT:v2:AVERAGE:"平均:%8.2lf%s\n" \
  COMMENT:"總採購帶寬 ${dk} G\t\t\t\t\tLast Updated\: $now"
}

6.rrdtool畫過去一週的圖

update_week_png()
{
  DIR=$1
  image_path="${DIR}/$2"
  rrdfile="${DIR}/$3"
  PIC=${image_path}/$4
  dk=$5
  title1=$6
  now=`date "+%Y/%m/%d %H\:%M\:%S"`
  etime=`date +%s`
  stime=`expr $etime - 604800`
  echo "etime:$etime stime:$stime"
 rrdtool graph $PIC\
  --title "$title1"\
  --vertical-label "單位:(Bits per Second)"\
#  -s `date -d "-1 week" +%s` \
  --start=$stime\
  --end=$etime\
  -w 700 -h 200 \
  -Y -X 9 -b 1000\
  --lower-limit=0\
  --font TITLE:10: \
  --font AXIS:7: \
  --font LEGEND:8: \
  --font UNIT:7: \
  DEF:in=$rrdfile:input:AVERAGE\
  DEF:out=$rrdfile:output:AVERAGE\
  CDEF:v1=in,8,*\
  CDEF:v2=out,8,*\
  AREA:v1#00FF00:"上傳" \
  GPRINT:v1:LAST:"當前:%8.2lf%s" \
  GPRINT:v1:MAX:"最大:%8.2lf%s" \
  GPRINT:v1:MIN:"最小:%8.2lf%s" \
  GPRINT:v1:AVERAGE:"平均:%8.2lf%s\n" \
  LINE1:v2#0000ff:"下載" \
  GPRINT:v2:LAST:"當前:%8.2lf%s" \
  GPRINT:v2:MAX:"最大:%8.2lf%s" \
  GPRINT:v2:MIN:"最小:%8.2lf%s" \
  GPRINT:v2:AVERAGE:"平均:%8.2lf%s\n" \
  COMMENT:"總採購帶寬 ${dk} G\t\t\t\t\tLast Updated\: $now"
}

7.函數調用

M_DIR=/usr/local/NetFlow
update_rrd $M_DIR/all_sw.rrd $M_DIR/All_mrtg_log/all_sw.log
update_png $M_DIR images all_sw.rrd all_sw.png 1024 "過去 24 小時離線和雲播總流量"
update_week_png $M_DIR images all_sw.rrd all_sw_week.png 1024 "過去  一週  離線和雲播總流量"

8.效果圖展示:

wKiom1MFmwyjb9gXAAY9HggV2Tk298.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章