mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-10-21 18:24:38 +00:00
Added JSONReportFormatter, a subclass of QueryReportFormatter that does what it says on the tin. WIP as it does not report profile or prepared statement data yet
This commit is contained in:
84
lib/JSONReportFormatter.pm
Normal file
84
lib/JSONReportFormatter.pm
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
package JSONReportFormatter;
|
||||
use Mo;
|
||||
use JSON;
|
||||
|
||||
use constant PTDEBUG => $ENV{PTDEBUG} || 0;
|
||||
|
||||
extends qw(QueryReportFormatter);
|
||||
|
||||
override [qw(rusage date hostname files header profile prepared)] => sub {
|
||||
return;
|
||||
};
|
||||
|
||||
override event_report => sub {
|
||||
my ($self, %args) = @_;
|
||||
return $self->event_report_values(%args);
|
||||
};
|
||||
|
||||
override query_report => sub {
|
||||
my ($self, %args) = @_;
|
||||
foreach my $arg ( qw(ea worst orderby groupby) ) {
|
||||
die "I need a $arg argument" unless defined $arg;
|
||||
}
|
||||
my $ea = $args{ea};
|
||||
my $groupby = $args{groupby};
|
||||
my $worst = $args{worst};
|
||||
|
||||
my $q = $self->Quoter;
|
||||
my $qv = $self->{QueryReview};
|
||||
my $qr = $self->{QueryRewriter};
|
||||
|
||||
my $query_report_vals = $self->query_report_values(%args);
|
||||
|
||||
# Sort the attributes, removing any hidden attributes.
|
||||
my $attribs = $self->sort_attribs(
|
||||
($args{select} ? $args{select} : $ea->get_attributes()),
|
||||
$ea,
|
||||
);
|
||||
|
||||
ITEM:
|
||||
foreach my $vals ( @$query_report_vals ) {
|
||||
my $item = $vals->{item};
|
||||
my $samp_query = $vals->{samp_query};
|
||||
# ###############################################################
|
||||
# Print the standard query analysis report.
|
||||
# ###############################################################
|
||||
$vals->{event_report} = $self->event_report(
|
||||
%args,
|
||||
item => $item,
|
||||
sample => $ea->results->{samples}->{$item},
|
||||
rank => $vals->{rank},
|
||||
reason => $vals->{reason},
|
||||
attribs => $attribs,
|
||||
db => $vals->{default_db},
|
||||
);
|
||||
|
||||
if ( $groupby eq 'fingerprint' ) {
|
||||
if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) {
|
||||
if ( $item !~ m/^(?:insert|replace)/ ) { # No EXPLAIN
|
||||
$vals->{for_explain} = "EXPLAIN /*!50100 PARTITIONS*/\n$samp_query\\G\n";
|
||||
$vals->{explain_report} = $self->explain_report($samp_query, $vals->{default_db});
|
||||
}
|
||||
}
|
||||
else {
|
||||
my $converted = $qr->convert_to_select($samp_query);
|
||||
if ( $converted
|
||||
&& $converted =~ m/^[\(\s]*select/i ) {
|
||||
$vals->{for_explain} = "EXPLAIN /*!50100 PARTITIONS*/\n$converted\\G\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( $groupby eq 'tables' ) {
|
||||
my ( $db, $tbl ) = $q->split_unquote($item);
|
||||
$vals->{tables_report} = $self->tables_report([$db, $tbl]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return encode_json($query_report_vals) . "\n";
|
||||
};
|
||||
|
||||
1;
|
||||
}
|
Reference in New Issue
Block a user