Toolserver:Mytop-all
Appearance
This page was moved from the Toolserver wiki.
Toolserver has been replaced by Toolforge. As such, the instructions here may no longer work, but may still be of historical interest.
Please help by updating examples, links, template links, etc. If a page is still relevant, move it to a normal title and leave a redirect.
mytop-all is a Python script written by Bryan that shows all active connections on the toolserver's MySQL servers.
To run it, copy the code to a place in your $PATH
, call it mytop-all
and make it writable.
In case more servers are added later try incrementing the 3 near the end of the script.
Source
[edit]#!/usr/bin/python
import MySQLdb
import curses
class MyTop(object):
def __init__(self, server_count, mysql_config):
self.servers = dict([(i + 1, MySQLdb.connect(host = 'sql-s%s' % (i + 1), **mysql_config)) for i in xrange(server_count)])
self.cursors = dict([(i, self.servers[i].cursor()) for i in self.servers])
curses.setupterm()
def header(self):
print curses.tigetstr('clear')
print ' ' + self.pad_header('', 4) + self.pad_header('Id', 12) + self.pad_header('Database', 12) + \
self.pad_header('Cmd', 8) + self.pad_header('Time', 6) + self.pad_header('State', 8) + ' Info'
print '-' * (1 + 4 + 4 + 12 + 12 + 8 + 6 + 8 + 2 + 4 + 2)
def pad_header(self, name, length):
return (' ' + name + ' ' * length)[:length]
def pad(self, data, length):
return (str(data) + ' ' * length)[:length]
def format_row(self, server, id, user, host, db, command, time, state, info):
print ' ' + self.pad('s%s' % server, 4) + self.pad(id, 12) + self.pad(db, 12) + \
self.pad(command, 8) + self.pad(time, 6) + self.pad(state, 8) + \
self.truncate(info, 2 * curses.tigetnum('cols') - (1 + 4 + 4 + 12 + 12 + 8 + 6 + 8))
def truncate(self, data, length):
if not data: return ''
if len(str(data)) > length: return str(data)[:length]
return data
def next(self):
self.header()
for server, cursor in self.cursors.iteritems():
cursor.execute('SHOW FULL PROCESSLIST')
for row in cursor:
self.format_row(server, *row)
def __iter__(self):
return self
if __name__ == '__main__':
import sys, time
mytop = MyTop(7, {'read_default_file': '~/.my.cnf'})
for i in mytop:
try:
time.sleep(1)
except KeyboardInterrupt:
sys.exit()
except:
raise