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__