简述:公司已经有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:$inputnoutput:$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%sn" 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%sn" COMMENT:"总采购带宽 ${dk} GtttttLast 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%sn" 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%sn" COMMENT:"总采购带宽 ${dk} GtttttLast 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.效果图展示: