由于微软云上的MySQL实例无法安装插件来导出数据,因此参考上一篇 通过Zabbix官方模板监控微软云Azure上多台Redis实例, 我们可以修改zabbix官方redis脚本,通过show status等命令获取到mysql的状态指标,用trap-messages模式发送给zabbix来监控微软云上的MySQL实例。
1. 运行环境:OS:CentOS 7.3 / Python: 2.7.3/ Pip: 9.0.1 / Zabbix:3.2.8 / MySQL:微软云MySQL 5.7
Zabbix官方提供的redis监控模板,我们修改官方提供的python脚本来监控MySQL。
项目地址:https://github.com/blacked/zbx_redis_template
2. 部署trap-messages方式的说明请参考上一篇 通过Zabbix官方模板监控微软云Azure上多台Redis实例。
1> 安装Python依赖
# yum -y install python-pip # pip install argparse # pip install pymysql
2> 将zbx_redis_stats.py放到zabbix服务器上某路径下并重命名,如/etc/zabbix/script/mysql/zbx_mysql_stats.py。
3> 修改脚本,下面是我修改的脚本,监控了show status获取的信息以及数据库表占用的空间等信息,可以直接拷贝,或者添加自己需要监控的其他信息。
# !/usr/bin/python
import 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()
class Metric(object):
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[5:])[0]
resp_body = zabbix.recv(resp_body_len)
zabbix.close()