diff --git a/Changes b/Changes index e7744c7..ccd35b3 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,7 @@ Current - fixed test case: find log dir using Apache::Test - update Makefile.PL for mod_perl2 support, and check min Apache::Test version. + - add Apache2::Profiler for mod_perl2 - various Makefile.PL updates. - sign dist, add signature test - reorganize test files diff --git a/MANIFEST b/MANIFEST index 938b6f5..c8aff70 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,6 +1,7 @@ Changes inc/My/Util.pm lib/Apache/Profiler.pm +lib/Apache2/Profiler.pm Makefile.PL MANIFEST This list of files MANIFEST.SKIP diff --git a/lib/Apache2/Profiler.pm b/lib/Apache2/Profiler.pm new file mode 100644 index 0000000..cd2f181 --- /dev/null +++ b/lib/Apache2/Profiler.pm @@ -0,0 +1,146 @@ +package Apache2::Profiler; + +use strict; + +use mod_perl2 1.999022; +use Apache2::Log; +use Apache2::RequestRec; +use Apache2::RequestUtil; +use APR::Pool; +use Time::HiRes qw(gettimeofday); + +our $VERSION = 0.01; + +sub handler { + my $r = shift; + + my $start_time = gettimeofday(); + + $r->pool->cleanup_register(\&compute, [$r, $start_time]); +} + +sub compute { + my ($r, $start_time) = (@_ && ref $_[0] eq 'ARRAY' ? @{ +shift } : @_); + + return unless defined $start_time; + + my $now = gettimeofday(); + my $diff = $now - $start_time; + + my $threshold = $r->dir_config('ProfileLongerThan') || 0; + if ($diff >= $threshold) { + my $uri = $r->uri; + + # handle query string + if (my $query = $r->args) { + $uri .= "?$query"; + } + + $r->log->notice("uri: $uri takes $diff seconds"); + } +} + +1; + +__END__ + +=head1 NAME + +Apache2::Profiler - profiles time seconds needed for every request + +=head1 SYNOPSIS + + + PerlInitHandler Apache2::Profiler + + +=head1 DESCRIPTION + +Apache2::Profiler is a mod_perl init (and cleanup) handler to profile time +taken to process one request. Profiled data is reported to the +Apache Log file. It'd be useful to profile some heavy application taking a long +time to proceed. + +Apache2::Profiler is for C version 2.0 or later. If you are using +C version 1.x, you need Apache::Profiler instead. + +It uses L to take milliseconds, and outputs profiled data +as Apache log C level like: + + [Tue Oct 7 20:52:53 2003] [notice] [client 127.0.0.1] uri: /test.html takes 0.0648910999298096 seconds + +=head1 CONFIGURATION + +=over 4 + +=item ProfileLongerThan + + PerlSetVar ProfileLongerThan 0.5 + +specifies lower limit of request time taken to profile. This example only logs +requests which takes longer than 0.5 seconds. This value is set to 0 by +default, which means it logs all requests. + +=back + +=head1 TODO + +=over 4 + +=item * + +customizable log format (exportable to some profiling tools) + +=item * + +profiles CPU time rather than C + +=back + +patches are always welcome! + +=head1 SOURCE + +You can contribute or fork this project via github: + +http://github.com/mschout/apache-profiler + + git clone git://github.com/mschout/apache-profiler.git + +=head1 BUGS + +Please report any bugs or feature requests to +bug-apache-profiler@rt.cpan.org, or through the web +interface at http://rt.cpan.org/ + +=head1 AUTHOR + +Michael Schout Emschout@cpan.orgE + +Initial implementation by Tatsuhiko Miyagawa Emiyagawa@bulknews.netE. + +=head1 COPYRIGHT & LICENSE + +Copyright 2009 Michael Schout. + +This program is free software; you can redistribute it and/or modify it under +the terms of either: + +=over 4 + +=item * + +the GNU General Public License as published by the Free Software Foundation; +either version 1, or (at your option) any later version, or + +=item * + +the Artistic License version 2.0. + +=back + +=head1 SEE ALSO + +L, L + +=cut