rrdtool通過流量數據繪圖

線上機器的流量圖都採用MRTG來畫的,有些機器部署了同一業務,需要知道這些業務跑了多少帶寬,由於MRTG的圖有每個時間點的流量數據log,所以就在這個log的基礎上取數據用rrdtool合併起來,就可以知道這些機器總共跑了多少帶寬了。

   原理:定期(這裏是5分鐘)從mrtg服務器上同步log過來,然後截取最近的流量數據,如果通過過來的log時間不是最新的,說明這臺機器可能出故障或者mrtg流量有問題,就忽略它;將取出來的數據用rrdtool更新,畫圖即可;

先說下MRTG的log格式吧:


--------------------------------------------------------------------
MRTG日誌例樣
--------------------------------------------------------------------
mrtg上次運行 輸入總流量 輸出總流量
1233651303 86083097205191 1077254914026673

時間戳 當前輸入 當前輸出 平均最大輸入 平均最大輸出
1233651303 1502168 36756425 1502168 36756425
1233651242 1637256 37749359 1840688 39682490
1233651000 1593342 35050409 1808632 37572979
1233650700 1711678 38139787 1966100 42713270


--------------------------------------------------------------------
MRTG日誌詳解
--------------------------------------------------------------------
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),以字節爲單
位。計算方法同上。


代碼如下:


# cat rsync_log.sh
#!/bin/bash
dir=$(dirname $0)
cd $dir
H=host
src="ccrsync@xxxxx::MRTGHOME"
dst="log"
res=result.log
> $res
while read host eth        #host文件中按格式記錄要同步的機器名和網卡名:hostname ethx
do
    f="$host.xxxx.net_$eth.log"
    echo -n "$host "
    echo -n "$host " >> $res
    /usr/bin/rsync -az --timeout=120  $src/$host/$f $dst
    if [ ! -f log/${f} ];then
        echo -n "needs check"
        echo "0 0" >> $res        #如果要同步的網卡流量數據沒有,則設爲0
    elif [ `expr $(date +%s) - $(ls -l  --time-style=+%s log/$f |awk '{print $6}')` -gt 1200 ];then
        echo -n "is older"
        echo "0 0" >> $res        #若mtrg未更新了,則設爲0
    else
        head -2 log/$f |tail -1 |cut -d' ' -f2,3 >> $res
    fi
    echo
done < $H
#cat $res,查看結果,若流量數據爲0的就可以去檢查mrtg是否正常了
$dir/rrd.sh            #更新rrd數據
$dir/graph.sh h    #畫最近多少小時的圖
$dir/graph.sh w    #最近一星期
$dir/graph.sh m
$dir/graph.sh y
# cat rrd.sh
#!/bin/bash
dir=$(dirname $0)
db="$dir/rrd/all.rrd"
file="$dir/cdn/all.png"
log=$dir/result.log
declare -a in_out="($(cat $log  |awk '{a+=$2;b+=$3}END{print a,b}'))"
echo ${in_out[0]}
echo ${in_out[1]}
if [ ! -f $db ];then
    /usr/bin/rrdtool create $db --step 300 \
        DS:inner:GAUGE:600:0:U \
        DS:outer:GAUGE:600:0: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
fi
now=$(date +%s)
now1=$(date +"%F %T")
/usr/bin/rrdtool update $db $now:${in_out[0]}:${in_out[1]}



# cat graph.sh
#!/bin/bash
usage()
{
    echo "Usage:$0 <h>|<w>|<m>|<y>"
}
if [ $# -ne 1 ];then
   usage
   exit 1
fi
dir=$(dirname $0)
db="$dir/rrd/all.rrd"
str=""
dt=$(date +"%F %T")
case $1 in
    "h")
        str=${str}" --end now --start end-108000 --title \"last 30 hours(update time:$dt)\" --x-grid=MINUTE:30:HOUR:1:HOUR:1:0:'%H'"
        file="$dir/cdn/hour.png"
        ;;
    "w")
        str=${str}" -s -8day -e now-1min -t \"week(update time:$dt)\" --x-grid=HOUR:2:HOUR:6:HOUR:24:0:'%a'"
        file="$dir/cdn/week.png"
        ;;
    "m")
        str=${str}" -s -40day -e now-1min -t \"last month(update time:$dt)\" --x-grid=HOUR:12:HOUR:24:HOUR:24:0:'%d'"
        file="$dir/cdn/month.png"
        ;;
    "y")
        str=${str}" -s -20month -e now-1min -t \"last year(update time:$dt)\" --x-grid=MONTH:1:MONTH:1:MONTH:1:0:'%b'"
        file="$dir/cdn/year.png"
        ;;
    "*")
        usage
        exit 1
        ;;
esac
str=${str}' -v "Bits per Second" -w 700 -h 240 '
str=${str}"
    DEF:in0=$db:inner:AVERAGE
    DEF:out0=$db:outer:AVERAGE "
#由於mrtg的流量數據單位爲byte,咱們繪圖的爲bit,則需*8
str=${str}'
    CDEF:in1=in0,8,*   
    CDEF:out1=out0,8,*
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    LINE1:out1#0000ff:"out\t"
    GPRINT:out1:LAST:"last %6.2lf%s\t"
    GPRINT:out1:MAX:"max %6.2lf%s\t"
    GPRINT:out1:MIN:"min %6.2lf%s\t"
    GPRINT:out1:AVERAGE:"average %6.2lf%s\n"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    AREA:in1#22DD22:"in\t"
    GPRINT:in1:LAST:"last %6.2lf%s\t"
    GPRINT:in1:MAX:"max %6.2lf%s\t"
    GPRINT:in1:MIN:"min %6.2lf%s\t"
    GPRINT:in1:AVERAGE:"average %6.2lf%s\n"
'
cmd=`echo /usr/bin/rrdtool graph $file ${str}`
#/usr/bin/rrdtool graph $file ${str}
eval $cmd


rsync_log.sh這腳本放到crontab裏面5分鐘跑一次就可以持續生成圖了

效果如下:

wKioL1N3D-Tx9un3AAeVIMGxoIE116.jpg


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