From: Darold Gilles Date: Fri, 19 Feb 2016 19:32:49 +0000 (+0100) Subject: Add report about Most used reserved pools X-Git-Tag: v8.0~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=33cec7ec922549cc380fdd640bc908437e1d8853;p=pgbadger Add report about Most used reserved pools --- diff --git a/pgbadger b/pgbadger index 80f478a..4a45ba0 100755 --- a/pgbadger +++ b/pgbadger @@ -1041,6 +1041,7 @@ my @top_slowest = (); my %normalyzed_info = (); my %error_info = (); my %pgb_error_info = (); +my %pgb_pool_info = (); my %logs_type = (); my %per_minute_info = (); my %pgb_per_minute_info = (); @@ -2132,6 +2133,7 @@ sub init_stats_vars %normalyzed_info = (); %error_info = (); %pgb_error_info = (); + %pgb_pool_info = (); %logs_type = (); %per_minute_info = (); %pgb_per_minute_info = (); @@ -4652,6 +4654,7 @@ sub html_header
  • Connections per user
  • Connections per host
  • +
  • Most used reserved pools
  • Most Frequent Errors/Events
  • @@ -10219,6 +10222,8 @@ sub dump_as_html # Show per host sessions &print_host_pgb_session(); + # Show most used reserved pool + &show_pgb_reserved_pool(); # Show Most Frequent Errors/Events &show_pgb_error_as_html(); } @@ -10809,6 +10814,133 @@ sub show_pgb_error_as_html } +sub show_pgb_reserved_pool +{ + + my $main_pool = ''; + my $main_pool_val = 0; + my $total = 0; + foreach my $k (sort {$pgb_pool_info{$b}{count} <=> $pgb_pool_info{$a}{count}} keys %pgb_pool_info) { + if (!$main_pool || ($pgb_pool_info{$k}{count} > $pgb_pool_info{$main_pool}{count})) { + $main_pool = $k; + $main_pool_val = &comma_numbers($pgb_pool_info{$k}{count}); + } + $total += $pgb_pool_info{$k}{count}; + } + $total = &comma_numbers($total); + + print $fh qq{ +
    +

    Most used reserved pools

    +
    +

    Key values

    +
    +
      +
    • $main_pool Most used reserved pool
    • +
    • $main_pool_val Time used
    • +
    • $total Total time reserved pools was used
    • +
    +
    +
    +
    + + + + + + + + + +}; + my $rank = 1; + foreach my $k (sort {$pgb_pool_info{$b}{count} <=> $pgb_pool_info{$a}{count}} keys %pgb_pool_info) { + next if (!$pgb_pool_info{$k}{count}); + my $count = &comma_numbers($pgb_pool_info{$k}{count}); + my $details = ''; + my %hourly_count = (); + my $days = 0; + foreach my $d (sort keys %{$pgb_pool_info{$k}{chronos}}) { + my $c = 1; + $d =~ /^\d{4}(\d{2})(\d{2})$/; + $days++; + my $zday = "$abbr_month{$1} $2"; + foreach my $h (sort keys %{$pgb_pool_info{$k}{chronos}{$d}}) { + $details .= ""; + $zday = ""; + foreach my $m (sort keys %{$pgb_pool_info{$k}{chronos}{$d}{$h}{min}}) { + my $rd = &average_per_minutes($m, $histo_avg_minutes); + $hourly_count{"$h:$rd"} += $pgb_pool_info{$k}{chronos}{$d}{$h}{min}{$m}; + } + if ($#histo_avgs > 0) { + foreach my $rd (@histo_avgs) { + next if (!exists $hourly_count{"$h:$rd"}); + $details .= ""; + } + } + } + } + # Set graph dataset + my %graph_data = (); + foreach my $h ("00" .. "23") { + foreach my $rd (@histo_avgs) { + $graph_data{count} .= "['$h:$rd'," . (int($hourly_count{"$h:$rd"}/$days) || 0) . "],"; + } + } + $graph_data{count} =~ s/,$//; + %hourly_count = (); + + my $pool_histo = + &jqplot_histograph($graphid++, 'pgbreservedpool_graph_'.$rank, $graph_data{count}, '', 'Avg. used', ''); + + # Escape HTML code in pool message + print $fh qq{ + + + + + +}; + $rank++; + } + if (scalar keys %pgb_pool_info == 0) { + print $fh qq{}; + } + + print $fh qq{ + +
    RankTimes usedReserved pool
    $zday$h" . + &comma_numbers($pgb_pool_info{$k}{chronos}{$d}{$h}{count}) . "
    $zday$h:$rd" . + &comma_numbers($hourly_count{"$h:$rd"}) . "
    $rank$count +

    Details

    +
    +
    $k
    + +
    +

    Times Reported Most used reserved pools #$rank

    + $pool_histo + + + + + + + + + + $details + +
    DayHourCount
    +

    +
    +
    $NODATA
    +
    +
    +}; + +} + + sub load_stats { @@ -10821,6 +10953,7 @@ sub load_stats my %_normalyzed_info = %{$stats{normalyzed_info}}; my %_error_info = %{$stats{error_info}}; my %_pgb_error_info = %{$stats{pgb_error_info}}; + my %_pgb_pool_info = %{$stats{pgb_pool_info}}; my %_connection_info = %{$stats{connection_info}}; my %_pgb_connection_info = %{$stats{pgb_connection_info}}; my %_database_info = %{$stats{database_info}}; @@ -11114,6 +11247,20 @@ sub load_stats } } + ### pgbouncer pool_info ### + + foreach my $q (keys %_pgb_pool_info) { + $pgb_pool_info{$q}{count} += $_pgb_pool_info{$q}{count}; + foreach my $day (keys %{ $_pgb_pool_info{$q}{chronos} }) { + foreach my $hour (keys %{$_pgb_pool_info{$q}{chronos}{$day}}) { + $pgb_pool_info{$q}{chronos}{$day}{$hour}{count} += $_pgb_pool_info{$q}{chronos}{$day}{$hour}{count}; + foreach my $min (keys %{$_pgb_pool_info{$q}{chronos}{$day}{$hour}{min}}) { + $pgb_pool_info{$q}{chronos}{$day}{$hour}{min}{$min} += $_pgb_pool_info{$q}{chronos}{$day}{$hour}{min}{$min}; + } + } + } + } + ### per_minute_info ### foreach my $day (keys %_per_minute_info) { @@ -11475,6 +11622,7 @@ sub dump_as_binary 'normalyzed_info' => \%normalyzed_info, 'error_info' => \%error_info, 'pgb_error_info' => \%pgb_error_info, + 'pgb_pool_info' => \%pgb_pool_info, 'connection_info' => \%connection_info, 'pgb_connection_info' => \%pgb_connection_info, 'database_info' => \%database_info, @@ -11517,6 +11665,7 @@ sub dump_as_json 'normalyzed_info' => \%normalyzed_info, 'error_info' => \%error_info, 'pgb_error_info' => \%pgb_error_info, + 'pgb_pool_info' => \%pgb_pool_info, 'connection_info' => \%connection_info, 'pgb_connection_info' => \%pgb_connection_info, 'database_info' => \%database_info, @@ -12465,6 +12614,15 @@ sub parse_pgbouncer ); } + # Stores taken reserved pool + if ($prefix_vars{'t_query'} =~ /Taking connection from reserve_pool/) { + my $pool = "$prefix_vars{t_dbuser}\@$prefix_vars{t_dbname}"; + $pgb_pool_info{$pool}{count}++; + $pgb_pool_info{$pool}{chronos}{"$cur_day_str"}{"$cur_hour_str"}{count}++; + $pgb_pool_info{$pool}{chronos}{"$cur_day_str"}{"$cur_hour_str"}{min}{$prefix_vars{t_min}}++; + } + + } else { print STDERR "UNPARSED LOG LEVEL: $prefix_vars{'t_loglevel'} => $prefix_vars{'t_query'}\n"; }