サーバの状態をグラフ化する。

書きながらやってたら詰まったので一部直してます(4/14)
サーバ監視の方法の一つに状態の遷移をグラフ化することがあります。そのためのツールとしてMRTGRRDTOOLがあるんだけど、WEB+メール+実験目的の自宅サーバにはあらゆる面で上回ってる(と思ってる)PRDTOOLを使ってます。業務用サーバではMRTGが使われていて、特に困ってはいないけれどグラフの色気無さにがっかりしてるので、いつかは置き換える為の布石にすべく今からPRDTOOLにグラフを足す作業の記録を書くとします。
PRDTOOLは収集されたデータからグラフイメージを作成する機能しかありません。WEBで見るためのページや、収集スクリプトは自分で作らなきゃいけません。機能が分かれているのは良い事です。

インストール方法

データ収集+グラフ一覧ページの作成には便利なフロントエンドのcactiを使います。インストール方法は・・・随分前から使ってるので忘れました!確かRRDTOOLは「yum install rrdtool」で、cactiはtarを落としてWebServerのドキュメントディレクトリにそのまま突っ込んだ記憶があります。詳しくはこの辺を参考にしてね
404 Not Found
cacti - グラフツールcactiとは?
じつはかんたん!! RRDTOOL

設定作業

CPU使用量とネットワーク使用量は以前からグラフ化してて、今回はCPU温度とファン回転数のグラフを追加するのです。

データ収集用スクリプトの作成

SNMPは良くわからないので使用しません。そんな高級なプロトコルを使わなくても、フォーマットに従ったテキストデータを出せば良いだけなのでperlで作ります。cactiには作ったスクリプトを実行してくれる機能もついてます。

#!/usr/bin/perl
$sensors = `ssh root\@192.168.24.15  sensors `; 
$cpu = `echo "$sensors" | grep "CPU Temp:"`;
$sys = `echo "$sensors" | grep "Sys Temp:"`;
$fan = `echo "$sensors" | grep "CPU Fan:"`;
$cpu =~ /\d+/;
print "cpu:$& ";
$sys =~ /\d+/;
print "sys:$& ";
$fan =~ /\d+/;
$fan = int($& / 30);

1行、改行無し、半角スペースで区切るフォーマットです。同じグラフに出す場合は桁数を揃えないと破綻するので、ファンのスピードは30で割ってます。他にもcactiのscriptsディレクトリにサンプルが置いてるので、それを参考に作れば良いと思います。あ、sensorsってのはLm_sensorsと言って、Linuxでハードウェアの情報を出力してくれるアプリです。
lm-sensors
うちの環境で実行すると、こんな感じで出力されます。

  > ssh root@192.168.24.15 sensors

83627ehf-isa-0290
Adapter: ISA adapter
VCore:     +1.28 V  (min =  +0.00 V, max =  +1.74 V) 
in1:      +10.45 V  (min =  +5.81 V, max =  +5.23 V) ALARM
AVCC:      +3.33 V  (min =  +3.86 V, max =  +0.77 V) ALARM
3VCC:      +3.33 V  (min =  +3.18 V, max =  +0.38 V) ALARM
in4:       +1.83 V  (min =  +0.52 V, max =  +0.93 V) ALARM
in5:       +1.84 V  (min =  +1.46 V, max =  +0.03 V) ALARM
in6:       +5.89 V  (min =  +4.35 V, max =  +6.40 V) 
VSB:       +3.31 V  (min =  +2.05 V, max =  +0.86 V) ALARM
VBAT:      +3.33 V  (min =  +1.07 V, max =  +2.54 V) ALARM
in9:       +1.69 V  (min =  +1.81 V, max =  +1.35 V) ALARM
Case Fan:    0 RPM  (min = 10546 RPM, div = 128) ALARM
CPU Fan:   612 RPM  (min = 84375 RPM, div = 16) ALARM
Aux Fan:     0 RPM  (min = 10546 RPM, div = 128) ALARM
fan5:        0 RPM  (min = 10546 RPM, div = 128) ALARM
Sys Temp:    +40°C  (high =  +104°C, hyst =  +126°C)  
CPU Temp:  +31.0°C  (high = +120.0°C, hyst = +115.0°C)  
AUX Temp:  +42.0°C  (high = +80.0°C, hyst = +75.0°C)  

これを上のスクリプトで拾ってるわけですね。何でsshで繋いでるのかと言うと、xenという仮想環境を使っていて、WebServerやRRDTOOLの動いているサーバはゲストOSなのです。ハードウェアの情報はホストOS上でしか取れないので、sshでホストOSに接続してます

スクリプトをcactiに登録(Data Input Methods)

ここからはWEB上で作業が出来ます。さっき作ったperlスクリプトをcactiに登録します。

スクリプトから取得するデータ定義(Data Templates)

スクリプトで出力するcpuとsysとfanを作成しました。

rrdの作成(Data Sources)

RRDTOOLは「.rrd」というデータベースファイルを使用するのでcactiで作成します。

いよいよグラフの作成

定義したデータをごにょごにょしてグラフを作成していきます。

グラフの形式や色など、簡単に設定出来ます。

完成

出来上がったグラフ

以上、駆け足で設定してみました。SNMPを使わなくても簡単に奇麗なグラフが描けるのは魅力的かと。cactiにはグラフの一覧を良い感じで出力する機能もありますが、毎回動的に生成するので数が多くなると重いかもしれません。手順としては~/cacti/poller.phpをcronで5分置きに回してデータベースの更新、フロントエンドはそのデータベースからグラフを出してます。RRDTOOLは項目が多くて覚えるのが大変なので、cactiで設定ファイルだけ作って自分でフロントエンドを作るのも有りかな。