Apacheの内部データをGrowthForecastにmod_mruby経由で送ってグラフ化

mod_mrubyからAPIつついてなんか面白い事できないかなぁと考えていたら、GrowthForecastというURLにデータをPOSTするだけでグラフが作れるという素晴らしい管理ツールがあったので、Apacheの内部データをGrowthForecastmod_mruby経由で送ってグラフ化してみました。

GrowthForecastをインストール

このインストールページを参考にインストールすればいいだけでした。ソースダウンロード後はGrowthForecast/ディレクトリでcpanmコマンドを叩くだけで、何よりcpanmコマンドが便利過ぎて感動しました。

cpanm --installdeps .

そして、以下のコマンドでGrowthForecastを起動します。簡単にインストールできるのは素晴らしいという見本みたいなツールでした。

./growthforecast.pl

Apacheから定期的にGrowthForecastにデータをPOST

Apacheの内部データ、例えばスコアボードの値をグラフ化する、というのは結構やっているのかと思ったんですが、意外と面倒なようで、ネット上にあまり前例はありませんでした。mod_mrubyを使えばスコアボードだけでなく、request_recやserver_rec等の各種構造体の中身も結構簡単にグラフ化できそうだなぁということで試しにやってみました。大体やったことは以下です。

  • mod_mrubyでApacheから内部データを取得しPOSTスクリプトをフックする
  • 特定のヘッダを含むアクセスのみGrowthForecastにデータをPOST
  • 特定のヘッダを含むアクセスをcurlでローカルからアクセス

まず、mrubyでGrowthForecastにデータをPOSTするために、mrubyの拡張ライブラリを利用してApacheからフックするスクリプトを実装しました。ソースはmod_mrubyのGitに上げています。実装のメイン処理は以下です。

host    = "example.com"
port    = "5125"

service = "apache"
section = "scoreboad"
gragh   = "worker"

headers_in = Apache::Headers_in.new()
url        = sprintf("http://%s:%s/api/%s/%s/%s", host, port, service, section, gragh)

if headers_in["X-PushStatus"]
  http       = HttpRequest.new()
  score      = Apache::Scoreboard.new()
  response = http.post(url, {
    :number => score.busy_worker,
    :color  => "#333399"
  })
  Apache.errlogger(4, "response = " + response.body)
end

適当にX-PushStatusという名前のヘッダを準備して、このヘッダがある場合のみGrowthForecastにPOSTするように実装しています。なぜわざわざこんな事をしたのかというと、Apacheのフックは仕様上リクエスト毎にフックされてしまいます。

その都度、このPOST処理が走るとさすがにやりすぎなので、5分起きにこのスクリプトをフックするにはどうしたらいいか、と考えた結果、暫定で思いついたのが、X-PushStatusヘッダを含むリクエストを、curlでローカルからアクセスするようにコマンドをcronに登録しておく事でした。

もっと良い方法があると思うのですが、グーグル先生に聞いてもあまりでてこなかったので、この方法にしました。定期的にApache内部のフックを行う良い方法があればぜひ教えてください。

とりあえず今回はApache::Scoreboadの中でとれる値であるbusy_workerの値をPOSTすることにしました。上記のようにscore.busy_workerを渡すだけです。

後は、このソースを適当にリクエスト処理を返す前のフック時であるFixupのフェイズでフックしました。

mrubyFixupsMiddle /path/to/apache-growthforecast.rb

で、cronに5分毎にX-PushStatusヘッダを含んだリクエストを投げるようにしました。

*/5 * * * * curl -H "X-PushStatus: 1" http://example.com/ >> /path/to/log 2>&1

以上の設定と実装により、5分起きにApacheにアクセスして、そのアクセスにはX-PushStatusヘッダが含まれているため、mod_mrubyでフックされるスクリプト内でGrowthForecastにデータがPOSTされ、以下のようにグラフが生成されました。

これで、スコアボードはもちろんのこと、request_recなどの各種構造体の中身をPOSTできます。Apacheの内部の色々な情報をGrowthForecastに投げて複合グラフを作ったりして、楽しいApache監視生活が送れそうですね。