Saya akhirnya menyerah dan pergi untuk men-debug yang ini sendiri.
Berdasarkan jawaban @ SelivanovPavel, saya mengaktifkan debug zencommanddan menunggu, dan tentu saja, ZenPack gagal.
2012-08-16 18:16:14,092 INFO zen.zencommand: Datasource MySQL/mysql command: /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py -H 2001:db8:81:2c::2 -p 3306 -u zenoss -w 'password' -g
2012-08-16 18:16:14,100 DEBUG zen.zencommand: Running /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py
2012-08-16 18:16:14,544 DEBUG zen.zencommand: Datasource: mysql Received exit code: 1 Output: 'MySQL Error: (2003, "Can\'t connect to MySQL server on \'2001:db8:81:2c::2\' (-9)")\n'
2012-08-16 18:16:14,545 DEBUG zen.zencommand: Process MySQL/mysql stopped (1), 0.43 seconds elapsed
Jadi saya menggali ZenPack dan menemukan itu mengimpor (versi yang tampaknya lama) pymysqldari /opt/zenoss/lib/python.
Pada pengujian dari baris perintah python saya menemukan di mana pengecualian dilemparkan dari:
>>> sys.path.insert(0, "/opt/zenoss/lib/python");
>>> import pymysql
>>> pymysql.install_as_MySQLdb()
>>> import MySQLdb
>>> self.conn = MySQLdb.connect(host="2001:db8:81:2c::2", port=3306, db='', user='zenoss', passwd='password')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/zenoss/lib/python/pymysql/__init__.py", line 93, in Connect
return Connection(*args, **kwargs)
File "/opt/zenoss/lib/python/pymysql/connections.py", line 504, in __init__
self._connect()
File "/opt/zenoss/lib/python/pymysql/connections.py", line 673, in _connect
raise OperationalError(2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e.args[0]))
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")
Dan saat menginspeksi connections.pydi sekitar tempat umum itu, saya merasa ngeri ketika mencoba membuka AF_INETsoket, dan tidak ada kode di mana pun untuk membuka AF_INET6soket. Boom, gagal instan.
Versi saat ini pymysqljuga tampaknya mengandung kekurangan ini; tidak ada dukungan IPv6 apa pun.
Jadi "jawabannya" adalah saya harus memperbaikinya pymysql. Tidak bagaimana saya ingin menghabiskan sore saya.
Sedikit peretasan jahat ini berfungsi dengan baik (meskipun Anda membutuhkan Python 2.6). Buka /opt/zenoss/lib/python/pymysql/connections.pydan cari di AF_INETsekitar baris 660. Kemudian buat perubahan berikut:
if DEBUG: print 'connected using unix_socket'
else:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- t = sock.gettimeout()
- sock.settimeout(self.connect_timeout)
- sock.connect((self.host, self.port))
- sock.settimeout(t)
+ sock = socket.create_connection((self.host, self.port), self.connect_timeout)
self.host_info = "socket %s:%d" % (self.host, self.port)
if DEBUG: print 'connected using socket'
Sejak saat ini telah diperbaiki di pymysql hulu dan harus tersedia dalam rilis mendatang.