From: Darold Gilles Date: Wed, 29 Oct 2014 13:49:50 +0000 (+0100) Subject: Add connection time histogram. Thanks to Guillaume Lelarge for the feature request. X-Git-Tag: v6.3~36 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b54d75372d5d7824dff9446b28162310e059ef60;p=pgbadger Add connection time histogram. Thanks to Guillaume Lelarge for the feature request. --- diff --git a/pgbadger b/pgbadger index 592989b..34af63a 100755 --- a/pgbadger +++ b/pgbadger @@ -840,13 +840,16 @@ map {$_ = quotemeta($_)} @BRACKETS; # Inbounds of query times histogram my @histogram_query_time = (0, 1, 5, 10, 25, 50, 100, 500, 1000, 10000); +# Inbounds of session times histogram +my @histogram_session_time = (0, 1, 5, 10, 25, 50, 100, 500, 1000, 10000); + # Get inbounds of query times histogram sub get_hist_inbound { - my $duration = shift; + my ($duration, @histogram) = @_; - for (my $i = 0; $i <= $#histogram_query_time; $i++) { - return $histogram_query_time[$i-1] if ($histogram_query_time[$i] > $duration); + for (my $i = 0; $i <= $#histogram; $i++) { + return $histogram[$i-1] if ($histogram[$i] > $duration); } return -1; @@ -3629,6 +3632,7 @@ sub html_header }; } print $fh qq{ +
  • Histogram of sessions times
  • Sessions per database
  • Sessions per user
  • Sessions per host
  • @@ -4855,6 +4859,83 @@ $drawn_graphs{sessionspersecond_graph} } +sub print_histogram_session_times +{ + my %data = (); + my $histogram_info = ''; + my $most_range = ''; + my $most_range_value = ''; + + for (my $i = 1; $i <= $#histogram_session_time; $i++) { + $histogram_info .= "$histogram_session_time[$i-1]-$histogram_session_time[$i]ms" . &comma_numbers($overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]}) . + "" . sprintf("%0.2f", ($overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]} * 100) / ($overall_stat{histogram}{session_total}||1)) . "%"; + $data{"$histogram_session_time[$i-1]-$histogram_session_time[$i]ms"} = $overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]} if ($overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]} > 0); + if ($overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]} > $most_range_value) { + $most_range = "$histogram_session_time[$i-1]-$histogram_session_time[$i]ms"; + $most_range_value = $overall_stat{histogram}{session_time}{$histogram_session_time[$i-1]}; + } + } + if ($overall_stat{histogram}{session_total} > 0) { + $histogram_info .= " > $histogram_session_time[-1]ms" . &comma_numbers($overall_stat{histogram}{session_time}{'-1'}) . + "" . sprintf("%0.2f", ($overall_stat{histogram}{session_time}{'-1'} * 100) / ($overall_stat{histogram}{session_total}||1)) . "%"; + $data{"> $histogram_session_time[-1]ms"} = $overall_stat{histogram}{session_time}{"-1"} if ($overall_stat{histogram}{session_time}{"-1"} > 0); + if ($overall_stat{histogram}{session_time}{"-1"} > $most_range_value) { + $most_range = "> $histogram_session_time[-1]ms"; + $most_range_value = $overall_stat{histogram}{session_time}{"-1"}; + } + } else { + $histogram_info = qq{$NODATA}; + } + + $drawn_graphs{histogram_session_times_graph} = &flotr2_piegraph($graphid++, 'histogram_session_times_graph', 'Histogram of session times', %data); + + $most_range_value = &comma_numbers($most_range_value) if ($most_range_value); + + print $fh qq{ +

    Top Queries

    +
    +

    Histogram of session times

    +
    +

    Key values

    +
    +
      +
    • $most_range_value $most_range duration
    • +
    +
    +
    +
    +
    + +
    +
    + $drawn_graphs{histogram_session_times_graph} +
    +
    + + + + + + + + + + $histogram_info + +
    RangeCountPercentage
    +
    +
    +
    +
    +
    +}; + delete $drawn_graphs{histogram_session_times_graph}; +} + + sub print_user_session { @@ -6910,16 +6991,16 @@ sub print_histogram_query_times for (my $i = 1; $i <= $#histogram_query_time; $i++) { $histogram_info .= "$histogram_query_time[$i-1]-$histogram_query_time[$i]ms" . &comma_numbers($overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]}) . - "" . sprintf("%0.2f", ($overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]} * 100) / ($overall_stat{histogram}{total}||1)) . "%"; + "" . sprintf("%0.2f", ($overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]} * 100) / ($overall_stat{histogram}{query_total}||1)) . "%"; $data{"$histogram_query_time[$i-1]-$histogram_query_time[$i]ms"} = $overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]} if ($overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]} > 0); if ($overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]} > $most_range_value) { $most_range = "$histogram_query_time[$i-1]-$histogram_query_time[$i]ms"; $most_range_value = $overall_stat{histogram}{query_time}{$histogram_query_time[$i-1]}; } } - if ($overall_stat{histogram}{total} > 0) { + if ($overall_stat{histogram}{query_total} > 0) { $histogram_info .= " > $histogram_query_time[-1]ms" . &comma_numbers($overall_stat{histogram}{query_time}{'-1'}) . - "" . sprintf("%0.2f", ($overall_stat{histogram}{query_time}{'-1'} * 100) / ($overall_stat{histogram}{total}||1)) . "%"; + "" . sprintf("%0.2f", ($overall_stat{histogram}{query_time}{'-1'} * 100) / ($overall_stat{histogram}{query_total}||1)) . "%"; $data{"> $histogram_query_time[-1]ms"} = $overall_stat{histogram}{query_time}{"-1"} if ($overall_stat{histogram}{query_time}{"-1"} > 0); if ($overall_stat{histogram}{query_time}{"-1"} > $most_range_value) { $most_range = "> $histogram_query_time[-1]ms"; @@ -7597,6 +7678,8 @@ sub dump_as_html }; # Show number of simultaneous sessions &print_simultaneous_session(); + # Show histogram for session times + &print_histogram_session_times(); # Show per database sessions &print_database_session(); # Show per user sessions @@ -8110,7 +8193,12 @@ sub load_stats foreach my $k (keys %{$_overall_stat{histogram}{query_time}}) { $overall_stat{histogram}{query_time}{$k} += $_overall_stat{histogram}{query_time}{$k}; } - $overall_stat{histogram}{total} += $_overall_stat{histogram}{total}; + $overall_stat{histogram}{query_total} += $_overall_stat{histogram}{total}; + $overall_stat{histogram}{query_total} += $_overall_stat{histogram}{query_total}; + foreach my $k (keys %{$_overall_stat{histogram}{session_time}}) { + $overall_stat{histogram}{session_time}{$k} += $_overall_stat{histogram}{session_time}{$k}; + } + $overall_stat{histogram}{session_total} += $_overall_stat{histogram}{session_total}; foreach my $k ('prepare', 'bind','execute') { $overall_stat{$k} += $_overall_stat{$k}; @@ -9049,6 +9137,9 @@ sub parse_query $session_info{user}{$usr}{duration} += $time; $session_info{host}{$host}{count}++; $session_info{host}{$host}{duration} += $time; + my $k = &get_hist_inbound($time, @histogram_session_time); + $overall_stat{histogram}{session_time}{$k}++; + $overall_stat{histogram}{session_total}++; return; } @@ -9268,9 +9359,9 @@ sub parse_query if ($prefix_vars{'t_query'} =~ s/duration: ([0-9\.]+) ms$//s) { $prefix_vars{'t_duration'} = $1; $prefix_vars{'t_query'} = ''; - my $k = &get_hist_inbound($1); + my $k = &get_hist_inbound($1, @histogram_query_time); $overall_stat{histogram}{query_time}{$k}++; - $overall_stat{histogram}{total}++; + $overall_stat{histogram}{query_total}++; &set_current_infos($t_pid); return; } @@ -9287,9 +9378,9 @@ sub parse_query if ($prefix_vars{'t_query'} =~ s/duration: ([0-9\.]+) ms (query|statement): //is) { $prefix_vars{'t_duration'} = $1; $t_action = $2; - my $k = &get_hist_inbound($1); + my $k = &get_hist_inbound($1, @histogram_query_time); $overall_stat{histogram}{query_time}{$k}++; - $overall_stat{histogram}{total}++; + $overall_stat{histogram}{query_total}++; if (($t_action eq 'statement') && $prefix_vars{'t_query'} =~ /^(PREPARE|EXECUTE)\b/i) { $overall_stat{lc($1)}++; $per_minute_info{$date_part}{$prefix_vars{'t_hour'}}{$prefix_vars{'t_min'}}{lc($1)}++; @@ -9305,9 +9396,9 @@ sub parse_query $per_minute_info{$date_part}{$prefix_vars{'t_hour'}}{$prefix_vars{'t_min'}}{$t_action}++; # Skipping parse and bind logs return if ($t_action !~ /query|statement|execute/); - my $k = &get_hist_inbound($prefix_vars{'t_duration'}); + my $k = &get_hist_inbound($prefix_vars{'t_duration'}, @histogram_query_time); $overall_stat{histogram}{query_time}{$k}++; - $overall_stat{histogram}{total}++; + $overall_stat{histogram}{query_total}++; $prefix_vars{'t_bind'} = 1; # Log line without duration at all } elsif ($prefix_vars{'t_query'} =~ s/(query|statement): //is) { @@ -12438,7 +12529,7 @@ WRFILE: fontawesome.css height: 400px; } - #queriesbytype_graph, #lockbytype_graph, #databasesessions_graph, #usersessions_graph, #hostsessions_graph, #databaseconnections_graph, #userconnections_graph, #hostconnections_graph, #logstype_graph, #tableanalyzes_graph, #tablevacuums_graph, #tuplevacuums_graph, #pagevacuums_graph, #queriesbydatabase_graph, #queriesbyapplication_graph, #queriesbyuser_graph, #queriesbyhost_graph, #histogram_query_times_graph { + #queriesbytype_graph, #lockbytype_graph, #databasesessions_graph, #usersessions_graph, #hostsessions_graph, #databaseconnections_graph, #userconnections_graph, #hostconnections_graph, #logstype_graph, #tableanalyzes_graph, #tablevacuums_graph, #tuplevacuums_graph, #pagevacuums_graph, #queriesbydatabase_graph, #queriesbyapplication_graph, #queriesbyuser_graph, #queriesbyhost_graph, #histogram_query_times_graph, #histogram_session_times_graph { width : 100%; height: 320px; } @@ -12492,7 +12583,7 @@ WRFILE: fontawesome.css width : 94.5%; } - #queriesbytype_graph, #lockbytype_graph, #databasesessions_graph, #usersessions_graph, #hostsessions_graph, #databaseconnections_graph, #userconnections_graph, #hostconnections_graph, #logstype_graph, #tableanalyzes_graph, #tablevacuums_graph, #tuplevacuums_graph, #pagevacuums_graph, #queriesbydatabase_graph, #queriesbyapplication_graph, #queriesbyuser_graph, #queriesbyhost_graph, #histogram_query_times_graph { + #queriesbytype_graph, #lockbytype_graph, #databasesessions_graph, #usersessions_graph, #hostsessions_graph, #databaseconnections_graph, #userconnections_graph, #hostconnections_graph, #logstype_graph, #tableanalyzes_graph, #tablevacuums_graph, #tuplevacuums_graph, #pagevacuums_graph, #queriesbydatabase_graph, #queriesbyapplication_graph, #queriesbyuser_graph, #queriesbyhost_graph, #histogram_query_times_graph, #histogram_session_times_graph { width : 94.5%; }