DashProfiler
view release on metacpan or search on metacpan
lib/DashProfiler/Core.pm view on Meta::CPAN
=head3 flush_hook
If set, this code reference is called when flush() is called and can influence
its behaviour. For example, this is the flush_hook used by L<DashProfiler::Auto>:
flush_hook => sub {
my ($self, $dbi_profile_name) = @_;
warn $_ for $self->profile_as_text($dbi_profile_name);
return $self->reset_profile_data($dbi_profile_name);
},
See L</flush> for more details.
=head3 granularity
The default C<Path> for the DBI::Profile objects doesn't include time.
The granularity option adds 'C<!Time~$granularity>' to the front of the Path.
So as time passes the samples are aggregated into new sub-trees.
=head3 sample_class
The sample_class option specifies which class should be used to take profile samples.
The default is C<DashProfiler::Sample>.
See the L</prepare> method for more information.
=head3 period_summary
Specifies the name of an extra DBI Profile object to attach to the core.
This extra 'period summary' profile is enabled and reset by the start_sample_period()
method and disabled by the end_sample_period() method.
The mechanism enables a single profile to be used to capture both long-running
sampling (often with C<granularity> set) and single-period (e.g., for a 'debug'
footer on a generated web page)
=head3 period_exclusive
When using periods, via the start_sample_period() and end_sample_period() methods,
DashProfiler can add an additional sample representing the time between the
start_sample_period() and end_sample_period() method calls that I<wasn't>
accounted for by the samples.
The period_exclusive option enables this extra sample. The value of the option
is used as the value for key1 and key2 in the Path.
=head3 period_strict_start
See L</start_sample_period>.
=head3 period_strict_end
See L</end_sample_period>.
=head3 profile_as_text_args
A reference to a hash containing default formatting arguments for the profile_as_text() method.
=head3 extra_info
Can be used to attach any extra information to the profiler core object. That can be useful sometimes in callbacks.
=cut
sub new {
my ($class, $profile_name, $opt_params) = @_;
$opt_params ||= {};
croak "No profile_name given" unless $profile_name && not ref $profile_name;
croak "$class->new($profile_name, $opt_params) options must be a hash reference"
if ref $opt_params ne 'HASH';
our $opt_defaults ||= {
disabled => 0,
sample_class => 'DashProfiler::Sample',
dbi_profile_class => 'DBI::Profile',
dbi_profile_args => {},
flush_interval => 0,
flush_hook => undef,
granularity => 0,
period_exclusive => undef,
period_summary => undef,
period_strict_start => 0x01,
period_strict_end => 0x00,
profile_as_text_args => undef,
extra_info => undef, # for caller to hook in their own data
};
croak "Invalid options: ".join(', ', grep { !$opt_defaults->{$_} } keys %$opt_params)
if keys %{ { %$opt_defaults, %$opt_params } } > keys %$opt_defaults;
my $time = dbi_time();
my $self = bless {
profile_name => $profile_name,
in_use => 0,
in_use_warning_given => 0,
dbi_handles_all => {},
dbi_handles_active => {},
flush_due_at_time => undef,
# for start_period
period_count => 0,
period_start_time => 0,
period_accumulated => 0,
exclusive_sampler => undef,
%$opt_defaults,
%$opt_params,
} => $class;
$self->{flush_due_at_time} = $time + $self->{flush_interval};
lock_keys(%$self);
_load_class($self->{sample_class});
if (my $exclusive_name = $self->{period_exclusive}) {
# create the sampler through which period_exclusive samples are added
# by end_sample_period()
$self->{exclusive_sampler} = $self->prepare($exclusive_name, $exclusive_name);
}
my $dbi_profile = $self->_mk_dbi_profile($self->{dbi_profile_class}, $self->{granularity});
$self->attach_dbi_profile( $dbi_profile, "main", 0 );
if (my $period_summary = $self->{period_summary}) {
my $dbi_profile = $self->_mk_dbi_profile("DashProfiler::DumpNowhere", 0);
( run in 0.743 second using v1.01-cache-2.11-cpan-39bf76dae61 )