bitbake: asyncrpc: Prefix log messages with client info

Adds a logging adaptor to the asyncrpc clients that prefixes log
messages with the client remote address to aid in debugging

(Bitbake rev: f4d64ce73c2449c008ff5d9b32376a2893ef7195)

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Joshua Watt
2023-11-03 08:26:23 -06:00
committed by Richard Purdie
parent 8ae00cf20d
commit 4cdb0f00f9
2 changed files with 23 additions and 8 deletions

View File

@@ -12,10 +12,16 @@ import signal
import socket import socket
import sys import sys
import multiprocessing import multiprocessing
import logging
from .connection import StreamConnection, WebsocketConnection from .connection import StreamConnection, WebsocketConnection
from .exceptions import ClientError, ServerError, ConnectionClosedError from .exceptions import ClientError, ServerError, ConnectionClosedError
class ClientLoggerAdapter(logging.LoggerAdapter):
def process(self, msg, kwargs):
return f"[Client {self.extra['address']}] {msg}", kwargs
class AsyncServerConnection(object): class AsyncServerConnection(object):
# If a handler returns this object (e.g. `return self.NO_RESPONSE`), no # If a handler returns this object (e.g. `return self.NO_RESPONSE`), no
# return message will be automatically be sent back to the client # return message will be automatically be sent back to the client
@@ -27,7 +33,12 @@ class AsyncServerConnection(object):
self.handlers = { self.handlers = {
"ping": self.handle_ping, "ping": self.handle_ping,
} }
self.logger = logger self.logger = ClientLoggerAdapter(
logger,
{
"address": socket.address,
},
)
async def close(self): async def close(self):
await self.socket.close() await self.socket.close()
@@ -242,16 +253,20 @@ class AsyncServer(object):
self.server = WebsocketsServer(host, port, self._client_handler, self.logger) self.server = WebsocketsServer(host, port, self._client_handler, self.logger)
async def _client_handler(self, socket): async def _client_handler(self, socket):
address = socket.address
try: try:
client = self.accept_client(socket) client = self.accept_client(socket)
await client.process_requests() await client.process_requests()
except Exception as e: except Exception as e:
import traceback import traceback
self.logger.error("Error from client: %s" % str(e), exc_info=True) self.logger.error(
"Error from client %s: %s" % (address, str(e)), exc_info=True
)
traceback.print_exc() traceback.print_exc()
finally:
self.logger.debug("Client %s disconnected", address)
await socket.close() await socket.close()
self.logger.debug("Client disconnected")
@abc.abstractmethod @abc.abstractmethod
def accept_client(self, socket): def accept_client(self, socket):

View File

@@ -207,7 +207,7 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
async def dispatch_message(self, msg): async def dispatch_message(self, msg):
for k in self.handlers.keys(): for k in self.handlers.keys():
if k in msg: if k in msg:
logger.debug('Handling %s' % k) self.logger.debug('Handling %s' % k)
if 'stream' in k: if 'stream' in k:
return await self.handlers[k](msg[k]) return await self.handlers[k](msg[k])
else: else:
@@ -351,7 +351,7 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
break break
(method, taskhash) = l.split() (method, taskhash) = l.split()
#logger.debug('Looking up %s %s' % (method, taskhash)) #self.logger.debug('Looking up %s %s' % (method, taskhash))
cursor = self.db.cursor() cursor = self.db.cursor()
try: try:
row = self.query_equivalent(cursor, method, taskhash) row = self.query_equivalent(cursor, method, taskhash)
@@ -360,7 +360,7 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
if row is not None: if row is not None:
msg = row['unihash'] msg = row['unihash']
#logger.debug('Found equivalent task %s -> %s', (row['taskhash'], row['unihash'])) #self.logger.debug('Found equivalent task %s -> %s', (row['taskhash'], row['unihash']))
elif self.upstream_client is not None: elif self.upstream_client is not None:
upstream = await self.upstream_client.get_unihash(method, taskhash) upstream = await self.upstream_client.get_unihash(method, taskhash)
if upstream: if upstream:
@@ -480,8 +480,8 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
row = self.query_equivalent(cursor, data['method'], data['taskhash']) row = self.query_equivalent(cursor, data['method'], data['taskhash'])
if row['unihash'] == data['unihash']: if row['unihash'] == data['unihash']:
logger.info('Adding taskhash equivalence for %s with unihash %s', self.logger.info('Adding taskhash equivalence for %s with unihash %s',
data['taskhash'], row['unihash']) data['taskhash'], row['unihash'])
d = {k: row[k] for k in ('taskhash', 'method', 'unihash')} d = {k: row[k] for k in ('taskhash', 'method', 'unihash')}