[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