mirror of
https://git.yoctoproject.org/poky
synced 2026-09-19 18:49:32 +02:00
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:
committed by
Richard Purdie
parent
8ae00cf20d
commit
4cdb0f00f9
@@ -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):
|
||||||
|
|||||||
@@ -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')}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user