Plack::Middleware::ServerStatus::Lite 0.07 でステータス画面に起動してから処理したアクセス数がだせるようになりました。監視ツールと組み合わせてリアルタイムに処理しているアクセス数を確認できます。
Middlewareを読み込む際に counter_file に記録用のファイルを指定すると利用できます。デフォルトは無効です
use Plack::Builder;
use File::Temp qw/tempdir/;
builder {
enable "Plack::Middleware::ServerStatus::Lite",
path => '/server-status',
allow => [ '127.0.0.1', '192.168.0.0/16' ],
counter_file => '/tmp/counter_file',
scoreboard => tempdir(CLEANUP=>1);
sub { [200,['Content-Type'=>'text/plain'],['OK']] }
};
counter_file に File::Temp::tempfile を使う場合は、EXLOCKの解除が必要となります。
my ($fh,$filename) = File::Temp::tempfile( EXLOCK => 0 );
#または
my ($fh,$filename) = File::Temp::tempfile();
undef $fh;
testしていて見事にハマりました。
ステータス画面は次のようになります。Total Accessesの行が増えてますね。
% curl http://localhost:5000/server-status
Uptime: 1338530908 (9 seconds)
Total Accesses: 4321
BusyWorkers: 1
IdleWorkers: 4
--
pid status remote_addr host method uri protocol ss
86963 _ 127.0.0.1 localhost:5000 GET / HTTP/1.0 3
86964 _ 127.0.0.1 localhost:5000 GET / HTTP/1.0 3
86965 _ 127.0.0.1 localhost:5000 GET / HTTP/1.0 3
86966 _ 127.0.0.1 localhost:5000 GET / HTTP/1.0 3
86967 A 127.0.0.1 localhost:5000 GET /server-status HTTP/1.1 0
ちなみに /server-status へのアクセスもカウントされます。
ステータス画面の「ss」も今回のバージョンで追加されたもので、最後のリクエストを受け付けてからの経過時間です。Aapacheのmod_statusにもあります。
カウンターを入れた事で気になるオーバーヘッドですが、それほど大きくはなさそうです。手元のMacbook Airで上のpsgiを実行し、ApacheBenchをかけたところ、
# サーバ起動
% plackup -E production -s Starman app.psgi
# ApachBench
% ab -c 3 -n 4320 http://localhost:5000/
カウンターなしで 1700req/sec。カウンター有りで 1650req/sec。実際のアプリケーションにしたらほぼ誤差になるんじゃないでしょうか。
ServerStatus::Lite へのカウンター機能の追加はsmlyさんからの提案でした。ありがとうございます。Cache::FastMmapやIPC::ShareLiteなどいくつか実装を試しつつ最終的に普通のファイルベースとなりました。