読者です 読者をやめる 読者になる 読者になる

Garuda - サービス監視フレームワーク 作った

稼働中サーバのサービスの状態を監視するためのプラガブルフレームワークGarudaというのを作ったので、codereposに置いておきました。
Plaggerとか、mizzyさんのAssurerみたいなやつです。というか最初はそのAssurerを使う予定だったんですが、自分とこの環境に合わない部分を改造してるうちに、最初から作ってみたくなったんです。
とはいいつつ、かなりの部分をAssureから頂いたり参考にさせてもらっています。Garudaって名前も、Assurer(阿修羅)と同じく八部衆迦楼羅からとりました。迦楼羅って鳥らしいんで、サーバ間飛び回ってる感じで意味的にもいいかなぁと。
プラグインアーキテクチャに関してはClass::Componentをベースにしたので、さほど考える必要はなかったんですが、仕様とか設計で結構悩んで、思ったより時間かかっちゃいましたね。経験値の足りなさを痛感しましたよ。

Assurerとの主な違いは、

  1. テスト対象(target)の取得も、差し替え可能なプラグインのモデルで行うようにした。
  2. formatフェーズが無い。
  3. テストの結果は、失敗したときだけ保存。

です。
1については、大量のroleをconfigに書いていくと管理がしにくくなるので、設定を分けたかったというのと、結果をpublishするときに対象に付随する情報(dbレコードの他カラムとかね)も含められるようにしたかったからです。
2については、単純に監視だけであれば、結果の通知内容はそれほどリッチでなくてもいいような気がしたので、各publishプラグインでテンプレートを当てるだけにしました。
3について、これが自分のところでは一番問題でした。Assurerでは、テストが成功しても失敗しても結果オブジェクトを保存するようになっているのですが、大量のテストを一度に実行するとプロセスのサイズが大変なことになっちゃうんですよね。
そんなわけで、Garudaでは失敗したときだけ、Failureオブジェクトを作り、後のフェーズに渡すようにしました。本当はAssurerのようにTAP形式の出力にしたかったんですが、そこは諦めました。

あくまで、「監視に特化したアプリ」というイメージで開発しましたので、Assurerと比べて機能はかなりシンプルになっています。
他に工夫した点としては、テストジョブを処理するgearman周りの動作を安定させました。興味のある方はコード見みてください。gearman触ったので初めてで、もっといい実装があるかも知れません。つっこみ歓迎します。

テストがまだ足りてませんが、チェックアウトしてmake testが通れば動くと思います。

basic.tとかを参考にconfig書いて

# ./bin/garuda.pl -c /path/to/config

で、いけます。

--debugつけると、ログがターミナルに出力され、publishフェーズは飛ばすようになるので、最初はそれでやったほうがいいと思います。
プラグイン(まだあんまり無いけど)の使い方は、t/plugins/*とかpodとか見てください。

ブクマとかコメントがあれば、さらに詳しい説明も書こうと思います。