Skip to content

Commit

Permalink
Moved outputformat to innodb_version in mysql.py
Browse files Browse the repository at this point in the history
Allowed for different versions of innodb to get stats
  • Loading branch information
NoodlesNZ committed May 2, 2013
1 parent 710073f commit 5198155
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 20 deletions.
71 changes: 57 additions & 14 deletions mysqld/python_modules/DBUtil.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,25 @@ def longish(x):
return longish(x[:-1])
else:
raise ValueError

def hexlongish(x):
if len(x):
try:
return long(str(x), 16)
except ValueError:
return longish(x[:-1])
else:
raise ValueError

def parse_innodb_status(innodb_status_raw):
def parse_innodb_status(innodb_status_raw, innodb_version="1.0"):
def sumof(status):
def new(*idxs):
return sum(map(lambda x: longish(status[x]), idxs))
#new.func_name = 'sumof' #not ok in py2.3
return new

innodb_status = defaultdict(int)
innodb_status['active_transactions']

for line in innodb_status_raw:
istatus = line.split()

Expand All @@ -97,15 +105,33 @@ def new(*idxs):
innodb_status['os_waits'] += longish(istatus[8])

elif "RW-shared spins" in line:
innodb_status['spin_waits'] += isum(2,8)
innodb_status['os_waits'] += isum(5,11)
if innodb_version == 1.0:
innodb_status['spin_waits'] += isum(2,8)
innodb_status['os_waits'] += isum(5,11)
elif innodb_version >= 5.5:
innodb_status['spin_waits'] += longish(istatus[2])
innodb_status['os_waits'] += longish(istatus[7])

elif "RW-excl spins" in line and innodb_version >= 5.5:
innodb_status['spin_waits'] += longish(istatus[2])
innodb_status['os_waits'] += longish(istatus[7])

# TRANSACTIONS
elif "Trx id counter" in line:
innodb_status['transactions'] += isum(3,4)
if innodb_version >= 5.6:
innodb_status['transactions'] += longish(istatus[3])
elif innodb_version == 5.5:
innodb_status['transactions'] += hexlongish(istatus[3])
else:
innodb_status['transactions'] += isum(3,4)

elif "Purge done for trx" in line:
innodb_status['transactions_purged'] += isum(6,7)
if innodb_version >= 5.6:
innodb_status['transactions_purged'] += longish(istatus[6])
elif innodb_version == 5.5:
innodb_status['transactions_purged'] += hexlongish(istatus[6])
else:
innodb_status['transactions_purged'] += isum(6,7)

elif "History list length" in line:
innodb_status['history_list'] = longish(istatus[3])
Expand Down Expand Up @@ -141,11 +167,22 @@ def new(*idxs):
innodb_status['pending_buffer_pool_flushes'] = longish(istatus[7])

# INSERT BUFFER AND ADAPTIVE HASH INDEX
elif 'merged recs' in line:
elif 'merged recs' in line and innodb_version == 1.0:
innodb_status['ibuf_inserts'] = longish(istatus[0])
innodb_status['ibuf_merged'] = longish(istatus[2])
innodb_status['ibuf_merges'] = longish(istatus[5])

elif 'Ibuf: size' in line and innodb_version >= 5.5:
innodb_status['ibuf_merges'] = longish(istatus[10])

elif 'merged operations' in line and innodb_version >= 5.5:
in_merged = 1

elif 'delete mark' in line and 'in_merged' in vars() and innodb_version >= 5.5:
innodb_status['ibuf_inserts'] = longish(istatus[1])
innodb_status['ibuf_merged'] = 0
del in_merged

# LOG
elif "log i/o's done" in line:
innodb_status['log_writes'] = longish(istatus[0])
Expand All @@ -155,10 +192,16 @@ def new(*idxs):
innodb_status['pending_chkp_writes'] = longish(istatus[4])

elif "Log sequence number" in line:
innodb_status['log_bytes_written'] = isum(3,4)
if innodb_version >= 5.5:
innodb_status['log_bytes_written'] = longish(istatus[3])
else:
innodb_status['log_bytes_written'] = isum(3,4)

elif "Log flushed up to" in line:
innodb_status['log_bytes_flushed'] = isum(4,5)
if innodb_version >= 5.5:
innodb_status['log_bytes_flushed'] = longish(istatus[4])
else:
innodb_status['log_bytes_flushed'] = isum(4,5)

# BUFFER POOL AND MEMORY
elif "Buffer pool size" in line:
Expand All @@ -173,10 +216,10 @@ def new(*idxs):
elif "Modified db pages" in line:
innodb_status['buffer_pool_pages_dirty'] = longish(istatus[3])

elif "Pages read" in line:
innodb_status['pages_read'] = longish(istatus[2])
innodb_status['pages_created'] = longish(istatus[4])
innodb_status['pages_written'] = longish(istatus[6])
elif "Pages read" in line and "ahead" not in line:
innodb_status['pages_read'] = longish(istatus[2])
innodb_status['pages_created'] = longish(istatus[4])
innodb_status['pages_written'] = longish(istatus[6])

# ROW OPERATIONS
elif 'Number of rows inserted' in line:
Expand Down
15 changes: 9 additions & 6 deletions mysqld/python_modules/mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,15 @@ def update_stats(get_innodb=True, get_master=True, get_slave=True):
cursor.close()

cursor = conn.cursor(MySQLdb.cursors.Cursor)
cursor.execute("SHOW ENGINES")
cursor.execute("SELECT PLUGIN_STATUS, PLUGIN_VERSION FROM `information_schema`.Plugins WHERE PLUGIN_NAME LIKE '%innodb%' AND PLUGIN_TYPE LIKE 'STORAGE ENGINE';")

have_innodb = False
for row in cursor:
if row[0] == 'InnoDB':
if row[1] == 'DEFAULT' or row[1] == "YES":
have_innodb = True
innodb_version = 1.0
row = cursor.fetchone()

if row[0] == "ACTIVE":
have_innodb = True
innodb_version = row[1]
cursor.close()

# try not to fail ?
Expand All @@ -133,7 +136,7 @@ def update_stats(get_innodb=True, get_master=True, get_slave=True):
if get_innodb:
cursor = conn.cursor(MySQLdb.cursors.Cursor)
cursor.execute("SHOW /*!50000 ENGINE*/ INNODB STATUS")
innodb_status = parse_innodb_status(cursor.fetchone()[0].split('\n'))
innodb_status = parse_innodb_status(cursor.fetchone()[2].split('\n'), innodb_version)
cursor.close()
logging.debug('innodb_status: ' + str(innodb_status))

Expand Down

0 comments on commit 5198155

Please sign in to comment.