From: Darold Gilles Date: Thu, 26 Mar 2015 18:59:44 +0000 (+0100) Subject: Add per user detail information (total duration and times executed) for each query... X-Git-Tag: v6.3~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1c8e4f91efaf7696bb41706bd3685db20a756db;p=pgbadger Add per user detail information (total duration and times executed) for each query reported in "Time consuming queries", "Most frequent queries" "and Normalized slowest queries". The details are visible from a new button called "User(s) involved" near the "Examples" button. Thanks to Guillaume Le Bihan for the patch and tsn77130 for the feature request. --- diff --git a/pgbadger b/pgbadger index 1a6dd58..f61dacd 100755 --- a/pgbadger +++ b/pgbadger @@ -7329,6 +7329,10 @@ sub print_time_consuming %hourly_duration = (); $ctime = timegm_nocheck(0, 0, 0, 19, 4, 80) * 1000; + my $users_involved = ''; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + $users_involved = qq{}; + } my $query_histo = &flotr2_histograph($graphid++, 'timeconsuming_graph_'.$rank, $graph_data{count}, $graph_data{duration}, 'Avg. queries', 'Avg. duration', $etime, $ctime); @@ -7364,7 +7368,35 @@ sub print_time_consuming

-

+

$users_involved

+}; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + print $fh qq{ + +
+
+}; + my $idx = 1; + foreach my $u (sort {$normalyzed_info{$k}{users}{$b}{duration} <=> $normalyzed_info{$k}{users}{$a}{duration}} keys %{$normalyzed_info{$k}{users}}) { + if ($normalyzed_info{$k}{users}{$u}{duration} > 0) { + my $details = "[User: $u"; + $details .= " - Total duration: ".&convert_time($normalyzed_info{$k}{users}{$u}{duration}); + $details .= " - Times executed: $normalyzed_info{$k}{users}{$u}{count}"; + $details .= " ]\n"; + print $fh qq{ +
$details
+}; + $idx++; + } + } + print $fh qq{ +
+

+
+ +}; + } + print $fh qq{
@@ -7495,6 +7527,11 @@ sub print_most_frequent my $query_histo = &flotr2_histograph($graphid++, 'mostfrequent_graph_'.$rank, $graph_data{count}, $graph_data{duration}, 'Avg. queries', 'Avg. duration', $etime, $ctime); + my $users_involved = ''; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + $users_involved = qq{}; + } + print $fh qq{ $rank @@ -7527,7 +7564,36 @@ sub print_most_frequent

-

+

$users_involved

+}; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + print $fh qq{ + +
+
+}; + my $idx = 1; + foreach my $u (sort {$normalyzed_info{$k}{users}{$b}{duration} <=> $normalyzed_info{$k}{users}{$a}{duration}} keys %{$normalyzed_info{$k}{users}}) { + if ($normalyzed_info{$k}{users}{$u}{duration} > 0) { + my $details = "[User: $u"; + $details .= " - Total duration: ".&convert_time($normalyzed_info{$k}{users}{$u}{duration}); + $details .= " - Times executed: $normalyzed_info{$k}{users}{$u}{count}"; + $details .= " ]\n"; + print $fh qq{ +
$details
+}; + $idx++; + } + } + print $fh qq{ +
+

+
+ +}; + } + print $fh qq{ +
@@ -7662,6 +7728,11 @@ sub print_slowest_queries my $query_histo = &flotr2_histograph($graphid++, 'normalizedslowest_graph_'.$rank, $graph_data{count}, $graph_data{duration}, 'Avg. queries', 'Avg. duration', $etime, $ctime); + my $users_involved = ''; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + $users_involved = qq{}; + } + print $fh qq{ $rank @@ -7694,7 +7765,36 @@ sub print_slowest_queries

-

+

$users_involved

+}; + if (scalar keys %{$normalyzed_info{$k}{users}} > 0) { + print $fh qq{ + +
+
+}; + my $idx = 1; + foreach my $u (sort {$normalyzed_info{$k}{users}{$b}{duration} <=> $normalyzed_info{$k}{users}{$a}{duration}} keys %{$normalyzed_info{$k}{users}}) { + if ($normalyzed_info{$k}{users}{$u}{duration} > 0) { + my $details = "[User: $u"; + $details .= " - Total duration: ".&convert_time($normalyzed_info{$k}{users}{$u}{duration}); + $details .= " - Times executed: $normalyzed_info{$k}{users}{$u}{count}"; + $details .= " ]\n"; + print $fh qq{ +
$details
+}; + $idx++; + } + } + print $fh qq{ +
+

+
+ +}; + } + print $fh qq{ +
@@ -8627,6 +8727,12 @@ sub load_stats $normalyzed_info{$stmt}{tempfiles}{maxsize} = $_normalyzed_info{$stmt}{tempfiles}{maxsize}; } } + + foreach my $u (keys %{$_normalyzed_info{$stmt}{users}} ) { + foreach my $k (keys %{$_normalyzed_info{$stmt}{users}{$u}} ) { + $normalyzed_info{$stmt}{users}{$u}{$k} += $_normalyzed_info{$stmt}{users}{$u}{$k}; + } + } } ### session_info ### @@ -9961,6 +10067,7 @@ sub store_queries # Store normalized query total duration $normalyzed_info{$normalized}{duration} += $cur_info{$t_pid}{duration}; $normalyzed_info{$normalized}{chronos}{"$cur_day_str"}{"$cur_hour_str"}{min_duration}{$cur_info{$t_pid}{min}} += $cur_info{$t_pid}{duration}; + # Store min / max duration if (!exists $normalyzed_info{$normalized}{min} || ($normalyzed_info{$normalized}{min} > $cur_info{$t_pid}{duration})) { $normalyzed_info{$normalized}{min} = $cur_info{$t_pid}{duration}; @@ -9969,6 +10076,10 @@ sub store_queries $normalyzed_info{$normalized}{max} = $cur_info{$t_pid}{duration}; } + # Stores query/user information + $normalyzed_info{$normalized}{users}{$cur_info{$t_pid}{dbuser}}{duration} += $cur_info{$t_pid}{duration}; + $normalyzed_info{$normalized}{users}{$cur_info{$t_pid}{dbuser}}{count}++; + # Store normalized query count and duration per time $normalyzed_info{$normalized}{chronos}{"$cur_day_str"}{"$cur_hour_str"}{duration} += $cur_info{$t_pid}{duration};