Cuối cùng tôi đã từ bỏ và tự mình đi gỡ lỗi này.
Dựa trên câu trả lời của @ SelivanovPavel, tôi bật lên gỡ lỗi zencommand
và chờ đợi, và chắc chắn, ZenPack đã thất bại.
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
Vì vậy, tôi đã tìm hiểu ZenPack và phát hiện ra nó đang nhập (một phiên bản rõ ràng cũ) pymysql
từ /opt/zenoss/lib/python
.
Khi kiểm tra từ dòng lệnh python, tôi phát hiện ra ngoại lệ được ném từ đâu:
>>> 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)")
Và khi kiểm tra khu connections.py
vực chung đó, tôi phát hiện ra nỗi kinh hoàng của mình rằng nó đang cố mở một AF_INET
ổ cắm, và không có mã nào để mở AF_INET6
ổ cắm. Bùng nổ, thất bại ngay lập tức.
Phiên bản hiện tại pymysql
dường như cũng chứa thiếu sót này; không hỗ trợ IPv6 gì.
Vì vậy, "câu trả lời" là tôi sẽ phải sửa pymysql
. Không phải làm thế nào tôi muốn dành buổi chiều của tôi.
Một chút tin tặc khó chịu này sẽ khiến mọi thứ hoạt động (mặc dù bạn cần Python 2.6). Mở ra /opt/zenoss/lib/python/pymysql/connections.py
và tìm kiếm AF_INET
xung quanh dòng 660. Sau đó thực hiện thay đổi sau:
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'
Điều này đã được cố định trong pymysql ngược dòng và sẽ có sẵn trong một bản phát hành trong tương lai.