root / plugins / mysql / mysql_aggregate_ @ c561076a
Historique | Voir | Annoter | Télécharger (4,79 ko)
| 1 |
#!/usr/bin/env python |
|---|---|
| 2 |
# -*- coding: utf-8 -*- |
| 3 |
# vim: set fileencoding=utf-8 |
| 4 |
# |
| 5 |
# Munin plugin to show Mysql COUNT(*) results for multiple values |
| 6 |
# |
| 7 |
# Copyright Igor Borodikhin |
| 8 |
# |
| 9 |
# License : GPLv3 |
| 10 |
# |
| 11 |
# parsed environment variables: |
| 12 |
# host: hostname or ip-address of Mysql server (default - localhost) |
| 13 |
# port: port number of Mysql server (default - 3306) |
| 14 |
# user: username to access Mysql server (default - empty) |
| 15 |
# password: password of Mysql user (default - empty) |
| 16 |
# database: Mysql database name (default - empty) |
| 17 |
# table: Mysql table name (no defaul, raises exception) |
| 18 |
# field: field name, used in GROUP BY statement (no default, raises exception) |
| 19 |
# where: optional where condition (without "where", default - empty) |
| 20 |
# |
| 21 |
# This plugin shows graphs of Mysql COUNT(*) results. |
| 22 |
# |
| 23 |
# ## Requirements |
| 24 |
# This plugin requires pythons MySQLdb module which can be installed via easy_install. |
| 25 |
# |
| 26 |
# ## Installation |
| 27 |
# Copy file to directory /usr/share/munin/pligins/ and create symbolic links for each table you wish to monitor. |
| 28 |
# For example, if you wish to monitor how many users Mysql has per host create this symlink: |
| 29 |
# |
| 30 |
# ln -s /usr/share/munin/plugins/mysql_aggregate_ /etc/munin/plugins/mysql_aggregate_user |
| 31 |
# |
| 32 |
# And specify some options in munin-node.conf: |
| 33 |
# |
| 34 |
# [mysql_aggregate_*] |
| 35 |
# env.host 10.216.0.141 |
| 36 |
# env.port 3306 |
| 37 |
# env.user root |
| 38 |
# env.password vErYsEcReT |
| 39 |
# env.database mysql |
| 40 |
# env.table user |
| 41 |
# env.field Host |
| 42 |
# |
| 43 |
#%# capabilities=autoconf |
| 44 |
#%# family=contrib |
| 45 |
|
| 46 |
import os, sys, MySQLdb, MySQLdb.cursors |
| 47 |
|
| 48 |
progName = sys.argv[0] |
| 49 |
|
| 50 |
# Parse environment variables |
| 51 |
# Mysql host |
| 52 |
if "host" in os.environ and os.environ["host"] != None: |
| 53 |
server = os.environ["host"] |
| 54 |
else: |
| 55 |
server = "localhost" |
| 56 |
|
| 57 |
# Mysql port |
| 58 |
if "port" in os.environ and os.environ["port"] != None: |
| 59 |
try: |
| 60 |
port = int(os.environ["port"]) |
| 61 |
except ValueError: |
| 62 |
port = 3306 |
| 63 |
else: |
| 64 |
port = 3306 |
| 65 |
|
| 66 |
# Mysql username |
| 67 |
if "user" in os.environ and os.environ["user"] != None: |
| 68 |
login = os.environ["user"] |
| 69 |
else: |
| 70 |
login = "" |
| 71 |
|
| 72 |
# Mysql password |
| 73 |
if "password" in os.environ and os.environ["password"] != None: |
| 74 |
passw = os.environ["password"] |
| 75 |
else: |
| 76 |
passw = "" |
| 77 |
|
| 78 |
# Mysql database |
| 79 |
if "database" in os.environ and os.environ["database"] != None: |
| 80 |
db = os.environ["database"] |
| 81 |
else: |
| 82 |
db = "" |
| 83 |
|
| 84 |
# Mysql table name |
| 85 |
if "table" in os.environ and os.environ["table"] != None: |
| 86 |
table = os.environ["table"] |
| 87 |
else: |
| 88 |
raise Exception("You should provide 'env.table' in configuration file")
|
| 89 |
# Mysql group by field |
| 90 |
if "field" in os.environ and os.environ["field"] != None: |
| 91 |
field = os.environ["field"] |
| 92 |
else: |
| 93 |
raise Exception("You should provide 'env.field' in configuration file")
|
| 94 |
|
| 95 |
# Mysql where condition |
| 96 |
if "where" in os.environ and os.environ["where"] != None: |
| 97 |
where = "WHERE %s" % os.environ["where"] |
| 98 |
else: |
| 99 |
where = "" |
| 100 |
|
| 101 |
# Mysql connection handler |
| 102 |
conn = None |
| 103 |
|
| 104 |
# Query to get field values |
| 105 |
valuesQuery = "SELECT DISTINCT %s FROM %s %s" % (field, table, where) |
| 106 |
# Query to get graph data |
| 107 |
aggregateQuery = "SELECT %s, COUNT(*) FROM %s %s GROUP BY %s" % (field, table, where, field) |
| 108 |
|
| 109 |
# Connect to mysql |
| 110 |
try: |
| 111 |
conn = MySQLdb.connect(host=server, user=login, passwd=passw, db=db) |
| 112 |
cursor = conn.cursor() |
| 113 |
except MySQLdb.Error, e: |
| 114 |
print "Error %d: %s" % (e.args[0], e.args[1]) |
| 115 |
sys.exit(1) |
| 116 |
|
| 117 |
# init values tuple |
| 118 |
values = {}
|
| 119 |
cursor.execute(valuesQuery) |
| 120 |
results = cursor.fetchall() |
| 121 |
for result in results: |
| 122 |
values[result[0]] = 0 |
| 123 |
|
| 124 |
if len(sys.argv) == 2 and sys.argv[1] == "autoconf": |
| 125 |
print "yes" |
| 126 |
elif len(sys.argv) == 2 and sys.argv[1] == "config": |
| 127 |
print "multigraph mysql_aggregate_%s" % table |
| 128 |
print "graph_title Aggregate - %s" % table |
| 129 |
print "graph_vlabel count(*)" |
| 130 |
print "graph_category mysql" |
| 131 |
print "" |
| 132 |
|
| 133 |
for key in values.keys(): |
| 134 |
print "%s_count.label %s" % (key.replace(".", "_"), key.replace(".", "_"))
|
| 135 |
|
| 136 |
for key in values.keys(): |
| 137 |
print "" |
| 138 |
print "multigraph mysql_aggregate_%s.%s" % (table, key.replace(".", "_"))
|
| 139 |
print "graph_title Agregate - %s, value %s" % (table, key.replace(".", "_"))
|
| 140 |
print "graph_vlabel count(*)" |
| 141 |
print "graph_category mysql" |
| 142 |
print "" |
| 143 |
print "%s_count.label %s" % (key.replace(".", "_"), key)
|
| 144 |
print "" |
| 145 |
|
| 146 |
else: |
| 147 |
try: |
| 148 |
cursor.execute(aggregateQuery) |
| 149 |
results = cursor.fetchall() |
| 150 |
|
| 151 |
for result in results: |
| 152 |
values[result[0]] = result[1] |
| 153 |
print "multigraph mysql_aggregate_%s" % table |
| 154 |
|
| 155 |
for key in values.keys(): |
| 156 |
print "%s_count.value %s" % (key.replace(".", "_"), values[key])
|
| 157 |
|
| 158 |
for key in values.keys(): |
| 159 |
print "" |
| 160 |
print "multigraph mysql_aggregate_%s.%s" % (table, key.replace(".", "_"))
|
| 161 |
print "%s_count.value %s" % (key.replace(".", "_"), values[key])
|
| 162 |
|
| 163 |
except MySQLdb.Error, e: |
| 164 |
print "Error %d: %s" % (e.args[0], e.args[1]) |
| 165 |
|
| 166 |
if conn: |
| 167 |
conn.close() |
