Zabbix(四) : 通过修改Zabbix官方redis模板监控微软云Azure上多台MySQL实例
# !/usr/bin/pythonimport sys, pymysql, json, re, struct, time, socket, argparse
parser = argparse.ArgumentParser(description='Zabbix MySQL status script')
parser.add_argument('mysql_hostname', nargs='?')
parser.add_argument('metric', nargs='?')
parser.add_argument('db', default='none', nargs='?')
parser.add_argument('-p', '--port', dest='mysql_port', action='store', help='MySQL server port', default=3306, type=int)
parser.add_argument('-a', '--auth', dest='mysql_pass', action='store', help='MySQL server pass', default=None)
parser.add_argument('-u', '--user', dest='mysql_user', action='store', help='MySQL server user', default=None)
args = parser.parse_args()
zabbix_host = '127.0.0.1'# Zabbix Server IP
zabbix_port = 10051# Zabbix Server Port
# Name of monitored server like it shows in zabbix web ui display
mysql_hostname = args.mysql_hostname if args.mysql_hostname else socket.gethostname()
>
def __init__(self, host, key, value, clock=None):
self.host = host
self.key = key
self.value = value
self.clock = clock
def __repr__(self):
result = None
if self.clock is None:
result = 'Metric(%r, %r, %r)' % (self.host, self.key, self.value)
else:
result = 'Metric(%r, %r, %r, %r)' % (self.host, self.key, self.value, self.clock)
return result
def value_format(value):
if value.isdigit() is True:
value = int(value)
return value
def send_to_zabbix(metrics, zabbix_host='127.0.0.1', zabbix_port=10051):
result = None
j = json.dumps
metrics_data = []
for m in metrics:
clock = m.clock or ('%d' % time.time())
metrics_data.append(
('{"host":%s,"key":%s,"value":%s,"clock":%s}') % (j(m.host), j(m.key), j(m.value), j(clock)))
json_data = ('{"request":"sender data","data":[%s]}') % (','.join(metrics_data))
data_len = struct.pack('<Q', len(json_data))
packet = 'ZBXD\x01' + data_len + json_data
# For debug:
# print(packet)
# print(':'.join(x.encode('hex') for x in packet))
try:
zabbix = socket.socket()
zabbix.connect((zabbix_host, zabbix_port))
zabbix.sendall(packet)
resp_hdr = _recv_all(zabbix, 13)
if not resp_hdr.startswith('ZBXD\x01') or len(resp_hdr) != 13:
print('Wrong zabbix response')
result = False
else:
resp_body_len = struct.unpack('<Q', resp_hdr)
resp_body = zabbix.recv(resp_body_len)
zabbix.close()
resp = json.loads(resp_body)
# For debug
# print(resp)
if resp.get('response') == 'success':
result = True
else:
print('Got error from Zabbix: %s' % resp)
result = False
except:
print('Error while sending data to Zabbix')
result = False
finally:
return result
def _recv_all(sock, count):
buf = ''
while len(buf) < count:
chunk = sock.recv(count - len(buf))
if not chunk:
return buf
buf += chunk
return buf
def main():
if mysql_hostname and args.metric:
client = pymysql.connect(host=mysql_hostname, user=args.mysql_user, password=args.mysql_pass)
cursor = client.cursor()
cursor.execute("show status")
data = cursor.fetchall()
dict_local = {}
for k, v in data:
dict_local = v
cursor.execute("select SCHEMA_NAME from information_schema.schemata ")
db = cursor.fetchall()
dblist = []
for i in db:
dblist.append(i)
if args.metric:
def list_db():
if args.db in dblist:
print(dblist)
else:
print('database_detect')
def default():
if args.metric in dict_local.keys():
print(dict_local)
{
'list_db': list_db
}.get(args.metric, default)()
else:
print('Not selected metric')
else:
client = pymysql.connect(host=mysql_hostname, user=args.mysql_user, password=args.mysql_pass)
cursor = client.cursor()
cursor.execute("show status")
data = cursor.fetchall()
a = []
for k, v in data:
k = k.lower()
v = value_format(v)
a.append(Metric(mysql_hostname, ('azuremysql[%s]' % k), v))
# cursor.execute("show processlist;")
cursor.execute("select count(*) from information_schema.processlist;")
processdata = cursor.fetchall()
# process_count = len(processdata)
process_count = processdata
a.append(Metric(mysql_hostname, 'azuremysql', process_count))
cursor.execute(
"select table_schema,round(sum(data_length+index_length)/1024/1024,4) from information_schema.tables group by table_schema;")
spacedata = cursor.fetchall()
totalspace = 0
for k, v in spacedata:
a.append(Metric(mysql_hostname, ('azuremysql[%s]' % k), float(v)))
totalspace += float(v)
a.append(Metric(mysql_hostname, 'azuremysql', totalspace))
# Send packet to zabbix
send_to_zabbix(a, zabbix_host, zabbix_port)
# for i in a:
# print(i)
cursor.close()
client.close()
if __name__ == '__main__':
main()
页:
[1]