munin-contrib/plugins/percona/percona_

161 lines
4.3 KiB
Python
Executable File

#!/usr/bin/env python3
#
# 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
import os
import sys
from warnings import filterwarnings
import MySQLdb
import MySQLdb.cursors
filterwarnings('ignore', category=MySQLdb.Warning)
program_name = 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"] is not None:
server = os.environ["host"]
else:
server = "localhost"
# Mysql port
if "port" in os.environ and os.environ["port"] is not 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"] is not None:
login = os.environ["user"]
else:
login = ""
# Mysql password
if "password" in os.environ and os.environ["password"] is not None:
passw = os.environ["password"]
else:
passw = ""
# Mysql connection handler
conn = None
label = variables[program_name]['label']
vlabel = variables[program_name]['vlabel']
fields = ["'{0}'".format(x) for x in variables[program_name]['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 as 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 as 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 as e:
print("Error %d: %s" % (e.args[0], e.args[1]))
if conn:
conn.close()