rrdtoolを使った、小さいアイコン風 trafficグラフの作成
sorry Japanese only
最終更新日 2004/10/19
page size = Mbyte

dougaページ用に、24hrの転送量が表示できればいいなぁ。
ってことで、rrdtoolの graphコマンドを使用し、小さいアイコン風トラフィックグラフを作成してみました。

ページへアクセスするたびに、アクセスカウンターのようにグラフ作成 CGIを呼び出し、過去 24時間のグラフを再作成しています。



このページを呼び出した時にも一応グラフを新しく作り直しています。
24hrグラフなので、リロードしても差が余り出ないので分かりづらいですが。(w

最初は、rrdtoolの fetchコマンドにて出力した、文字列の統計データーを計算させて合計し、その数値をアクセスカウンターのように表示させてみよう!
と思ったのですが CGIの経験値が足らず断念しました・・・

と言うことで、こんな cgiを作り、アクセスカウンターの要領でページから呼び出し、グラフを作成しています。
[root]# cat traffic-24hr-small.cgi
#!/usr/bin/perl

#環境変数セット
#
my $rrddir="/usr/local/HotSaNIC/modules/traffic/rrd";
my $rrdbin="/usr/local/rrdtool/bin/rrdtool";

print "Content-type: image/png\n\n";        # <== 後書き1

#graph出力
#

system "$rrdbin",
"graph",
"-", 
"--imgformat","PNG", 
"-o",
"-w","150","-h","50",
"-s -86400",
"-x","HOUR:6:HOUR:6:HOUR:6:0:%H",
"-y","none",
"-c","BACK#000000",
"-c","GRID#101010",
"-c","MGRID#101010",
"-c","CANVAS#222222",
"-c","SHADEA#222222",
"-c","SHADEB#222222",
"-c","FRAME#101010",
"-c","FONT#FFFFFF",
"-c","ARROW#000000",
"DEF:dbavgout=$rrddir/ppp0.rrd:out:AVERAGE",
"CDEF:avgout=dbavgout,8,*",
"CDEF:totout=avgout,10800,*",
"LINE1:avgout#FF0000:",
"GPRINT:totout:AVERAGE:           %2.2lf %sbyte out/24hr";
dbavgout=ppp0.rrdは byte。
グラフ書かせる avgoutは 8倍して bitへ変換。
トータルの統計値 totoutは 24hrなので 86400secと記述する所、8で割って 10800と記述することにより byte単位で出力。
ここら辺の数字を間違えると、訳の分からない数値が出力されますから注意。
(って私も、bit変換、byte変換とワケワカな事やってるけど)

ちなみに、黒バックのページ用なので、普通の白バックのページ用の人は、-cオプションの行を全て削除すれば、白い普通のグラフが出力されます。

上記 cgiを htmlのページから以下のように呼び出せば、rrdtoolを実行し、過去 24時間のグラフを作り表示されます。
<img src="traffic-24hr-small.cgi">


最初、オプションの行でスペース開いている所は","で区切らなければダメ。
って言うのに気が付かず、shスクリプトを作成して cronで動かしていました。
ちなみに、その時の shスクリプトは以下の物を動かしていました。
[root]# cat traffic-graph-day.sh 
#!/bin/bash
#
#環境変数セット
#
rrddir="/usr/local/HotSaNIC/modules/traffic/rrd"
rrdbin="/usr/local/rrdtool/bin/rrdtool"
websensor="/home/localhost/HotSaNIC/"

#graph出力
#

$rrdbin graph $websensor/traffic-total-day.png \
--imgformat PNG \
-o \
-w 150 -h 50 \
-s -86400 \
-x HOUR:6:HOUR:6:HOUR:6:0:%H \
-y none \
-c BACK#000000 \
-c GRID#101010 \
-c MGRID#101010 \
-c CANVAS#222222 \
-c SHADEA#222222 \
-c SHADEB#222222 \
-c FRAME#101010 \
-c FONT#FFFFFF \
-c ARROW#000000 \
DEF:dbavgout=$rrddir/ppp0.rrd:out:AVERAGE \
CDEF:avgout=dbavgout,8,* \
CDEF:totout=avgout,10800,* \
LINE1:avgout#FF0000: \
GPRINT:totout:AVERAGE:"           %2.2lf %sbyte out/24hr"



しかし、いちいち .pngのファイルを出力しなくとも、GPRINTの行を PRINTにすると標準出力とあるので、やってみたら、確かにテキストで出てきます。
しかしグラフ出力無しで最後の統計値だけを出す方法が分からないんだよなぁ。
出力するファイル名を - にすると、pngファイルが標準出力に出てきちゃって又話がややこしいし。

しかし、-で標準出力へ pngの画像がはき出されるのなら、それを img src=で使えば良いんじゃ?
ってことで、そのようにしました。

ちなみに、後書き1の部分を最初に持ってくるのに気が付くまでは、以下のようなエラーが出ていました。

[Sat Aug 14 15:11:50 2004] [error] [client xxx.xxx.xxx.xxx] malformed header from script. Bad header=230x105: traffic-24hr-small.cgi, referer: http://miya0.dyndns.org/douga/index.html

後書き1 この errorは、230x105という文字列が、なんの httpヘッダーも無しに返ってきてしまうのが問題でした。
traffic-24hr-small.cgiの 後書き1って書かれてる部分の行を入れることによって解消されました。

13010
戻る