package App::MadEye::Plugin::Agent::MySQLSlave; use strict; use warnings; use App::MadEye::Plugin::Agent::Base; use DBI; sub is_dead { my ($self, $dsn) = @_; App::MadEye->context->log('debug' => "watching $dsn"); my $user = $self->config->{config}->{user} or die "missing user"; my $password = $self->config->{config}->{password}; my $threshold = $self->config->{config}->{threshold} or die "missing threshold"; my $dbh; eval { $dbh = DBI->connect( $dsn, $user, $password, { RaiseError => 1, AutoCommit => 1 } ) or return 'cannot connect'; }; if ($@) { return $@; } my $sth = $dbh->prepare(q{SHOW SLAVE STATUS;}); $sth->execute() or return 'DBI error: ' . $dbh->errstr; if (my $row = $sth->fetchrow_hashref) { # see. http://dev.mysql.com/doc/refman/4.1/ja/show-slave-status.html if (my $le = $row->{'Last_Error'}) { return "replication error : $le\n"; } if ( $row->{'Slave_IO_Running'} ne 'Yes' ) { return "Slave IO Not Running\n"; } if ( $row->{'Slave_SQL_Running'} ne 'Yes' ) { return "Slave SQL Not Running\n"; } my $rmlp = $row->{'Read_Master_Log_Pos'}; my $emlp = $row->{'Exec_Master_Log_Pos'}; if ( abs($rmlp - $emlp) > $threshold ) { return "considerable delay : $rmlp $emlp\n"; } return; # alive! } else { return "this is not a slave!"; } } 1; __END__ =head1 NAME App::MadEye::Plugin::Agent::MySQLSlave - monitoring mysql slave. =head1 SCHEMA type: map mapping: target: type: seq required: yes sequence: - type: str user: required: yes type: str password: required: yes type: any threshold: required: yes type: int =head1 AUTHORS Tokuhiro Matsuno =head1 SEE ALSO L, L