HE::Middleware::Profile
- 標準のloggerなようなものがHTTP::Engine::Middlewareにあれば、HE::Middlewareの用途が広がりそう。
- WAFのmiddlewareとしなくてもよいものが結構ありそう
- HE::Middleware::Profileを実装してみた感じ、Profilerそのものを差し替えられるとよさそう。configとして差し替えるものが、Middlewareのインスタンス変数になっているほうがよさそうということ。そうすると、WAFで使うときはProfilerだけ差し替えればいいということになる。
- HTTP::Engine::Middleware::Profile::Profilerという名前でデフォルトのProfilerを作っておけばいいのかなぁ。Middleware以下にいれておいたほうがいいものなのかが少し悩ましい。
改善前
package HTTP::Engine::Middleware::Profile; use HTTP::Engine::Middleware; use Time::HiRes qw(time); has 'start_time' => ( is => 'rw', ); has 'end_time' => ( is => 'rw' ); has 'logger' => ( is => 'rw', lazy => 1, builder => 'build_logger', ); # logging functionality should be provided from HE::Middleware sub build_logger { if ( eval "require Log::Dispatch; require Log::Dispatch::Screen; 1" ) { my $dispatcher = Log::Dispatch->new; $dispatcher->add( Log::Dispatch::Screen->new( name => 'screen', min_level => 'debug', ) ); return $dispatcher; } else { die 'Need to setup logger instance'; } } before_handle { my ( $c, $self, $req ) = @_; $self->start; }; after_handle { my ( $c, $self, $req, $res ) = @_; $self->end; $self->report; $res; }; start { shift->start_time( time() ); } sub end { shift->end_time( time() ); } sub report { my $self = shift; my $elapsed = $self->end_time - $self->start_time; my $message = "Request handling execution time: $elapsed secs\n"; $self->logger->log( level => 'info', message => $message ); } __MIDDLEWARE__ __END__
改善後のイメージ実装
package HTTP::Engine::Middleware::Profile; use HTTP::Engine::Middleware; use HTTP::Engine::Middleware::Profile::Profiler; use Time::HiRes qw(time); has 'profiler' => ( is => 'rw', default => sub { HTTP::Engine::Middleware::Profile::Profiler->new( shift->logger); } ); before_handle { my ( $c, $self, $req ) = @_; $self->profiler->start; $req; }; after_handle { my ( $c, $self, $req, $res ) = @_; $self->profiler->end; $self->profiler->report; $res; }; __MIDDLEWARE__ __END__