[Checkins] SVN: zc.resumelb/trunk/ Added a command-line script to fetch lb status data, assuming you're
jim
cvs-admin at zope.org
Fri May 11 18:50:06 UTC 2012
Log message for revision 125847:
Added a command-line script to fetch lb status data, assuming you're
using the ZooKeeper-aware load-balancer script and have requested a
status server. (Also updated the status output to show request
start times as integer seconds.)
Changed:
U zc.resumelb/trunk/buildout.cfg
U zc.resumelb/trunk/setup.py
U zc.resumelb/trunk/src/zc/resumelb/README.txt
U zc.resumelb/trunk/src/zc/resumelb/tests.py
U zc.resumelb/trunk/src/zc/resumelb/zk.py
U zc.resumelb/trunk/src/zc/resumelb/zk.test
-=-
Modified: zc.resumelb/trunk/buildout.cfg
===================================================================
--- zc.resumelb/trunk/buildout.cfg 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/buildout.cfg 2012-05-11 18:50:02 UTC (rev 125847)
@@ -31,8 +31,10 @@
[lb]
recipe = zc.zdaemonrecipe
path = ${zookeeper:effective-path}/lb
+prog = ${buildout:bin-directory}/zkresumelb
+status = -s ${buildout:parts-directory}/${:_buildout_section_name_}/status.sock
program =
- ${buildout:bin-directory}/zkresumelb -d ${zookeeper:zookeeper} ${:path}
+ ${:prog} ${:status} -d ${zookeeper:zookeeper} ${:path}
[worker.ini]
recipe = zc.recipe.deployment:configuration
Modified: zc.resumelb/trunk/setup.py
===================================================================
--- zc.resumelb/trunk/setup.py 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/setup.py 2012-05-11 18:50:02 UTC (rev 125847)
@@ -25,6 +25,7 @@
resumelb = zc.resumelb.lb:main
zkresumelb = zc.resumelb.zk:lbmain
get-worker-resume = zc.resumelb.worker:get_resume_main
+get-lb-status = zc.resumelb.zk:get_lb_status
[paste.server_runner]
main = zc.resumelb.worker:server_runner
Modified: zc.resumelb/trunk/src/zc/resumelb/README.txt
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-05-11 18:50:02 UTC (rev 125847)
@@ -242,6 +242,14 @@
Change History
==============
+0.6.0 (2012-05-11)
+------------------
+
+- Added a command-line script to fetch lb status data, assuming you're
+ using the ZooKeeper-aware load-balancer script and have requested a
+ status server. (Also updated the status output to show request
+ start times as integer seconds.)
+
0.5.2 (2012-05-09)
------------------
Modified: zc.resumelb/trunk/src/zc/resumelb/tests.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/tests.py 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/src/zc/resumelb/tests.py 2012-05-11 18:50:02 UTC (rev 125847)
@@ -280,6 +280,8 @@
zope.testing.setupstack.tearDown(test)
def test_suite():
+ e1 = r'127.0.0.1:\d+\s+1\s+0.7\s+0'
+ e2 = r'127.0.0.1:\d+\s+0\s+0.0\s+-'
return unittest.TestSuite((
manuel.testing.TestSuite(
manuel.doctest.Manuel(
@@ -292,6 +294,7 @@
'lb.test', 'pool.test', 'worker.test', 'bytesizedqueue.test',
'bufferedqueue.test',
setUp=setUp, tearDown=zope.testing.setupstack.tearDown),
+
manuel.testing.TestSuite(
manuel.doctest.Manuel(
checker = zope.testing.renormalizing.OutputChecker([
@@ -300,6 +303,13 @@
),
'ACCESS'),
(re.compile(r"u'pid': \d+"), "u'pid': PID"),
+ (re.compile(
+ '(' +
+ e1 + r'\s*\n\s*' + e2
+ + '|' +
+ e2 + r'\s*\n\s*' + e1
+ + ')\s*'
+ ), 'WORKERDETAILS')
])
) + manuel.capture.Manuel(),
'zk.test',
Modified: zc.resumelb/trunk/src/zc/resumelb/zk.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/zk.py 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/src/zc/resumelb/zk.py 2012-05-11 18:50:02 UTC (rev 125847)
@@ -24,6 +24,7 @@
import signal
import socket
import sys
+import time
import zc.parse_addr
import zc.zk
@@ -227,7 +228,8 @@
(worker.__name__,
worker.backlog,
worker.mbacklog,
- worker.oldest_time
+ (int(worker.oldest_time)
+ if worker.oldest_time else None),
)
for worker in sorted(
pool.workers, key=lambda w: w.__name__)
@@ -271,3 +273,33 @@
def __init__(self, logger):
self.write = logging.getLogger(logger).info
+
+worker_format = '%30s%8s%8s%8s'
+def get_lb_status(args=None):
+ if args is None:
+ args = sys.argv[1:]
+
+ for addr in args:
+ print 'status for', addr
+ status_socket = gevent.socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ status_socket.connect(addr)
+ status_file = status_socket.makefile()
+ status = json.loads(status_file.read())
+ status_file.close()
+ status_socket.close()
+ now = int(time.time())
+ workers = status['workers']
+ if workers:
+ print ' backlog: %s, mean backlog: %.1f' % (
+ status['backlog'], status['mean_backlog'])
+ print ' workers: %s, mean backlog per worker: %.1f' % (
+ len(workers), status['mean_backlog'] / len(workers),
+ )
+ print
+ print worker_format % ('worker', 'backlog', 'mean bl', 'age')
+ for name, bl, mbl, start in workers:
+ print worker_format % (
+ name, bl, "%.1f" % mbl,
+ now-start if start is not None else '-')
+ else:
+ print 'This load-balancer has no workers!'
Modified: zc.resumelb/trunk/src/zc/resumelb/zk.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/zk.test 2012-05-11 02:55:41 UTC (rev 125846)
+++ zc.resumelb/trunk/src/zc/resumelb/zk.test 2012-05-11 18:50:02 UTC (rev 125847)
@@ -275,8 +275,18 @@
----------------
When we started the lb, we told it to create a status server. The
-server is registered with ZooKeeper:
+server is registered with ZooKeeper. We'll cause a request to be
+outstanding to have a case with a worker backlog:
+ >>> sock = gevent.socket.create_connection(('127.0.0.1', addr[1]))
+ >>> sock.sendall('''GET /gsleep.html?dur=1 HTTP/1.0\r
+ ... Host: h1.com\r
+ ... Content-Length: 0\r
+ ... \r
+ ... ''')
+ >>> gevent.sleep(.1)
+
+
>>> import socket
>>> status_socket = gevent.socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
>>> status_socket.connect('status.sock')
@@ -284,23 +294,32 @@
>>> import json
>>> status = json.loads(status_file.read())
>>> pprint(status, width=1) # doctest: +ELLIPSIS
- {u'backlog': 0,
- u'mean_backlog': 0.4...,
- u'workers': [[u'127.0.0.1:...',
- 0,
- ...],
- [u'127.0.0.1:...',
- 0,
- ...]]}
+ {u'backlog': 1,
+ u'mean_backlog': 0.6...,
+ u'workers': [...]}
>>> sorted(status['workers'], key=lambda w: w[2])
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
[[u'127.0.0.1:...', 0, 0, None],
- [u'127.0.0.1:...', 0, 0.48..., None]]
+ [u'127.0.0.1:...', 1, 0.6..., 13...]]
>>> status_file.close()
>>> status_socket.close()
+There's also a command-line client for the status server:
+
+ >>> zc.resumelb.zk.get_lb_status(['status.sock'])
+ status for status.sock
+ backlog: 1, mean backlog: 0.7
+ workers: 2, mean backlog per worker: 0.3
+ <BLANKLINE>
+ worker backlog mean bl age
+ 127.0.0.1:52308 0 0.0 -
+ 127.0.0.1:48407 1 0.7 0
+
+
+ >>> sock.close()
+
Shutdown
--------
More information about the checkins
mailing list