CloudForecastでリソース監視をする際の情報取得方法、グラフの設定を行うモジュールの作り方の紹介です。前のエントリーで紹介したgearman-starter.plのスコアボードによるステータス情報を取得してグラフにしてみます。

まず、gearman-starter.plのステータスを再確認します。telnetでみるとこんな感じです。

% telnet localhost 7005
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
System: gearman_servers: 127.0.0.1:7004 class: MyWorker
Uptime: 20
BusyWorkers: 0
IdleWorkers: 10
--
pid       Status Counter Comment
1630           . 0
1631           . 0
1632           . 0
1633           . 0
1634           . 0
1635           . 0
1636           . 0
1637           . 0
1638           . 0
1639           . 0


前回より若干情報が増えてます。このうち、BusyWorkersとIdleWorkersの値がグラフにできそうです。BusyとIdleの組み合わせは、Apacheの監視と同じです。Apacheのグラフは以下のイメージ。

apache-graph.png

gearman-starterのグラフはstarterの機能に(max|min)spareworkersがないので上限値の移動はしませんが、これとほぼ同じになります。次に、モジュールの作成です。

cloudforecastに独自にリソース定義モジュールを追加する時は、site-libディレクトリを作成し、その中にファイルを入れるのがおすすめです。各種のscriptで既にライブラリパスに追加されてたり、ファイル更新を検知しての自動再起動モードの対象にも入っています。

% cd path/to/cloudforecast
% mkdir -p site-lib/CloudForecast/Data


このディレクトリの中にモジュールを入れます。名前はGearmanstarter.pmとします。ソース全文はgistにあげました。

package CloudForecast::Data::Gearmanstarter;

use CloudForecast::Data -base;
use IO::Socket::INET;


パッケージ宣言をし、CloudForecast::Dataを「-base」引数付きで読み込みます。

rrds map { [$_,'GAUGE'] } qw/busy idle/;


グラフやリソース取得の設定はDSLっぽく書いていきます。まず「rrds」ではデータを保存していくRRDtoolのスキーマを設定します。

rrds ['名前','データソースタイプ'], [], [], ..;
rrds '名前', 'データソースタイプ';


どちらのフォーマットでも記述可能です。複数のステータスを保存する場合には、rrdsを複数回書くこともできます。「データソースタイプ」はいくつかの種類があります。詳しくはITmediaの記事RRDtoolsの公式のドキュメントが参考になります。よく利用するタイプとして、

  • GAUGE - その瞬間の値。グラフではそのままの値が利用される
  • COUNTER - カウンターのように時刻が進むと増え続けていく値。グラフでは差分をとる

この2種類を覚えておけば大丈夫です。一度作成されたスキーマは変更できないので注意してください

graphs 'status' => 'worker status';


これは、グラフの設定です。グラフを区別するためのキーワードやラベルです。

graphs 'key', 'label';
graphs 'foo', 'foo usage';


一つのリソース定義で複数のグラフを作成する事もできます。この場合は複数回graphsを書きます。

いよいよ、データを取得する部分。

fetcher {
    my $c = shift;

    my $host = $c->address;
    my $port = $c->args->[0] || 9000;

    my $sock = IO::Socket::INET->new(
        PeerAddr => $host,
        PeerPort => $port,
        Proto    => 'tcp',
        Timeout  => 5,
    );

    die "could not connecet to $host:$port" unless $sock;
    my $raw_stats;
    $sock->sysread( $raw_stats, 8192 );

    my $busy = -1;
    my $idle = -1;
    foreach my $line ( split /[\r\n]+/, $raw_stats ) {
        if ( $line =~ /^Busy.+: (\d+)/ ) {
            $busy = $1;
        }
        if ( $line =~ /^Idle.+: (\d+)/ ) {
            $idle = $1;
        }
    }
    return [$busy,$idle];
};


普通のperlのコードで書けます。

fetcher sub { };


IO::Socketでgearman-starterの管理ポートに接続をし、ステータスをパースしています。最後に、取得したデータを、rrdsに登録した順序で配列のリファレンスで返します。$cはCloudForecast::Data::Gearmanstarterのオプジェクトで、以下のメソッドも利用できます。

  • $c->hostname - サーバ一覧で設定したサーバのホスト名
  • $c->address - サーバ一覧で設定したIPアドレス
  • $c->detail - サーバ一覧で設定したコメント
  • $c->args->[0,,,] - リソース定義のオプション。配列のリファレンス
  • $c->component() - 共通で使えるデータ取得ライブラリ

argsは、監視項目設定の値です。監視項目で

- modue_name:option1:option2:..


と書いた場合にコロンで区切った値が配列として入ってきます。Gearmanstarterでは、管理ポートの番号を渡す事にします。

- gearmanstarter:9001


最後にグラフの設定です。DATA以下に@@ graphs_keyで区切って書いていきます。

@@ status
DEF:my1=<%RRD%>:busy:AVERAGE
DEF:my2=<%RRD%>:idle:AVERAGE
AREA:my1#00C000:Busy  
GPRINT:my1:LAST:Cur\: %4.1lf
GPRINT:my1:AVERAGE:Ave\: %4.1lf
GPRINT:my1:MAX:Max\: %4.1lf
GPRINT:my1:MIN:Min\: %4.1lf\c
STACK:my2#0000C0:Idle  
GPRINT:my2:LAST:Cur\: %4.1lf
GPRINT:my2:AVERAGE:Ave\: %4.1lf
GPRINT:my2:MAX:Max\: %4.1lf
GPRINT:my2:MIN:Min\: %4.1lf\c


これはApacheの定義モジュールと全く同じです。<%RRD%>と書かれた部分がrrdtoolのデータサイズファイルのパスに自動で置き換わります。グラフの細かいオプションはほかのリソース定義やドキュメントを参考にしてください

これでモジュールが完成しました。あとはCloudForecastの監視項目のカスタマイズ方法で書きました、監視項目設定ファイルに追加すればすぐに使えます。

リソース監視定義モジュールでは、ここで説明したデータの取得とグラフ化だけではなく、システムの情報を取得、保存し、Web画面に表示するカスタマイズも可能です。これは別途解説します。

あとは、テストをどうやって書くか悩み中

このブログ記事について

このページは、Masahiro Naganoが2010年7月 9日 16:43に書いたブログ記事です。

ひとつ前のブログ記事は「CloudForecastの監視項目のカスタマイズ方法」です。

次のブログ記事は「バスのミニカー買った」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja