Catalyst::Stats — класс Catalyst, работа со статистикой, измерение времени выполнения отдельных экшенов.
Модуль Catalyst::Stats используется по-умолчанию, для вывода информации в логе Сatalyst-приложения. Если вы хотите заменить стандартный модуль чем-то своим, понадобится внести изменения в конфиг MyApp.pm:
|
1 |
__PACKAGE__->stats_class( "My::Stats" ); |
Кроме того, ваш модуль должен будет реализовать те же самые методы, что и Catalyst::Stats.
Синтаксис
|
1 2 3 4 5 6 7 |
$stats = $c->stats; $stats->enable(1); $stats->profile($comment); $stats->profile(begin => $block_name, comment =>$comment); $stats->profile(end => $block_name); $elapsed = $stats->elapsed; $report = $stats->report; |
Catalyst использует Catalyst::Stats чтобы информировать вас о времени выполнения экшенов. Вы можете добавить собственные контрольные точки в код приложения, для более подробной отчетности и контроля.
Пример:
Информация в логе при обращении по адресу http://localhost:3000/support до внесения изменений в код экшена, стандартный вывод:
|
1 2 3 4 5 6 7 8 |
[info] Request took 0.123658s (8.087/s) .------------------------------------------------------------+-----------. | Action | Time | +------------------------------------------------------------+-----------+ | /support/index | 0.116085s | | -> MyApp::View::TT->process | 0.110125s | | /end | 0.000368s | '------------------------------------------------------------+-----------' |
Теперь добавим в код экшена вызов метода profile():
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->stats->profile(begin => "index"); $c->stats->profile("starting critical bit"); $c->stash->{template} = 'support/index.tt'; $c->stash->{message} = 'Hello World!'; $c->stats->profile("completed critical bit"); $c->stats->profile(end => "index"); $c->forward('View::TT'); } |
Catalyst::Stats — используется Catalyst-приложением по умолчанию, поэтому, добавляя дополнительные инструкции в экшен, нет необходимости указывать в начале файла код подключения модуля, или дополнительные параметры конфигурации, или т.п.
Данные в логе после внесения изменений и выполнения запроса к странице http://localhost:3000/support :
|
1 2 3 4 5 6 7 8 9 10 11 |
[info] Request took 0.160763s (6.220/s) .------------------------------------------------------------+-----------. | Action | Time | +------------------------------------------------------------+-----------+ | /support/index | 0.144864s | | index | 0.000684s | | - starting critical bit | 0.000215s | | - completed critical bit | 0.000263s | | -> MyApp::View::TT->process | 0.142974s | | /end | 0.000369s | '------------------------------------------------------------+-----------' |
Методы Catalyst::Stats
new
Создает новый объект Catalyst::Stats.
|
1 |
$stats = Catalyst::Stats->new; |
enable
|
1 2 |
$stats->enable(0); $stats->enable(1); |
Отключает или включает вывод статистики. По умолчанию обычно включен. Т.е. если вы добавите в код $stats->enable(0) :
|
1 2 3 4 5 6 7 8 9 10 |
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->stats->enable(0); $c->stash->{template} = 'support/index.tt'; $c->stash->{message} = 'Hello World!'; $c->forward('View::TT'); } |
То вся статистика с момента отработки этого кода, перестанет выводиться:
|
1 2 3 4 5 6 |
[info] Request took 0.005904s (169.377/s) .------------------------------------------------------------+-----------. | Action | Time | +------------------------------------------------------------+-----------+ | /support/index | 0.002187s | '------------------------------------------------------------+-----------' |
profile
|
1 2 3 |
$stats->profile($comment); $stats->profile(begin => $block_name, comment =>$comment); $stats->profile(end => $block_name); |
Устанавливает контрольные точки для профайлинга. Можно использовать в паре begin/end, и тогда он будет измерять время выполнения от того места, где установлен begin. Либо можно устанавливать контрольные точки без begin/end, и тогда в статистике будет выводиться время, прошедшее с момента последнего вывода статистики в лог (либо это был вывод связанный с началом текущего экшена, либо предыдущей контрольной точки).
|
1 2 3 4 5 6 7 8 9 10 11 12 |
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->stats->profile("starting critical bit"); $c->stash->{template} = 'support/index.tt'; $c->stash->{message} = 'Hello World!'; $c->stats->profile("completed critical bit"); $c->forward('View::TT'); } |
|
1 2 3 4 5 6 7 8 9 10 |
[info] Request took 0.150029s (6.665/s) .------------------------------------------------------------+-----------. | Action | Time | +------------------------------------------------------------+-----------+ | /support/index | 0.137463s | | - starting critical bit | 0.000325s | | - completed critical bit | 0.000237s | | -> MyApp::View::TT->process | 0.135906s | | /end | 0.000380s | '------------------------------------------------------------+-----------' |
Следующие аргументы — ключ/значение могут использоваться в методе profile():
- begin => ACTION — Помечает начало контрольного блока. Этот блок в статистике будет отмечен как отдельный «подраздел».
- end => ACTION — Помечает конец контрольного блока. Используется в паре с меткой begin.
- comment => COMMENT — Помечает очередную контрольную точку и выводит ее в статистике с указанным комментарием. Выражение
1$c->stats->profile(comment => "COMMENT");
идентично
1$c->stats->profile("COMMENT"); - uid => UID — Устанавливает предопределенный уникальный ID. Может оказаться полезным, для случаях сложной логики профилирования.
- parent => UID — Связь контрольной точки с ранее установленным ID.
created
|
1 |
($seconds, $microseconds) = $stats->created; |
Возвращает время создания объекта, в gettimeofday формате, в секундах и микросекундах.
elapsed
|
1 |
$elapsed = $stats->elapsed |
Возвращает время, которое прошло с момента создания объекта Catalyst::Stats, в секундах.
report
|
1 2 3 |
print $stats->report ."\n"; $report = $stats->report; @report = $stats->report; |
Метод при вызове в скалярном контексте возвращает текстовый отчет. По сути, это те же данные, какие выводятся в конце выполнения каждого запроса в логе, но в данном случае, в отчете содержатся данные только по тем экшенам и контрольным точкам, которые успели выполниться до того момента, когда был вызван метод report():
|
1 2 3 |
my $report = $c->stats->report; $c->log->debug(Dumper($report)); |
|
1 2 3 4 5 6 7 8 9 |
[debug] $VAR1 = '.----------------------------------------------------+-----------. | Action | Time | +-----------------------------------------------------+-----------+ | /support/index | 0.007089s | | - starting critical bit | 0.000313s | | - completed critical bit | 0.000253s | \'----------------------------------------------------+-----------\' '; |
При вызове в контексте массива, метод возвращает сложную структуру данных. Каждая строка структуры содержит данные:
|
1 |
[ depth, description, time, rollup ]. |
|
1 2 3 |
my @report = $c->stats->report; $c->log->debug(Dumper(@report)); |
Результат выполнения данного кода:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[debug] $VAR1 = [ 0, '/support/index', '0.0072', 1 ]; $VAR2 = [ 1, '- starting critical bit', '0.00032', 0 ]; $VAR3 = [ 1, '- completed critical bit', '0.00025', 0 ]; |
Совместимые методы
Некоторые компоненты ожидают, что для работой со статистикой используется не Catalyst::Stats, а Tree::Simple, и они рассчитывают, что будут обращаться к объекту Tree::Simple. Для совместимости в Catalyst::Stats добавлены методы:
- accept
- addChild
- setNodeValue
- getNodeValue
- traverse