[check_postgres] [commit] Use statement_timeout in addition to alarm.

check_postgres at bucardo.org check_postgres at bucardo.org
Mon May 11 15:29:57 UTC 2009


Committed by Greg Sabino Mullane <greg at endpoint.com>

Use statement_timeout in addition to alarm.
Per requests from many people.

---
 MANIFEST               |    1 +
 META.yml               |    4 ++--
 Makefile.PL            |    2 +-
 check_postgres.pl      |   29 ++++++++++++++++++++---------
 check_postgres.pl.html |   17 ++++++++++++-----
 t/04_timeout.t         |   27 +++++++++++++++++++++++++++
 6 files changed, 63 insertions(+), 17 deletions(-)

diff --git a/MANIFEST b/MANIFEST
index 06a306c..62da5af 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -47,6 +47,7 @@ t/02_txn_wraparound.t
 t/02_version.t
 t/02_wal_files.t
 t/03_translations.t
+t/04_timeout.t
 t/99_cleanup.t
 t/99_perlcritic.t
 t/99_pod.t
diff --git a/META.yml b/META.yml
index c159a7f..a6d9f9b 100644
--- a/META.yml
+++ b/META.yml
@@ -1,6 +1,6 @@
 --- #YAML:1.0
 name                        : check_postgres.pl
-version                     : 2.8.0
+version                     : 2.8.1
 abstract                    : Postgres monitoring script
 author:              
   - Greg Sabino Mullane <greg at endpoint.com>
@@ -30,7 +30,7 @@ recommends:
 provides:
   check_postgres:
     file                    : check_postgres.pl
-    version                 : 2.8.0
+    version                 : 2.8.1
 
 keywords:
   - Postgres
diff --git a/Makefile.PL b/Makefile.PL
index 39a80e6..031cf68 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -6,7 +6,7 @@ use strict;
 use warnings;
 use 5.006001;
 
