以前「StarmanやStarletでmod_statusっぽい情報を得る簡易版Plack::Middleware::ServerStatus」で書いていたPlack::Middleware::ServerStatus::LIteをCPANにリリースしました。
http://search.cpan.org/dist/Plack-Middleware-ServerStatus-LIte/
前回と大きく実装が異なっている箇所があります。1つはプロセスの状態を保持するためにParallel::Scoreboardを使うようになり、$0(PROGRAM_NAME)の書き換えを行わないようになったこと。2つ目はロケタッチを開発しているhideokiさんからの指摘で、アプリケーションが例外を起こしたときにステータスが戻らないという問題への対応をTry::Tinyを使って行っていることが大きな変更点です。
依存は増えましたが、実装は以下のようにシンプル
sub call { my ($self, $env) = @_; $self->set_state("A", $env); try { if( $self->path && $env->{PATH_INFO} eq $self->path ) { $self->_handle_server_status($env); } else { $self->app->($env); } } catch { die $_; } finally { $self->set_state("_"); }; }
ただし、これだけだと一度もリクエストをさばいていないプロセスはステータス情報が全くなく、Parallel::Scoreboard->read_all()では取得できないので、子プロセスのPID収集のためにpsコマンドだけはそのまま使っています
psコマンドのオプションに方言があったり、Windowsで動かないとか問題はあると思いますので、パッチお待ちしています。
ServerStatus::Liteによるステータス情報は以下のようにとれます
% curl http://server:port/server-status Uptime: 1234567789 BusyWorkers: 2 IdleWorkers: 3 -- pid status remote_addr host method uri protocol 20060 A 127.0.0.1 localhost:10001 GET / HTTP/1.1 20061 . 20062 A 127.0.0.1 localhost:10001 GET /server-status HTTP/1.1 20063 . 20064 .
CloudForecastでは、 Apacheで使うHTTPのリソース定義をそのまま使うことができますょ。