| [Date Prev] [Date Next] | [Thread Prev] [Thread Next] | [Date Index] [Thread Index] |
Re: [nocol-users] MySQL monitor?
|
"Nathan Clemons [Staff]" wrote:
>
> I'd love to write a good Perl DBI monitor, where you could specify
> username, password, port, and DBD type in the config file and have a SQL
> statement to use to test it.
>
> If anyone feels up to writing a FAQ on how to write a Perl based monitor,
> I'll be happy to contribute it when complete. Otherwise, I'm too busy
> working on the HUP situation to read the current Perl monitors and
> determine what I need to do.
>
Here's one I'd hacked out of ciscomon. It works pretty well. I didn't spend
a lot of time making the config file easy to use--the lines are very long
but you can't use a continuation character. I don't change if very often
anyway... Config file looks like this:
# Config file for SQLmon nocol monitor
#
# Format:
# POLLINTERVAL 600 (only the last one takes effect)
# <name> <addr> <maxseverity> <DBI driver> <username> <password> <SQL
query-string>
#
##
POLLINTERVAL 120
#
sql1 130.133.99.72 Critical dbi:mysql:mysql:localhost nocol xxyy select *
from user
sql2 130.133.99.73 Error dbi:mysql:mysql:sql2 nocol xxyy select *
from user
The first two fields are the standard sitename and siteaddr that nocol
wants. The third is the maximum severity that the device will rise to. The
third is the dbi driver string. The above works for mysql; others may be
different. Note that you have to include the hostname here--the script
doesn't try to pull it from field 1 or 2. Next two are the username and
password to access the database. Everything from there on is the sql query
to execute. If the query is successful it uses the return value in the
"value" field. If not it sets that to 0 and bumps the severity. The above
query--in case you're not dbi proficient--is selecting everything in the
user table of the mysql database.
The script will die if either the username/password doesn't work or if your
SQL is invalid.
The script itself is attached.
--
_______________________________________________________________________
Rick Beebe (203) 785-6416
Manager, Systems & Network Engineering FAX: (203) 785-3978
ITS-Med Client & Technology Services Richard.Beebe@yale.edu
Yale University School of Medicine
P.O. Box 208078, New Haven, CT 06520-8078
_______________________________________________________________________
#!/usr/local/bin/perl
#
# SQLmon - monitor for DBI accessible SQL servers
#
# Part of the NOCOL monitoring package.
#
## Contributed by Richard Beebe II (richard.beebe@yale.edu)
# Derived from ciscomon
#
##
#
#
use DBI;
require "nocollib.pl" ;
local ($vpad) = "";
############################
## Variables customization # overrides values in the nocollib.pl library
############################
$sleepint=60*10; # Seconds to sleep between tries.
############################
$debug = 0; # set to 1 for debugging output
$libdebug = 0; # set to 1 for debugging output
$maxseverity = $E_CRITICAL ;
$sev{'Critical'} = $E_CRITICAL;
$sev{'Error'} = $E_ERROR;
$sev{'Warning'} = $E_WARNING;
$sev{'Info'} = $E_INFO;
$prognm = $0; # save program name
# Read the config file. Use '\t' as a separator for 'item'
sub readconf {
local ($var);
local ($host);
open(CONFIG,"<$cfile")||die("Couldn't find $cfile, exiting");
while(<CONFIG>) {
chop;
if(/^\s*#/) {next;} # skip comments
if(/^\s*$/) {next;} # skip blank lines
if (/^(pollinterval)\s*(\S*)$/i) {
$sleepint = $2 if $2;
next;
}
if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+)$/)
{
$item="$1\t$2" ; # the name and address
$maxseverity{$item} = $sev{$3} ? $sev{$3} : $maxseverity;
$data_source{$item} = $4 if $4;
$username{$item} = $5;
$password{$item} = $6;
if (!$7) {
die "$item line doesn't have enough fields!";
}
$query_string{$item} = $7;
$sender{$item} = 'sqlmon';
$varname{$item} = 'SQLserver';
$sitename{$item} = $1;
$siteaddr{$item} = $2;
$varvalue{$item} = 1;
$varthres{$item} = 0;
$varunits{$item} = 'Up';
$severity{$item} = $E_INFO;
push (@items, $item);
next;
} else {
print "Ignoring illegal line: $_\n";
}
} # end while(CONFIG)
close(CONFIG);
if(0>$#items){die("Nothing to monitor in $cfile, exiting")};
if ($debug) {
print "Items are:\n"; foreach (@items) { print "\t$_\n" } ;
}
} # end: readconf
&nocol_startup;
&readconf;
local ($stime, $deltatime);
## Check state of each router
#
while (1) {
local ($host, $ipaddr) = @_ ;
$stime = time;
foreach $item (@items ) {
# ($host,$ipaddr) = split(/\t/,$item);
print "(debug) dotest: connecting to database $data_source{$item} ($username{$item}, $password{$item})\n" if $debug;
$dbh = DBI->connect($data_source{$item}, $username{$item}, $password{$item}) or die $DBI::errstr;
print "(debug) dotest: running command $query_string{$item}\n" if $debug;
$rc = $dbh->do($query_string{$item}) or die $dbh->errstr;
# $item = "$host\t$ipaddr";
$varvalue{$item} = $rc;
print "(debug) dotest: SQL query returned: ".$rc."\n" if $debug;
if ($rc > 0) { #status is UP
($mon{$item},$day{$item},$hour{$item},$min{$item}) = &gettime ;
if (!($nocop{$item} & $n_UP)) { # recent state change
$nocop{$item} = $nocop{$item} & ~($n_UP | $n_DOWN | $n_UNKNOWN) | $n_UP;
$loglevel{$item} = $severity{$item} ; # loglevel set to old level
$severity{$item} = $E_INFO;
&eventlog(&packevent($item)) ; # log to noclogd daemon
}
} else { # Status is DOWN
$varvalue{$item} = 0;
local($oseverity) = $severity{$item} ;
$severity{$item} = ($severity{$item} > $maxseverity{$item}) ? ($severity{$item} - 1) : $maxseverity{$item};
$nocop{$item}= $nocop{$item} & ~($n_UP | $n_DOWN | $n_UNKNOWN) | $n_DOWN;
if ($oseverity != $severity{$item}) { # severity change
($mon{$item},$day{$item},$hour{$item},$min{$item}) = &gettime ;
# smaller severity is more severe... set that as loglevel
$loglevel{$item}= $severity{$item} < $oseverity ? $severity{$item}:$oseverity;
&eventlog(&packevent($item));
}
}
$dbh->disconnect;
} # end: for $h ($host)
open(OEVENTS,">$datafile");
foreach $item (@items) {
if(!$forget{$item}) {
&writeevent(OEVENTS, $item);
}
}
close(OEVENTS);
$deltatime = time - $stime; # time to do tests
if ($sleepint > $deltatime) { sleep($sleepint - $deltatime); }
} # end: while(1)
###
### main
###
#&nocol_main ;
|