SVN: ZODB/trunk/src/ ZEO clients now support a client_label constructor argument and

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <20100504192656.934757083BC__3882.46869338236$1273001225$gmane$org@cvs.zope.org>
Log message for revision 111943:
  ZEO clients now support a client_label constructor argument and
    client-label configuration-file option to specify a label for a
    client in server logs. This makes it easier to identify specific
    clients corresponding to server log entries, especially when there
    are multiple clients originating from the same machine.
  

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZEO/ClientStorage.py
  U   ZODB/trunk/src/ZEO/ServerStub.py
  U   ZODB/trunk/src/ZEO/StorageServer.py
  U   ZODB/trunk/src/ZEO/tests/testZEO.py
  U   ZODB/trunk/src/ZODB/component.xml
  U   ZODB/trunk/src/ZODB/config.py

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/CHANGES.txt	2010-05-04 19:26:56 UTC (rev 111943)
@@ -21,6 +21,12 @@
   information the number of clients, lock requests and general
   statistics.
 
+- ZEO clients now support a client_label constructor argument and
+  client-label configuration-file option to specify a label for a
+  client in server logs. This makes it easier to identify specific
+  clients corresponding to server log entries, especially when there
+  are multiple clients originating from the same machine.
+
 - The mkzeoinst script has been moved to a separate project:
 
     http://pypi.python.org/pypi/zope.mkzeoinstance

Modified: ZODB/trunk/src/ZEO/ClientStorage.py
===================================================================
--- ZODB/trunk/src/ZEO/ClientStorage.py	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZEO/ClientStorage.py	2010-05-04 19:26:56 UTC (rev 111943)
@@ -123,6 +123,7 @@
                  username='', password='', realm=None,
                  blob_dir=None, shared_blob_dir=False,
                  blob_cache_size=None, blob_cache_size_check=10,
+                 client_label=None,
                  ):
         """ClientStorage constructor.
 
@@ -234,6 +235,9 @@
             loaded into the cache. Defaults to 10% of the blob cache
             size.   This option is ignored if shared_blob_dir is true.
 
+        client_label
+            A label to include in server log messages for the client.
+
         Note that the authentication protocol is defined by the server
         and is detected by the ClientStorage upon connecting (see
         testConnection() and doAuth() for details).
@@ -317,6 +321,8 @@
         # _server_addr is used by sortKey()
         self._server_addr = None
 
+        self._client_label = client_label
+
         self._pickler = self._tfile = None
 
         self._info = {'length': 0, 'size': 0, 'name': 'ZEO Client',
@@ -622,6 +628,10 @@
                         self.__name__, self._server_addr)
 
         stub = self.StorageServerStubClass(conn)
+
+        if self._client_label and conn.peer_protocol_version >= "Z310":
+            stub.set_client_label(self._client_label)
+
         self._oids = []
         self.verify_cache(stub)
 

Modified: ZODB/trunk/src/ZEO/ServerStub.py
===================================================================
--- ZODB/trunk/src/ZEO/ServerStub.py	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZEO/ServerStub.py	2010-05-04 19:26:56 UTC (rev 111943)
@@ -299,6 +299,9 @@
     def server_status(self):
         return self.rpc.call("server_status")
 
+    def set_client_label(self, label):
+        return self.rpc.callAsync('set_client_label', label)
+
 class StorageServer308(StorageServer):
 
     def __init__(self, rpc):

Modified: ZODB/trunk/src/ZEO/StorageServer.py
===================================================================
--- ZODB/trunk/src/ZEO/StorageServer.py	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZEO/StorageServer.py	2010-05-04 19:26:56 UTC (rev 111943)
@@ -759,6 +759,9 @@
     def server_status(self):
         return self.server.server_status(self)
 
+    def set_client_label(self, label):
+        self.log_label = str(label)+' '+_addr_label(self.connection.addr)
+
 class StorageServerDB:
 
     def __init__(self, server, storage_id):

Modified: ZODB/trunk/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/testZEO.py	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZEO/tests/testZEO.py	2010-05-04 19:26:56 UTC (rev 111943)
@@ -1295,7 +1295,43 @@
     >>> db.close()
     """
 
+def client_labels():
+    """
+When looking at server logs, for servers with lots of clients coming
+from the same machine, it can be very difficult to correlate server
+log entries with actual clients.  It's possible, sort of, but tedious.
 
+You can make this easier by passing a label to the ClientStorage
+constructor.
+
+    >>> addr, _ = start_server()
+    >>> db = ZEO.DB(addr, client_label='test-label-1')
+    >>> db.close()
+    >>> for line in open('server-%s.log' % addr[1]):
+    ...     if 'test-label-1' in line:
+    ...         print line.split()[1:4]
+    ['INFO', 'ZEO.StorageServer', '(test-label-1']
+
+You can specify the client label via a configuration file as well:
+
+    >>> import ZODB.config
+    >>> db = ZODB.config.databaseFromString('''
+    ... <zodb>
+    ...    <zeoclient>
+    ...       server :%s
+    ...       client-label test-label-2
+    ...    </zeoclient>
+    ... </zodb>
+    ... ''' % addr[1])
+    >>> db.close()
+    >>> for line in open('server-%s.log' % addr[1]):
+    ...     if 'test-label-2' in line:
+    ...         print line.split()[1:4]
+    ['INFO', 'ZEO.StorageServer', '(test-label-2']
+
+    """
+
+
 if sys.version_info >= (2, 6):
     import multiprocessing
 

Modified: ZODB/trunk/src/ZODB/component.xml
===================================================================
--- ZODB/trunk/src/ZODB/component.xml	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZODB/component.xml	2010-05-04 19:26:56 UTC (rev 111943)
@@ -216,6 +216,11 @@
         instead of an expensive verification.
       </description>
     </key>
+    <key name="client-label" required="no">
+      <description>
+        A label for the client in server logs
+      </description>
+    </key>
   </sectiontype>
 
   <sectiontype name="demostorage" datatype=".DemoStorage"

Modified: ZODB/trunk/src/ZODB/config.py
===================================================================
--- ZODB/trunk/src/ZODB/config.py	2010-05-04 19:17:23 UTC (rev 111942)
+++ ZODB/trunk/src/ZODB/config.py	2010-05-04 19:26:56 UTC (rev 111943)
@@ -188,6 +188,8 @@
             options['blob_cache_size'] = self.config.blob_cache_size
         if self.config.blob_cache_size_check is not None:
             options['blob_cache_size_check'] = self.config.blob_cache_size_check
+        if self.config.client_label is not None:
+            options['client_label'] = self.config.client_label
 
         return ClientStorage(
             L,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.