$Id: howto-mrtg.html,v 1.7 2002/10/18 07:39:22 sakane Exp $

%%Title: MRTG を動かすための道のり

%%Created: Thu Nov  6 12:00:00 JST 1997
%%Updated: Fri Oct 11 11:51:00 JST 2002

o MRTGって何?
	詳細は http://www.mrtg.org/を参照。
	cron(8) で定期的に採取した2値をHTML化するツール。
	グラフは GD を使って作成。PNG形式で作られる。
	データの SNMP または任意のコマンドで採取する。
  • MRTG の基本的な設定方法
  • 主なパラメータの意味
  • ping-probe によるターゲットへの RTT を測定
  • nnstat によるトラフィック測定
  • hotnode による温度の測定
  • なんとなくパッチ
  • 準備 (パッケージがない頃の話)
  • MRTG のインストール (パッケージがない頃の話)
    
    o MRTG の基本的な設定方法
    	例えば、SNMPをサポートしたルータの入出力を MRTGで処理するには...
    
    	ルータのIPアドレスを 10.0.0.1、SNMPコミュニティ名を publicとすると
    	cfgmaker を使って設定ファイルが作れる。
    	当然ルータへの SNMP的な read 権限がなければダメ。
    
    		% cfgmaker public@10.0.0.1 >> mrtg.cfg
    
    		※ BER.pm と SNMP_Session.pm がカレントディレクトリに無いと怒られる。適時コピーする。
    
    	以下を mrtg.cfg に追加する。
    		WorkDir: /var/log/mrtg		<-- 作業ディレクトリ
    		Interval: 5			<-- cron の時間。分単位。
    		Refresh: 300			<-- HTTP-EQUIV=Refresh の値
    		WriteExpires: Yes		<-- HTTP-EQUIV=Expires を付ける
    	
    		Directory[10.0.0.1.1]: 10.0.0.1	<-- subdirectoryを使う。
    		Options[10.0.0.1.1]: growright	<-- グラフが左に流れる
    
    	- indexmaker で index.html を作る。
    		% indexmaker mrtg.cfg 'MRTG View' 10.0.0.1 > index.html
    
    	- index.html を適当に編集
    		特に各ヘッダになる所。
    
    	サンプル
    
    	WorkDir: /usr/home/sakane/public_html/mrtg
    	Refresh: 300
    	Interval: 5
    	WriteExpires: Yes
    
    	Target[10.0.0.1.1]: 1:public@10.0.0.1
    	Directory[10.0.0.1.1]: 10.0.0.1
    	Options[10.0.0.1.1]: growright
    	MaxBytes[10.0.0.1.1]: 1250000
    	Title[10.0.0.1.1]: LAN
    	PageTop[10.0.0.1.1]: <H1>Traffic Analysis for LAN </H1>
    	 <TABLE>
    	   <TR><TD>System:</TD><TD> in </TD></TR>
    	   <TR><TD>Maintainer:</TD><TD></TD></TR>
    	   <TR><TD>Interface:</TD><TD>LAN (1)</TD></TR>
    	   <TR><TD>IP:</TD><TD>10.0.0.1</TD></TR>
    	   <TR><TD>Max Speed:</TD><TD>1250.0 kBytes/s (ethernetCsmacd)</TD></TR>
    	 </TABLE>
    
    	- cron 等に設定する。
    	mrtg.cfg は /var/log/mrtg に置いてあるとする。
    
    	e.g.1
    	0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/bin/mrtg /var/log/mrtg/mrtg.cfg > /dev/null 2>&1
    
    	e.g.2
    	*/5 * * * * /usr/local/bin/mrtg /var/log/mrtg/mrtg.cfg > /dev/null 2>&1
    
    	※ 詳しくは man 5 crontab してみる。
    
    
    o 主なパラメータの意味
    	http://people.ee.ethz.ch/~oetiker/webtools/mrtg/reference.html
    
    	WorkDir: mrtg の作業ディレクトリ
    
    	Refresh: Netscape の refresh rate
    
    	WriteExpire: HTML にEXPIREタグを含める
    
    - ターゲット毎に設定する項目
    	項目名の後ろに大括弧を使ってターゲットを指定
    	e.g. Title[hoge]
    
    	Directory: データを置くディレクトリを指定。WorkDirの下。
    
    	Target: ターゲットを指定
    		e.g.
    		Target[foo]: 1:public@10.0.0.1
    
    		OIDを直接指定出来る。
    		e.g.
    		Target[hoge]: 1.3.6.1.2.1.2.2.1.14.1&1.3.6.1.2.1.2.2.1.20.1:public@myrouter
    		Target[hage]: ifInErrors.1&ifOutErrors.1:public@myrouter
    
    		コマンドを実行出来る。
    		e.g.
    		Target[var]: `/usr/home/public_html/mrtg/bin/mrtg-ping-probe 10.0.0.1`
    
    	MaxBytes:
    		最大値を指定。AbsMaxを設定しない時に MaxBytes を越えた値は無視される。
    		値としては T1 = 193000, 56K = 7000, Ethernet = 1250000 等
    		e.g.  MaxBytes[hoge]: 1250000
    
    	AbsMax: MaxBytes を越える値を扱いたい時に指定
    
    	YTics:
    		Y軸のメモリの数を指定
    
    	YTicsFactor]:
    		Y軸の値に、ここで指定した値をかける。
    		e.g. ログのデータを 1/10 したい場合は、0.1 を指定する。
    
    	Title: データのタイトルを指定。HTML に吐き出される。
    
    	PageTop: データの見出し。HTML に吐き出される。
    
    	Unscaled: 指定した集計の表示を省略する
    		値は d=day w=week m=month y=year
    		e.g. month,yearを省略するには my を指定する
    
    	Supress: 指定したデータ収集を省略する。
    		値は d=day w=week m=month y=year
    		e.g. Unscaled[hage]: y
    
    	WithPeak:
    
    	XSize: グラフのX方向のサイズを指定
    	YSize: グラフのY方向のサイズを指定
    		XSize must be between 20 and 600
    		YSize must be larger than 20
    
    	Options:
    		growright: 左に進むグラフにする。デフォルトは右。
    		bits: ビット単位になる。値を8倍する。
    		noinfo: uptime, device名を省略
    		gauge: 拾う値が積算値じゃないことを指定
    		absolute: 取得する毎に積算値がクリアするタイプの時に指定。平均値の計算に影響する?
    		absolute または gauge が指定されないと差分が表示される。
    
    	Timezone:
    		タイムゾーンを設定する。
    		MRTGは環境変数TZを使ってるだけなので、設定する値はシステム依存。
    
    		FreeBSDとかの 4.4BSD系のでは…
    			Asia/Tokyo が使える。
    			GMT+9 とかも使えるが、+ と - が逆っぽい。
    			例えば、GMT-9 としないと日本時間にならない。
    			MRTGの問題ではなく、man 3 tzset すると
    
    			Indicates the value one must add to the local time to
    			arrive at Coordinated Universal Time.
    
    			よって逆じゃなくて仕様。
    
    - ワイルドカード
    	ターゲット毎に設定する項目に対してデフォルト値などを設定する
    
    	デフォルト値の指定: "_" を使う
    		e.g. MaxBytes[_]: 1250000
    		※ 値を省略するとMRTG自体のデフォルト値が使われる。
    		 	LegendI[_]:
    		すると "Incoming Traffic in Bits per Second" が使われちゃう。
    
    	設定した値を、ターゲット毎に設定した値の先に加えたい: "^" を使う
    		PageTopに使うと便利。Targetにも使える。
    
    		e.g. Target[^]: 1:public@10.0.0.1 + 
    		     Target[hoge1]: 2:public@10.0.0.1
    		     Target[hoge2]: 3:public@10.0.0.1
    		hoge1 と hoge2の値に常に 1:public@10.0.0.1 が加算される
    
    	設定した値を、ターゲット毎に設定した値の後に加えたい: "$" を使う
    
    
    o ping-probe によるターゲットへの RTT を測定。
    
    	- contrib/ping-probe の以下のファイルを bin へコピー
    		mrtg-ping-probe
    		mrtg-ping-cfg
    
    	- FreeBSD は以下のパッチを当てる。
    		ping-probe 1.11用
    			※freebsd対応しているようだけど、ping の出力があってない。
    		ping-probe 1.9用
    			※freebsd対応していない。
    
    	- cfg を作る。
    		% bin/mrtg-ping-cfg 10.0.0.1 'ping 10.0.0.1' >> mrtg.cfg
    
    	- cfg を編集。
    		Target のパスと Directory を適当にあわせる。
    		好みで Options に growright を追加。
    
    	mrtg.cfg サンプル
    		※WorkDir とかは除外
    
    	Title[ping.10.0.0.1]: ping 10.0.0.1
    	Directory[ping.10.0.0.1]: ping.10.0.0.1
    	MaxBytes[ping.10.0.0.1]: 5000
    	AbsMax[ping.10.0.0.1]: 10000
    	Options[ping.10.0.0.1]: gauge, growright
    	Target[ping.10.0.0.1]: `/usr/home/public_html/mrtg/bin/mrtg-ping-probe 10.0.0.1`
    	PageTop[ping.10.0.0.1]: <H1>ping 10.0.0.1</H1>
    		<P>Actually we are measuring the ping time between our web server and 10.0.0.1.
    	YLegend[ping.10.0.0.1]: Round Trip Time
    	ShortLegend[ping.10.0.0.1]: ms
    	Legend1[ping.10.0.0.1]: Maximum Round Trip Time in Milli Second
    	Legend2[ping.10.0.0.1]: Minimum Round Trip Time in Milli Second
    	Legend3[ping.10.0.0.1]: Maximal 5 Minute Maximum Round Trip Time
    	Legend4[ping.10.0.0.1]: Maximal 5 Minute Minimum Round Trip Time
    	LegendI[ping.10.0.0.1]:  Max:
    	LegendO[ping.10.0.0.1]:  Min:
    	WithPeak[ping.10.0.0.1]: ymwd
    
    
    o nnstat によるトラフィック測定
    	statspy の stat.conf のサンプル
    
    	スクリプト
    
    	mrtg.cfg サンプル
    		※WorkDir とかは別
    
    	Title[nnstat.pc1.telnet]: nnstat for pc1.telnet
    	Directory[nnstat.pc1.telnet]: nnstat.pc1.telnet
    	MaxBytes[nnstat.pc1.telnet]: 1250000
    	Options[nnstat.pc1.telnet]: growright, bits
    	Target[nnstat.pc1.telnet]: `/usr/home/sakane/public_html/mrtg/bin/mrtg-nnstat-probe pc1 ULP.telnet`
    	PageTop[nnstat.pc1.telnet]: <H1>nnstat for pc1.telnet</H1>
    	YLegend[nnstat.pc1.telnet]: Bytes
    	ShortLegend[nnstat.pc1.telnet]: B
    	Legend1[nnstat.pc1.telnet]: FTP packets
    	Legend2[nnstat.pc1.telnet]: TELNET packets
    	Legend3[nnstat.pc1.telnet]: SMTP packets
    	Legend4[nnstat.pc1.telnet]: HTTP packets
    	WithPeak[nnstat.pc1.telnet]: ymwd
    
    
    o hotnode による温度の測定
    	hotnodeは IPv6スタックを積んだ温度センサーである。
    	遊び方は『HotNodeを使ってみる』を参照。
    
    	スクリプト
    
    	mrtg.cfg サンプル
    
    	Target[inode0]: `/usr/local/bin/mrtg-hotnode-fetch http://inode0.kame.net/`
    	Title[inode0]: The temperature of the server room
    	PageTop[inode0]: <H1>The temperature of the server room</H1>
    	YLegend[inode0]: temp. (Celsius)
    	ShortLegend[inode0]: C&deg;
    	MaxBytes[inode0]: 300
    	AbsMax[inode0]: 1000
    	YTics[inode0]: 5
    	YTicsFactor[inode0]: 0.1
    	Factor[inode0]: 0.1
    	WithPeak[inode0]: ymwd
    	Unscaled[inode0]: d
    	Options[inode-srv]: growright, gauge
    	Legend1[inode-srv]: 
    	Legend2[inode-srv]: temperature in degree
    	Legend3[inode-srv]: 
    	Legend4[inode-srv]: 5 minute maximum temperature in degree
    	LegendI[inode-srv]: 
    	LegendO[inode-srv]: &nbsp;Max:
    
    
    o なんとなくパッチ
    	cfgmakerへのパッチ
    		TIMEZONEを日本にする。
    		グラフの時間を右が過去にする。
    		mrtg-cfgmaker.patch
    
    	なんとなく indexmakerへのパッチ
    		mrtg-indexmaker.patch
    
    o mrtg を覗いてみる
    	TO BE WRITTEN
    
    	$main::DEBUG=1;
    	DEBUG > 2 だともっと出る。
    	5 位まである。
    
    	main()
    	for {
    		getcurrent(処理する router の name, uptime, time(?), やら)
    		writegraphics();
    		writehtml();
    	}
    
    	writegraphics()
    	{
    		パラメータを調整;
    		exec rateup ...
    	}
    
    	rateup:
    	(work directory)
    	/usr/home/sakane/public_html/mrtg/ping.127.0.0.1/ ping.127.0.0
    	.1 905235143 g 0 0 10000 c #00cc00 #0000ff #006600 #ff00ff l [Round Trip Time] i
    	 ping.127.0.0.1-day.gif -5000 400 100 1 1 1 300 0
    
    
    o 準備 (パッケージがない頃の話)
    	FreeBSD 2.2.8 から mrtg-2.5.3 がパッケージ化されている。
    
    	- GD のインストール
    		GD を拾ってくる。
    		http://www.boutell.com/gd/
    		make すると malloc.h が無いと怒られる。
    			BSD/OS2.1は、いらないから削除。
    
    		FreeBSD はパッケージから突っ込む。なんて便利…
    
    	- perl5.003 以上が必要なのでインストール
    		FreeBSD はパッケージから突っ込む。すばらしく便利…
    
    
    o MRTG のインストール (パッケージがない頃の話)
    	- MRTG を拾ってくる。
    		最新版はhttp://www.ee.ethz.ch/~oetiker/webtools/mrtg/pub/から。
    
    	- GD のライブラリやincludeファイルへのパスを Makefile へ設定しておく
    		FreeBSD でパッケージを使っている場合は、
    			GD_INCLUDE=/usr/local/include/gd
    			GD_LIB=/usr/local/lib
    	- perl5 へのパスを Makefile へ設定
    	- さて make
    		% make rateup
    		% make substitute
    	- 適当なディレクトリを例えば mrtg とか掘る。
    	- そこに mrtg*.gif をコピー。
    	- mrtg/bin に以下をコピー
    		BER.pm
    		SNMP_Session.pm
    		mrtg
    		rateup
    		cfgmaker
    		indexmaker