line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Devel::MojoProf::Reporter; |
2
|
6
|
|
|
6
|
|
43
|
use Mojo::Base -base; |
|
6
|
|
|
|
|
12
|
|
|
6
|
|
|
|
|
40
|
|
3
|
|
|
|
|
|
|
|
4
|
6
|
|
|
6
|
|
3636
|
use Mojo::File 'path'; |
|
6
|
|
|
|
|
186617
|
|
|
6
|
|
|
|
|
2783
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
has handler => undef; |
7
|
|
|
|
|
|
|
has out_csv => $ENV{DEVEL_MOJOPROF_OUT_CSV}; |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
# Note that $prof is just here to be back compat |
10
|
|
|
|
|
|
|
sub report { |
11
|
14
|
|
|
14
|
1
|
85
|
my ($self, $report, $prof) = @_; |
12
|
|
|
|
|
|
|
|
13
|
14
|
100
|
100
|
|
|
96
|
if ($self->{out_fh} ||= $self->_build_out_fh) { |
14
|
11
|
|
|
|
|
32
|
my $message = $report->{message}; |
15
|
11
|
|
|
|
|
35
|
$message =~ s!"!""!g; |
16
|
11
|
|
|
|
|
462
|
return printf {$self->{out_fh}} qq(%s,%.5f,%s,%s,%s,%s,"%s"\n), $report->{t0}[0], |
17
|
11
|
|
|
|
|
22
|
@$report{qw(elapsed class method file line)}, $message; |
18
|
|
|
|
|
|
|
} |
19
|
|
|
|
|
|
|
|
20
|
3
|
50
|
|
|
|
42
|
return $self->{handler}->($prof, $report) if $self->{handler}; |
21
|
0
|
0
|
|
|
|
0
|
return printf STDERR "%.5fms [%s::%s] %s\n", @$report{qw(elapsed class method message)} unless $report->{line}; |
22
|
0
|
|
|
|
|
0
|
return printf STDERR "%.5fms [%s::%s] %s at %s line %s\n", @$report{qw(elapsed class method message file line)}; |
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
sub _build_out_fh { |
26
|
4
|
|
|
4
|
|
10
|
my $self = shift; |
27
|
4
|
100
|
|
|
|
21
|
my $path = $self->out_csv or return; |
28
|
|
|
|
|
|
|
|
29
|
1
|
50
|
|
|
|
16
|
$path = "devel-mojoprof-reporter-$^T.csv" if $path eq '1'; |
30
|
1
|
50
|
|
|
|
28
|
die "[Devel::MojoProf] Cannot overwrite existing $path report.\n" if -e $path; |
31
|
|
|
|
|
|
|
|
32
|
1
|
|
|
|
|
7
|
$path = path $path; |
33
|
1
|
|
|
|
|
21
|
my $fh = $path->open('>'); |
34
|
1
|
|
|
|
|
195
|
$fh->autoflush(1); |
35
|
1
|
|
|
|
|
54
|
printf {$fh} "%s\n", join ',', qw(t0 elapsed class method file line message); |
|
1
|
|
|
|
|
38
|
|
36
|
1
|
|
|
|
|
10
|
$self->out_csv($path->to_abs); |
37
|
1
|
|
|
|
|
76
|
return $fh; |
38
|
|
|
|
|
|
|
} |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
1; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=encoding utf8 |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=head1 NAME |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
Devel::MojoProf::Reporter - Default mojo profile reporter |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
=head1 DESCRIPTION |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
L is an object that is capable of reporting how long |
51
|
|
|
|
|
|
|
certain operations take. |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
See L for how to use this. |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=head1 ATTRIBUTES |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=head2 handler |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
my $cb = $reporter->handler; |
60
|
|
|
|
|
|
|
my $reporter = $reporter->handler(sub { ... }); |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
Only useful to be back compat with L 0.01: |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
$prof->reporter(sub { ... }); |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
Will be removed in the future. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=head2 out_csv |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
$str = $reporter->out_csv; |
71
|
|
|
|
|
|
|
$reporter = $reporter->out_csv("/path/to/file.csv"); |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
Setting this attribute will cause L to print the results to a CSV |
74
|
|
|
|
|
|
|
file, instead of printing to STDERR. This will allow you to post-process |
75
|
|
|
|
|
|
|
the information in a structured way in your favorite spreadsheet editor. |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
You can also set the environment variable C to a given |
78
|
|
|
|
|
|
|
file or give it a special value "1", which will generate a file in the current |
79
|
|
|
|
|
|
|
directory for you, with the filename "devel-mojoprof-reporter-1548746277.csv", |
80
|
|
|
|
|
|
|
where "1548746277" will be the unix timestamp of when you started the run. |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=head1 METHODS |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head2 report |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
$reporter->report(\%report); |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
Will be called every time a meassurement has been done by L. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
The C<%report> variable contains the following example information: |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
{ |
93
|
|
|
|
|
|
|
file => "path/to/app.pl", |
94
|
|
|
|
|
|
|
line => 23, |
95
|
|
|
|
|
|
|
class => "Mojo::Pg::Database", |
96
|
|
|
|
|
|
|
method => "query_p", |
97
|
|
|
|
|
|
|
t0 => [Time::HiRes::gettimeofday], |
98
|
|
|
|
|
|
|
elapsed => Time::HiRes::tv_interval($report->{t0}), |
99
|
|
|
|
|
|
|
message => "SELECT 1 as whatever", |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
The C<%report> above will print the following line to STDERR: |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
0.00038ms [Mojo::Pg::Database::query_p] SELECT 1 as whatever at path/to/app.pl line 23 |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
The log format is currently EXPERIMENTAL and could be changed. |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
Note that the C and C keys can be disabled by setting the |
109
|
|
|
|
|
|
|
C environment variable to "0". This can be useful to |
110
|
|
|
|
|
|
|
speed up the run of the program. |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
=head1 SEE ALSO |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
L. |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=cut |