From b03dc1017fe0efd09a58add7b7aa6ebd4c3c1660 Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Thu, 28 Mar 2019 15:29:04 +0100 Subject: [PATCH] Fix #653 --- .../database/postgres/mode/listdatabases.pm | 12 +++---- .../database/postgres/mode/querytime.pm | 36 ++++++++++--------- centreon-plugins/database/postgres/psqlcmd.pm | 4 +-- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/centreon-plugins/database/postgres/mode/listdatabases.pm b/centreon-plugins/database/postgres/mode/listdatabases.pm index 1fdc9b15b..491c34b2d 100644 --- a/centreon-plugins/database/postgres/mode/listdatabases.pm +++ b/centreon-plugins/database/postgres/mode/listdatabases.pm @@ -31,10 +31,9 @@ sub new { bless $self, $class; $self->{version} = '1.0'; - $options{options}->add_options(arguments => - { - "exclude:s" => { name => 'exclude', }, - }); + $options{options}->add_options(arguments => { + "exclude:s" => { name => 'exclude', }, + }); return $self; } @@ -50,8 +49,9 @@ sub manage_selection { $self->{sql}->connect(); $self->{sql}->query(query => q{ -SELECT datname FROM pg_database -}); + SELECT datname FROM pg_database + } + ); $self->{list_db} = []; while ((my $row = $self->{sql}->fetchrow_hashref())) { if (defined($self->{option_results}->{exclude}) && $row->{datname} !~ /$self->{option_results}->{exclude}/) { diff --git a/centreon-plugins/database/postgres/mode/querytime.pm b/centreon-plugins/database/postgres/mode/querytime.pm index be02ced74..5c21da1ad 100644 --- a/centreon-plugins/database/postgres/mode/querytime.pm +++ b/centreon-plugins/database/postgres/mode/querytime.pm @@ -31,13 +31,12 @@ sub new { bless $self, $class; $self->{version} = '1.0'; - $options{options}->add_options(arguments => - { - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - "exclude:s" => { name => 'exclude', }, - "exclude-user:s" => { name => 'exclude_user', }, - }); + $options{options}->add_options(arguments => { + "warning:s" => { name => 'warning', }, + "critical:s" => { name => 'critical', }, + "exclude:s" => { name => 'exclude', }, + "exclude-user:s" => { name => 'exclude_user', }, + }); return $self; } @@ -66,19 +65,19 @@ sub run { my $query; if ($self->{sql}->is_version_minimum(version => '9.2')) { $query = q{ -SELECT datname, datid, pid, usename, client_addr, query AS current_query, state AS state, - CASE WHEN client_port < 0 THEN 0 ELSE client_port END AS client_port, +SELECT pg_database.datname, pgsa.datid, pgsa.pid, pgsa.usename, pgsa.client_addr, pgsa.query AS current_query, pgsa.state AS state, + CASE WHEN pgsa.client_port < 0 THEN 0 ELSE pgsa.client_port END AS client_port, COALESCE(ROUND(EXTRACT(epoch FROM now()-query_start)),0) AS seconds -FROM pg_stat_activity WHERE (query_start IS NOT NULL AND (state NOT LIKE 'idle%' OR state IS NULL)) -ORDER BY query_start, pid DESC +FROM pg_database LEFT JOIN pg_stat_activity pgsa ON pg_database.datname = pgsa.datname AND (pgsa.query_start IS NOT NULL AND (pgsa.state NOT LIKE 'idle%' OR pgsa.state IS NULL)) +ORDER BY pgsa.query_start, pgsa.pid DESC }; } else { $query = q{ -SELECT datname, datid, procpid AS pid, usename, client_addr, current_query AS current_query, '' AS state, - CASE WHEN client_port < 0 THEN 0 ELSE client_port END AS client_port, +SELECT pg_database.datname, pgsa.datid, pgsa.pid, pgsa.usename, pgsa.client_addr, pgsa.current_query AS current_query, '' AS state, + CASE WHEN pgsa.client_port < 0 THEN 0 ELSE pgsa.client_port END AS client_port, COALESCE(ROUND(EXTRACT(epoch FROM now()-query_start)),0) AS seconds -FROM pg_stat_activity WHERE (query_start IS NOT NULL AND current_query NOT LIKE '%') -ORDER BY query_start, procpid DESC +FROM pg_database LEFT JOIN pg_stat_activity pgsa ON pg_database.datname = pgsa.datname AND (pgsa.query_start IS NOT NULL AND current_query NOT LIKE '%') +ORDER BY pgsa.query_start, pgsa.procpid DESC }; } @@ -88,6 +87,11 @@ ORDER BY query_start, procpid DESC short_msg => "All databases queries time are ok."); my $dbquery = {}; while ((my $row = $self->{sql}->fetchrow_hashref())) { + if (!defined($dbquery->{$row->{datname}})) { + $dbquery->{$row->{datname}} = { total => 0, code => {} }; + } + next if (!defined($row->{datid}) || $row->{datid} eq ''); # No joint + if (defined($self->{option_results}->{exclude}) && $row->{datname} !~ /$self->{option_results}->{exclude}/) { next; } @@ -107,8 +111,6 @@ ORDER BY query_start, procpid DESC foreach my $dbname (keys %$dbquery) { $self->{output}->perfdata_add(label => $dbname . '_qtime_num', value => $dbquery->{$dbname}->{total}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), min => 0); foreach my $exit_code (keys %{$dbquery->{$dbname}->{code}}) { $self->{output}->output_add(severity => $exit_code, diff --git a/centreon-plugins/database/postgres/psqlcmd.pm b/centreon-plugins/database/postgres/psqlcmd.pm index 2186c50ac..861d8d963 100644 --- a/centreon-plugins/database/postgres/psqlcmd.pm +++ b/centreon-plugins/database/postgres/psqlcmd.pm @@ -273,7 +273,7 @@ sub fetchrow_array { $self->{stdout} =~ s/^(.*?)\Q$self->{record_separator}\E//ms; @{$self->{columns}} = split(/\Q$self->{field_separator}\E/, $1); } - if (($self->{stdout} =~ s/^(.*?)\Q$self->{record_separator}\E//ms)) { + if (($self->{stdout} =~ s/^(.*?)(\Q$self->{record_separator}\E|\Z)//ms)) { push @array_result, split(/\Q$self->{field_separator}\E/, $1); } @@ -288,7 +288,7 @@ sub fetchrow_hashref { $self->{stdout} =~ s/^(.*?)\Q$self->{record_separator}\E//ms; @{$self->{columns}} = split(/\Q$self->{field_separator}\E/, $1); } - if ($self->{stdout} ne '' && $self->{stdout} =~ s/^(.*?)\Q$self->{record_separator}\E//ms) { + if ($self->{stdout} ne '' && $self->{stdout} =~ s/^(.*?)(\Q$self->{record_separator}\E|\Z)//ms) { $array_result = {}; my @values = split(/\Q$self->{field_separator}\E/, $1); for (my $i = 0; $i < scalar(@values); $i++) {