munin-contrib/plugins/percona/percona_

157 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8
#
# Munin plugin for Percona XtraDB Cluster. Monitors values of these cluster replication variables:
# percona_queues: wsrep_local_recv_queue, wsrep_local_send_queue
# percona_flow: wsrep_flow_control_sent, wsrep_flow_control_recv
# percona_transactions: wsrep_replicated, wsrep_received
# percona_transactions_bytes: wsrep_replicated_bytes, wsrep_received_bytes
# percona_replication: wsrep_local_cert_failures, wsrep_local_bf_aborts
#
# created by Sven Schliesing
# borrowed code from mysql_aggregate_ by Igor Borodikhin
#
# License : GPLv3
#
# parsed environment variables:
# host: hostname or ip-address of Mysql server (default - localhost)
# port: port number of Mysql server (default - 3306)
# user: username to access Mysql server (default - empty)
# password: password of Mysql user (default - empty)
#
# ## Requirements
# This plugin requires pythons MySQLdb module which can be installed via easy_install.
#
# ## Installation
# Copy file to directory /usr/share/munin/plugins/ and create symbolic links for each type you wish to monitor:
# percona_flow
# percona_queues
# percona_replication
# percona_transactions
# percona_transactions_bytes
#
# Minimal config for monitoring local Percona XtraDB Cluster-Server:
#
# [percona]
# env.user root
# env.password vErYsEcReT
#
#%# capabilities=autoconf
#%# family=contrib
from warnings import filterwarnings
import os, sys, MySQLdb, MySQLdb.cursors
filterwarnings('ignore', category = MySQLdb.Warning)
progName = os.path.basename(__file__)
variables = {
'percona_queues': {
'label': 'Queue sizes',
'vlabel': 'size',
'fields': ['wsrep_local_recv_queue', 'wsrep_local_send_queue']
},
'percona_flow': {
'label': 'Flow control',
'vlabel': '',
'fields': ['wsrep_flow_control_sent', 'wsrep_flow_control_recv']
},
'percona_transactions': {
'label': 'Transactions in and out',
'vlabel': 'transactions',
'fields': ['wsrep_replicated', 'wsrep_received']
},
'percona_transactions_bytes': {
'label': 'Transactions in and out in bytes',
'vlabel': 'bytes',
'fields': ['wsrep_replicated_bytes', 'wsrep_received_bytes']
},
'percona_replication': {
'label': 'Replication conflicts',
'vlabel': 'conflicts',
'fields': ['wsrep_local_cert_failures', 'wsrep_local_bf_aborts'],
}
}
# Parse environment variables
# Mysql host
if "host" in os.environ and os.environ["host"] != None:
server = os.environ["host"]
else:
server = "localhost"
# Mysql port
if "port" in os.environ and os.environ["port"] != None:
try:
port = int(os.environ["port"])
except ValueError:
port = 3306
else:
port = 3306
# Mysql username
if "user" in os.environ and os.environ["user"] != None:
login = os.environ["user"]
else:
login = ""
# Mysql password
if "password" in os.environ and os.environ["password"] != None:
passw = os.environ["password"]
else:
passw = ""
# Mysql connection handler
conn = None
label = variables[progName]['label']
vlabel = variables[progName]['vlabel']
fields = ['\'{0}\''.format(x) for x in variables[progName]['fields']]
query = "show status where Variable_name in (%s)" % ', '.join(fields)
# Connect to mysql
try:
conn = MySQLdb.connect(host=server, user=login, passwd=passw)
cursor = conn.cursor()
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit(1)
values = {}
if len(sys.argv) == 2 and sys.argv[1] == "autoconf":
print "yes"
elif len(sys.argv) == 2 and sys.argv[1] == "config":
print "graph_title %s" % label
print "graph_vlabel %s" % vlabel
print "graph_category db"
print ""
try:
cursor.execute(query)
results = cursor.fetchall()
for result in results:
print "%s_size.label %s" % (result[0], result[0])
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
else:
try:
cursor.execute(query)
results = cursor.fetchall()
for result in results:
print "%s_size.value %s" % (result[0], result[1])
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
if conn:
conn.close()