Nova Resource:Tools/Admin/replagstats

From Wikitech
  1. !/usr/bin/perl -w

use encoding 'utf8'; use strict; use warnings;

use DBI; use Socket;

  1. Database servers with most active databases.

my %Servers = ('s1' => 'enwiki_p',

              's2' => 'itwiki_p',
              's3' => 'mlwiki_p',
              's4' => 'commonswiki_p',
              's5' => 'dewiki_p',
              's6' => 'ruwiki_p',
              's7' => 'eswiki_p');
  1. Loop forever.

while (1) {

   # Iterate over all servers.
   foreach my $Server (keys (%Servers)) {
       # Connect to server.
       my $DB = DBI->connect ("DBI:mysql:database=$Servers{$Server};host=$Server.labsdb;mysql_read_default_file=" . (getpwuid ($<)) [7] . "/replica.my.cnf",
                              undef,
                              undef);
       if (!defined ($DB)) {
           warn ("$0: Could not connect to $Server: " . DBI->errstr ());
           next;
       }
       # Retrieve replication lag.
       my $r = $DB->selectall_arrayref ("SELECT UNIX_TIMESTAMP() - UNIX_TIMESTAMP(rc_timestamp) FROM recentchanges ORDER BY rc_timestamp DESC LIMIT 1;");
       if (!defined ($r)) {
           warn ("$0: Could not retrieve replication lag for $Server: " . $DB->errstr ());
           $DB->disconnect ();
           next;
       }
       # Update Ganglia.
       if (system ('/usr/bin/gmetric', '--group', 'Replication Lags',
                                       '--name',  $Server,
                                       '--spoof', 'tools-replags:tools-replags',
                                       '--value', $r->[0]->[0] + 0,
                                       '--type',  'uint16')) {
           warn ("$0: Could not update Ganglia for $Server: $!");
       }
       # Disconnect from server.
       $DB->disconnect ();
   }
   # Wait a minute.
   sleep (60);

}