共计 4398 个字符,预计需要花费 11 分钟才能阅读完成。
简述:公司已经有 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. 效果图展示:
相关阅读:
使用 RRDtool 自定义绘图监控 Oracle 数据库 http://www.linuxidc.com/Linux/2012-11/74755.htm
通过 RRDtool 简单绘制图像 http://www.linuxidc.com/Linux/2012-08/68095.htm
安装 RRDtool 时候的报错 configure: error: Please fix the library issues listed above and try again http://www.linuxidc.com/Linux/2012-08/67083.htm
RHEL5.5 安装 RRDtool 解决多多依赖关系 http://www.linuxidc.com/Linux/2012-05/61403.htm
CentOS 中使用 yum 安装 RRDtool http://www.linuxidc.com/Linux/2012-05/61352.htm