# Register routine with plugin registery $DATAFUNCS{'rrd_mysql'} = \&data_rrd_mysql; # Take the MySQL status message and create rrd databases for interesting # stats. # RRA to be created for each RRD # "daily" 5min avg last 48hr # "weekly" 30min avg last 12days # "monthly 2hr avg last 48days # "yearly" 24hr avg last 576days $RRAS = "RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:576 RRA:AVERAGE:0.5:24:576 " . "RRA:AVERAGE:0.5:288:576"; $RRDTOOL = "/usr/local/rrdtool/bin/rrdtool"; $RRDDIR = "/home/spong/var/rrd"; sub data_rrd_mysql { my( $host, $service, $color, $start, $time, $sum, $message ) = @_; if ($service ne 'mysql' ) { return; } $time = time; my( $line, $rawfs, $used, $pct, $name, %namemap, $target ); &main::save_data('>', "$RRDDIR/$host/.rrd-mysql", ""); my ($threads) = undef; my ($tables) = undef; my ($avg) = undef; # Bugger, different versions of MySQL have different ways of doing this... if ( $message =~ /[Tt]hreads:\s+(\d+).*?Open\s+tables:\s+(\d+)(.*?avg:\s+([.0-9]+))?\s*$/ ) { $threads = $1; $tables = $2; $avg = $4 || 0; } if(defined $threads && defined $tables && defined $avg) { # If .rrd file not found, built it if ( ! -f "$RRDDIR/$host/mysql.rrd" ) { &debug("$RRDDIR/$host/mysql.rrd not found creating it",4); { local $SIG{'PIPE'} = 'IGNORE'; local $SIG{'CHLD'} = 'IGNORE'; eval { system "$RRDTOOL create $RRDDIR/$host/mysql.rrd " . "DS:threads:GAUGE:600:0:100 DS:tables:GAUGE:600:0:U " . "DS:avg:GAUGE:600:0:U $RRAS"; }; } if (@?) { &error("Error: rrdtool create: $@"); } } # Update the .rrd file &debug("Updating $host MySQL rrd file",4); { local $SIG{'PIPE'} = 'IGNORE'; local $SIG{'CHLD'} = 'IGNORE'; system "$RRDTOOL update $RRDDIR/$host/mysql.rrd " . "$time:$threads:$tables:$avg"; if ($@) { &error("Error: rrdtool update: $@"); } } } else { &debug("Type mysql true but not parseable: $message",4); } } # I'm include perl code, I need this line. 1;