MRTG で ICMP RTT の推移を監視

ping による RTT の値を MRTG でグラフ化してみたいと思います。

FreeBSD の ports でmrtg-ping-probe なるものを見つけたのですが、FTPサイトがつながらなかったこともあり、自力で作っています。

mrtg は今回 ports からインストールしています。もちろん事前に gmake や perl などをインストールする必要があります。
(perl は portsで入れると無駄に時間がかかるので注意)

依存性は以下の通り。欧文フォントじゃないとちゃんと見えないけど。

mrtg-2.16.2_1,1
|\__ perl-5.10.1
|\__ p5-SNMP_Session-1.12
|      \__ perl-5.10.1
|\__ p5-Pod-Parser-1.38
|      \__ perl-5.10.1
|\__ png-1.2.40
|\__ jpeg-7
|\__ pkg-config-0.23_1
|\__ freetype2-2.3.9_1
|      \__ pkg-config-0.23_1
|\__ libiconv-1.13.1
 \__ gd-2.0.35_1,1
      |\__ png-1.2.40
      |\__ jpeg-7
      |\__ pkg-config-0.23_1
      |\__ freetype2-2.3.9_1
      |      \__ pkg-config-0.23_1
       \__ libiconv-1.13.1

mrtgの元ファイルは以下の4行の出力だそうです。

1行目 : 値1(整数・必須)
2行目 : 値2(整数・必須)
3行目 : システムが起動してから経過した時間
4行目 : 値の説明

参考:「SNMPに頼らないでMRTGグラフを作成する」 http://tech.bayashi.jp/archives/entry/server/2007/001723.html

そこで ping の結果から RTT を切り出して MRTG 形式にする perl スクリプトがこちら。ターゲットにpingを5回打って、最大と平均を抜き出しています。/usr/local/bin/rtt-mrtg.pl というファイルがそれで、実行許可をつけています。

#!/usr/bin/perl
$sp = " ";
$slash = "/";
$target_ip=$ARGV[0];

$resultofping=`ping -c 5 $target_ip | grep round-trip`;
@array = split(/$sp/,$resultofping);
$array[6] =~ s/time=//;
@array2 = split(/$slash/,$array[3]);
print $array2[1] *1000 . "\n";
print $array2[2] *1000 . "\n";
#print `uptime | awk '{print $3$4}' | sed -e "s/,//g"`
$uptime_raw=`uptime`;
@array3 = split(/$sp/,$uptime_raw);
$array3[5] =~ s/,//;
print $array3[4]. $sp . $array3[5] . "\n";
print "ICMP_RTT_of_$ARGV[0]\n"

わざわざ1000倍して micro sec 単位にしているのは mrtg が小数点1ケタまでしか受け付けないためです。

で、mrtg の cfg ファイルを作る必要があるので、これを /usr/local/etc/mrtg/rtt-mrtg.cfg としておきます。
(path は FreeBSD ports/packages でインストールした場合のデフォルト)

たとえば、東京のルータ 10.10.20.254 と大阪のルータ 10.10.50.254 を監視したいとすると

SetEnv[_] : LANG="C"
Options[_] : gauge, absolute
YLegend[_] : RTT (micro sec.)

Target[TKY]: `/usr/local/bin/rtt-mrtg.pl 10.10.20.254`
Target[OSA]: `/usr/local/bin/rtt-mrtg.pl 10.10.50.254`

というようなのを作ります。LANG環境変数はマルチバイト用に設定されたログインシェルからだとperlに怒られるから必須。target の横で指定したアルファベットをモトにファイルが自動生成されます。

あとはデータのできる場所を apache httpd などから参照できるようにし、アクセス制限なんかもつければOK。

なお、ports/packages でインストールすると /usr/local/etc/rc.d に mrtg-daemon の起動スクリプトが置かれるが、私の好みで cron で起動している。root 権限で動作してしまうのは内部のサーバなので勘弁してもらいたい。

本当は apache が動作する daemon 権限で mrtg を動かして、ファイルが置かれるディレクトリ以下のオーナーを daemom にするのが正しい。
(FreeBSDならログインシェルを/sbin/nologinにしていてもsuできるから割と簡単なはず)

# cat /etc/crontab | grep mrtg
*/5     *       *       *       *       root    /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg

実行結果のサンプルです。具体的な名前は出せないので全部モザイク処理してます(苦笑)

グラフ例

これを見ると、青線は最大値なので当然ブレがあり、トラフィックが高い時間帯は遅延が大きくなるわけですが、平均値はほぼ一定値を刻むのが普通です。

ところが、左側の列の3番目のグラフ。尺の関係で見えにくいですが実は平均値にも結構なバラツキがあります。こういうことを書くと回線キャリアには嫌われるのですが、これは回線品質がいまいちということになります。xDSL な回線ならばらついて当然ですが、光回線で平均値がバラつくようなら文句を言ってみるのも1つです。

戻る