Adding Action Timings to your Catalyst Output
About a year ago, onemogin wrote an article on adding action timings to the HTML output of a Catalyst app. To do so, it was necessary to access $c->stats, which at the time was an internal object (that is, there was no published API for it) and therefore subject to change. As of Catalyst-Runtime 5.7012, $c->stats has a defined interface and returns a Catalyst::Stats object (or your own class, if you provide one) rather than the Tree::Simple object that it used to.
It’s easy to fix your code to work with 5.7012. Onemogin’s code in the end() method looked like this:
my $tree = $c->stats(); my $dvisit = new Tree::Simple::Visitor(); $tree->accept($dvisit); $c->stash->{'action_stats'} = $dvisit->getResults();
which needs to become this:
my @report = $c->stats->report;
$c->stash->{action_stats}= \@report;
and your template will also need to change; here’s an example:
<div id="stats"> <table border="0" cellspacing="0" cellpadding="0"> [% space = ' ' %] <tr><th>Action</th><th>Time</th></tr> [% FOREACH r=action_stats %] <tr><td class="description">[% space.repeat(r.0) %][% r.1 | html %]</td> <td class="elapsed">[% UNLESS r.3 %]+[% END %][% r.2 %]s</td></tr> [% END %] </table> </div>
to produce an end result such as:
| Action | Time |
|---|---|
| /default | 0.005895s |
| -> /look_left | 0.00091s |
| - starting critical bit | +0.000479s |
| - critical bit complete | +0.000208s |
| -> /look_right | 0.000587s |
| -> /look_left | 0.000799s |
| - starting critical bit | +0.000441s |
| - critical bit complete | +0.000169s |
| -> /cross_over | 0.001766s |
| /end | 0.000462s |
Here’s the bit of controller code that generated the example:
sub default : Private {
my ( $self, $c ) = @_;
$c->forward('look_left');
$c->forward('look_right');
$c->forward('look_left');
$c->forward('cross_over');
}
sub look_left : Private {
my ( $self, $c ) = @_;
for (1 .. 100) {};
$c->stats->profile("starting critical bit");
for (1 .. 100) {};
$c->stats->profile("critical bit complete");
}
sub look_right : Private {
for (1 .. 1000) {};
}
sub cross_over : Private {
for (1 .. 10000) {};
}
sub end : ActionClass('RenderView') {
my ( $self, $c ) = @_;
my @report = $c->stats->report;
$c->stash->{action_stats}= \@report;
}
Adding Action Timings To Your Output - One Mo’ Gin - Sometimes Once Isn’t Enough said,
April 20, 2008 @ 1:25 am
[...] Jon Schutz recently posted an update to this idea. Please use [...]