最終更新日: 2009-04-18
でも、可視化したい監視対象がSNMPを喋らなかったら…、
あるいは、SNMPが防火壁やNAT箱でブロックされていたら…、
それとも、ズボラにSNMPをインストールしたくない…
大丈夫。MRTGは大変よくできたソフトです。 SNMPを使わなくても(使えなくても)、 いろんな時系列情報を可視化できます。
Target[ターゲット名]: `外部プログラム`のように、バッククォートで外部プログラムを指定します。
え、ちゃんと説明が必要? わたしのヘタな説明より 公式日本語サイト (www.mrtg.jp/doc/) の MRTG設定リファレンス (reference.html) を読んだほうがいいでしょう。
外部プログラムは、設定リファレンスによると、 4行の情報を返すように作っておけば大丈夫です。 各行にどんな情報を出力するかですが、
具体例は、netstatでMRTGをどうぞ。
監視対象はルータやトラフィックなどに限定されるわけではありません。 たとえば、サーバの温度なんかを可視化したい場合もあるでしょう。 マザーボードのハードウェア情報を教えてくれるhealthdというツールがありますが、 これを使って、CPU温度とマザーボード温度を1/10度単位で監視したいなら、
#! /bin/sh export LANG=C temp=/tmp/x.$$ trap 'rm -f $temp*; exit 1' 1 2 15 # clean up files /usr/local/sbin/healthd -dc 1 | grep '^Temp' > $temp.1 ibytes=`cat $temp.1 | awk '{print $2*10}'` obytes=`cat $temp.1 | awk '{print $3*10}'` echo $ibytes echo $obytes echo 0 echo "healthd monitoring" rm -f $temp* exit 0 # EOFみたいなシェルスクリプトを用意して、
# # mrtg.cfg -- healthd # WorkDir: /path/to/work HtmlDir: /path/to/html ImageDir: /path/to/image LogDir: /path/to/log IconDir: /path/to/icon # absolute - 得られた値を間隔(300秒)で割ってグラフ化 # gauge - 得られた値をそのままグラフ化 # 指定なし - 得られた値と直前の値の差を間隔(300秒)で割ってグラフ化 Options[_]: gauge,growright,nopercent,withzeroes Target[healthd]: `/bin/sh /usr/local/libexec/healthd.sh` MaxBytes[healthd]: 2000 Title[healthd]: healthd monitoring (temperature) YLegend[healthd]: Celsius x10 ShortLegend[healthd]: deci C LegendI[healthd]: CPU Temp LegendO[healthd]: System Temp PageTop[healthd]: <H1>Temperature (deci Celsius)<H1> Legend1[healthd]: CPU Temperature (deci Celsius, ie. 200 means 20 degrees celsius) Legend2[healthd]: System Temperature (deci Celsius) # EOFという設定ファイルを用意すればいいでしょう。
とはいえ、諸般の事情でSNMPを喋らせることができない場合もまれにはあるでしょう。 そういうときは、そこに何か追加しないで、リモートマシンの情報を MRTGを動かしているマシンに伝達する方法を考えましょう。 UN*X系のマシンなら、いろんな方法があります。
たとえば、syslog。
UN*X系マシンには、logger(1)コマンドが用意されています。 可視化したい情報をloggerコマンドでMRTGが動いているマシンに送り、 MRTGが動いているマシンで、 ログから前節で書いたような4行形式のデータに変換して MRTGでグラフ化してやればよいのです。
例として、メールのトラフィックを監視する場合のスクリプトを以下に。
#! /bin/sh # # smtp.sh -- HTTPリクエストでMRTG用データを送信する # # 0.0: Mar. 27, 2009 by Dai ISHIJIMA # export LANG=C export PATH=/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin temp=/tmp/x.$$ trap 'rm -f $temp*; exit 1' 1 2 15 # clean up files request=http://mrtg.your.domain/path/to/monitor/ epoch=`date '+%s'` host=`hostname -s` target='smtp' ibytes=`grep 'smtpd.*: connect from' /var/log/maillog | wc -l | awk '{print 0 + $1 * 1000}'` obytes=`grep 'relay=.*status=sent' /var/log/maillog | wc -l | awk '{print 0 + $1 * 1000}'` wget -O - -q "${request}?host=${host}&epoch=${epoch}&target=${target}&ibytes=${ibytes}&obytes=${obytes}" rm -f $temp* exit 0 # EOFこのスクリプトは、wgetコマンドを使って、MRTGが動いているマシンに、 /var/log/maillogの情報(PostfixでSMTPクライアントが接続してきた数と メール送信に成功(status=sent)した数)をhttpプロトコルで送ります。
MRTGが動いているマシンでは、ウェブサーバ(Apache)のログに
target.your.domain - - [18/Apr/2009:21:13:01 +0900] "GET /path/to/monitor/?host=target&epoch=1240056781 &target=smtp&ibytes=123456000&obytes=65432000 HTTP/1.0" 200 0こんな情報が残ります。
上の情報を次のスクリプトで処理します。
#! /bin/sh export LANG=C export PATH=/usr/bin:/bin:/usr/local/bin:/home/local/bin:/usr/sbin:/sbin temp=/tmp/x.$$ trap 'rm -f $temp*; exit 1' 1 2 15 # clean up files logfil=/var/log/http-access host=target fqdn=target.your.domain target="$1" url=path/to/monitor/ grep "^${fqdn} .*${url}?host=${host}.*&target=${target}" $logfil | tail -1 > $temp.1 tr ' ?&' '\012\012\012' < $temp.1 > $temp.2 ibytes=`cat $temp.2 | sed -n 's/^ibytes=//p'` obytes=`cat $temp.2 | sed -n 's/^obytes=//p'` epoch=`cat $temp.2 | sed -n 's/^epoch=//p'` stamp=`date -r $epoch '+%Y-%m-%d %H:%M:%S'` echo $ibytes echo $obytes echo $stamp echo "${host}-${target}" rm -f $temp* exit 0このスクリプトの出力を次のMRTG設定ファイルで処理します。
# # mrtg.cfg -- remote smtp log via http # WorkDir: /path/to/work HtmlDir: /path/to/html ImageDir: /path/to/image LogDir: /path/to/log IconDir: /path/to/icon # # bits - 得られた値を8倍する (1byte -> 8bits) # perminute - 60倍 (n / sec -> 60n / min) # # absolute - 得られた値を間隔(300秒)で割ってグラフ化 # gauge - 得られた値をそのままグラフ化 # 指定なし - 得られた値と直前の値の差を間隔(300秒)で割ってグラフ化 # # integer - グラフ下の要約部を整数で表示 (小数点ナシ) # withzeroes - ゼロを無視しない # nolegend - 凡例表示しない # Options[_]: growright,perminute,withzeroes,nopercent,integer,nolegend Target[smtp]: `/bin/sh /usr/local/libexec/http2mrtg.sh smtp` MaxBytes[smtp]: 12500000 Title[smtp]: smtp connect/send analysis YLegend[smtp]: x1000 ShortLegend[smtp]: m counts/min LegendI[smtp]: smtp connect: LegendO[smtp]: status=sent: PageTop[smtp]: <H1>SMTP Connect/Send Analysis</H1>
ここで紹介したシェルスクリプトや設定ファイル、マシン名などは、 適当につけたものなので、 みなさんの環境にあわせて、適切にチューニングしてください。