We have a couple of MySQL slave servers running debian here at Skroutz
and I was searching for a way to monitor the service’s status. I run
munin agents on all servers so I wrote a small python script to graph
the slave’s status.
The script uses the debian-sys-maint
user to connect to the database
so it needs to be configured to be run as root
from Munin.
#!/usr/bin/env python
# GPLv2
# Configuration
# [mysql_*]
# user root
# env.mysqlopts "mysql options here"
#
#
#%# family=auto
#%# capabilities=autoconf
import sys , os
def autoconfigure ():
try :
import MySQLdb
cnfpath = os . environ [ ' mysqlopts ' ]. split ( ' = ' )[ - 1 ]
conn = MySQLdb . connect ( read_default_file = cnfpath )
cur = conn . cursor ( MySQLdb . cursors . DictCursor )
cur . execute ( " SHOW SLAVE STATUS " )
if cur . rowcount == 0 :
print " no (Slave not configured?) "
cur . close ()
conn . close ()
sys . exit ( 0 )
cur . close ()
conn . close ()
except ImportError :
print " no (MySQLdb module missing) "
sys . exit ( 0 )
except MySQLdb . OperationalError , e :
print " no (%d, %s) " % ( e . args [ 0 ], e . args [ 1 ])
sys . exit ( 0 )
print " yes "
def config ():
print " graph_title Seconds behind Master "
print " graph_vlabel seconds "
print " graph_args -l 0 "
print " secs_behind.label seconds behind "
print " sec_behind.draw LINE3 "
print " graph_category mysql "
print " secs_behind.warning 60 "
print " secs_behind.critical 90 "
def seconds_behind_master ():
import MySQLdb
cnfpath = os . environ [ ' mysqlopts ' ]. split ( ' = ' )[ - 1 ]
conn = MySQLdb . connect ( read_default_file = cnfpath )
cur = conn . cursor ( MySQLdb . cursors . DictCursor )
cur . execute ( " SHOW SLAVE STATUS " )
row = cur . fetchone ()
print " secs_behind.value %s " % ( row [ ' Seconds_Behind_Master ' ])
cur . close ()
conn . close ()
if __name__ == " __main__ " :
if len ( sys . argv ) == 2 :
if sys . argv [ 1 ] == " config " :
config ()
elif sys . argv [ 1 ] == " autoconf " :
autoconfigure ()
else :
seconds_behind_master ()
Please enable JavaScript to view the comments powered by Disqus.