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