icinga2-checks/check_mysql_connections.py

81 lines
2.8 KiB
Python
Raw Normal View History

2024-04-05 17:45:24 -06:00
#!/usr/bin/env python
import argparse
import sys
import traceback
import mysql.connector
from checker import nagios
from checker.result import quit_check
def main(args):
try:
connection = mysql.connector.connect(host=args.host, user=args.username, password=args.password)
cursor = connection.cursor()
cursor.execute("SHOW STATUS LIKE 'Threads_connected'")
result = cursor.fetchone()
active_connections = int(result[1])
cursor.execute("SHOW VARIABLES LIKE 'max_connections'")
result = cursor.fetchone()
max_connections = int(result[1])
cursor.close()
connection.close()
except mysql.connector.Error as e:
quit_check(f'unable to connect to MySQL server: {e}', nagios.STATE_CRIT)
return # make pycharm happy
# ===================================================
# Parse data
warn_percent = args.warn_percent / 100
crit_percent = args.crit_percent / 100
active_connections_percent = active_connections / max_connections
active_connections_percent_str = str(int(active_connections_percent * 100))
if active_connections_percent > crit_percent:
exit_code = nagios.STATE_CRIT
elif active_connections_percent > warn_percent:
exit_code = nagios.STATE_WARN
else:
exit_code = nagios.STATE_OK
perfdata = {
'percent_active_connections': {
'value': active_connections_percent_str,
'min': 0,
'unit': '%',
'warn': int(warn_percent * 100),
'crit': int(crit_percent * 100)
},
'active_connections': {
'value': active_connections,
'min': 0,
'max': max_connections,
'warn': int(active_connections * warn_percent),
'crit': int(active_connections * crit_percent)
}
}
text_str = f'{active_connections}/{max_connections} ({active_connections_percent_str}%) of available connections used'
quit_check(text_str, exit_code, perfdata)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Check MySQL connections to a server.')
parser.add_argument('--host', required=True, help='The IP of the MySQL server to connect to.')
parser.add_argument('--username', required=True, help='Username.')
parser.add_argument('--password', required=True, help='Password.')
parser.add_argument('--warn-percent', default=50, type=int, help='Connections warning percentage. Default: 50%')
parser.add_argument('--crit-percent', default=75, type=int, help='Connections critical percentage. Default: 75%')
args = parser.parse_args()
try:
main(args)
except Exception as e:
print(f"UNKNOWN - {e}")
traceback.print_exc()
sys.exit(nagios.STATE_UNKNOWN)