-my $VERSION = '2.8.0';
+my $VERSION = '2.8.1';
 
 if ($VERSION =~ /_/) {
 	print "WARNING! This is a test version ($VERSION) and should not be used in production!\n";
diff --git a/check_postgres.pl b/check_postgres.pl
index c351b1d..dabd3e8 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -29,7 +29,7 @@ $Data::Dumper::Varname = 'POSTGRES';
 $Data::Dumper::Indent = 2;
 $Data::Dumper::Useqq = 1;
 
-our $VERSION = '2.8.0';
+our $VERSION = '2.8.1';
 
 use vars qw/ %opt $PSQL $res $COM $SQL $db /;
 
@@ -506,7 +506,7 @@ our $nohost = 0;
 our $ERROR = '';
 
 $opt{test} = 0;
-$opt{timeout} = 10;
+$opt{timeout} = 30;
 
 die $USAGE unless
 	GetOptions(
@@ -699,7 +699,7 @@ Other options:
   --PSQL=FILE        location of the psql executable; avoid using if possible
   -v, --verbose      verbosity level; can be used more than once to increase the level
   -h, --help         display this help information
-  -t X, --timeout=X  how long in seconds before we timeout. Defaults to 10 seconds.
+  -t X, --timeout=X  how long in seconds before we timeout. Defaults to 30 seconds.
   --symlinks         create named symlinks to the main program for each action
 
 Actions:
@@ -1585,14 +1585,17 @@ sub run_command {
 			}
 		}
 
-		push @args, '-c', $string;
-
-		$VERBOSE >= 3 and warn Dumper \@args;
-
 		local $SIG{ALRM} = sub { die 'Timed out' };
 		my $timeout = $arg->{timeout} || $opt{timeout};
+		my $dbtimeout = $timeout * 1000;
 		alarm 0;
 
+		$string = "BEGIN;SET statement_timeout=$dbtimeout;COMMIT;$string";
+
+		push @args, '-c', $string;
+
+		$VERBOSE >= 3 and warn Dumper \@args;
+
 		my $start = $opt{showtime} ? [gettimeofday()] : 0;
 		open my $oldstderr, '>&', \*STDERR or ndie msg('runcommand-nodupe');
 		open STDERR, '>', $errorfile or ndie msg('runcommand-noerr');
@@ -1608,7 +1611,7 @@ sub run_command {
 			if ($err =~ /Timed out/) {
 				ndie msg('runcommand-timeout', $timeout);
 			}
-			else {
+			else {ndie $res;
 				ndie msg('runcommand-err');
 			}
 		}
@@ -1631,6 +1634,10 @@ sub run_command {
 				ndie "$db->{error}";
 			}
 
+			elsif ($db->{error} =~ /statement timeout/) {
+				ndie msg('runcommand-timeout', $timeout);
+			}
+
 			if (!$db->{ok} and !$arg->{failok} and !$arg->{noverify}) {
 
 				## Check if problem is due to backend being too old for this check
@@ -4747,7 +4754,7 @@ sub show_dbstats {
 
 B<check_postgres.pl> - a Postgres monitoring script for Nagios, MRTG, Cacti, and others
 
-This documents describes check_postgres.pl version 2.8.0
+This documents describes check_postgres.pl version 2.8.1
 
 =head1 SYNOPSIS
 
@@ -6092,6 +6099,10 @@ Items not specifically attributed are by Greg Sabino Mullane.
 
 =over 4
 
+=item B<Version 2.8.1> (May, 2009)
+
+  Added timeout via statement_timeout in addition to perl alarm (Greg)
+
 =item B<Version 2.8.0> (May 4, 2009)
 
   Added internationalization support (Greg)
diff --git a/check_postgres.pl.html b/check_postgres.pl.html
index 6fc2470..b0ece06 100644
--- a/check_postgres.pl.html
+++ b/check_postgres.pl.html
@@ -96,7 +96,7 @@
 <hr />
 <h1><a name="name">NAME</a></h1>
 <p><strong>check_postgres.pl</strong> - a Postgres monitoring script for Nagios, MRTG, Cacti, and others</p>
-<p>This documents describes check_postgres.pl version 2.8.0</p>
+<p>This documents describes check_postgres.pl version 2.8.1</p>
 <p>
 </p>
 <hr />
@@ -1328,13 +1328,19 @@ feature requests, and commit notices, send email to <a href="mailto:check_postgr
 <h1><a name="history">HISTORY</a></h1>
 <p>Items not specifically attributed are by Greg Sabino Mullane.</p>
 <dl>
-<dt><strong><a name="item_0"><strong>Version 2.8.0</strong> (May ??, 2009)</a></strong></dt>
+<dt><strong><a name="item_1"><strong>Version 2.8.1</strong> (May, 2009)</a></strong></dt>
+
+<dd>
+<pre>
+  Added timeout via statement_timeout in addition to perl alarm (Greg)</pre>
+</dd>
+<dt><strong><a name="item_0"><strong>Version 2.8.0</strong> (May 4, 2009)</a></strong></dt>
 
 <dd>
 <pre>
   Added internationalization support (Greg)
   Added the 'disabled_triggers' check (Greg)
-  Added the prepared_txns' check (Greg)
+  Added the 'prepared_txns' check (Greg)
   Added the 'new_version_cp' and 'new_version_pg' checks (Greg)
   French translations (Guillaume Lelarge)
   Make the backends search return ok if no matches due to inclusion rules,
@@ -1350,7 +1356,8 @@ feature requests, and commit notices, send email to <a href="mailto:check_postgr
   Set stats to zero if we bail early due to USERWHERECLAUSE (Andras Fabian)
   Add additional items to dbstats output (Andras Fabian)
   Remove --schema option from the fsm_ checks. (Greg Mullane and Robert Treat)
-  Various fixes. (Jeff Boes)
+  Handle case when ENV{PGUSER} is set. (Andy Lester)
+  Many various fixes. (Jeff Boes)
   Fix --dbservice: check version and use ENV{PGSERVICE} for old versions (Cédric Villemain)</pre>
 </dd>
 <dt><strong><a name="item_3"><strong>Version 2.7.3</strong> (February 10, 2009)</a></strong></dt>
@@ -1366,7 +1373,7 @@ feature requests, and commit notices, send email to <a href="mailto:check_postgr
 <pre>
   Fix to prevent multiple groupings if db arguments given.</pre>
 </dd>
-<dt><strong><a name="item_1"><strong>Version 2.7.1</strong> (February 6, 2009)</a></strong></dt>
+<dt><strong><strong>Version 2.7.1</strong> (February 6, 2009)</strong></dt>
 
 <dd>
 <pre>
diff --git a/t/04_timeout.t b/t/04_timeout.t
new file mode 100644
index 0000000..64e6857
--- /dev/null
+++ b/t/04_timeout.t
@@ -0,0 +1,27 @@
+#!perl
+
+## Test the timeout functionality
+
+use 5.006;
+use strict;
+use warnings;
+use Data::Dumper;
+use Test::More tests => 2;
+use lib 't','.';
+use CP_Testing;
+
+use vars qw/$dbh $SQL $t $res/;
+
+my $cp = CP_Testing->new( {default_action => 'custom_query'} );
+
+$dbh = $cp->test_database_handle();
+
+$t=q{Setting the --timeout flag works as expected};
+$res = $cp->run('--query="SELECT pg_sleep(2)" -w 7 --timeout=1');
+like ($res, qr{Command timed out}, $t);
+
+$t=q{Setting the --timeout flag works as expected};
+$res = $cp->run('--query="SELECT pg_sleep(1)" -w 7 --timeout=2');
+like ($res, qr{Invalid format}, $t);
+
+exit;
-- 
1.6.0.5



More information about the Check_postgres mailing list