fix: Massively improve logging context isolation.
This commit is contained in:
@@ -110,7 +110,7 @@ class Analytics(LionCog):
|
||||
duration = utc_now() - ctx.message.created_at
|
||||
event = CommandEvent(
|
||||
appname=appname,
|
||||
cmdname=ctx.command.name if ctx.command else 'Unknown',
|
||||
cmdname=ctx.command.name if ctx.command else 'Unknown', # TODO: qualified_name
|
||||
cogname=ctx.cog.qualified_name if ctx.cog else None,
|
||||
userid=ctx.author.id,
|
||||
created_at=utc_now(),
|
||||
|
||||
@@ -5,7 +5,7 @@ from collections import namedtuple
|
||||
from typing import NamedTuple, Optional, Generic, Type, TypeVar
|
||||
|
||||
from meta.ipc import AppRoute, AppClient
|
||||
from meta.logger import logging_context, log_wrap
|
||||
from meta.logger import logging_context, log_wrap, set_logging_context
|
||||
|
||||
from data import RowModel
|
||||
from .data import AnalyticsData, CommandStatus, VoiceAction, GuildAction
|
||||
@@ -52,39 +52,39 @@ class EventHandler(Generic[T]):
|
||||
f"Queue on event handler {self.route_name} is full! Discarding event {data}"
|
||||
)
|
||||
|
||||
@log_wrap(action='consumer', isolate=False)
|
||||
async def consumer(self):
|
||||
with logging_context(action='consumer'):
|
||||
while True:
|
||||
try:
|
||||
item = await self.queue.get()
|
||||
self.batch.append(item)
|
||||
if len(self.batch) > self.batch_size:
|
||||
await self.process_batch()
|
||||
except asyncio.CancelledError:
|
||||
# Try and process the last batch
|
||||
logger.info(
|
||||
f"Event handler {self.route_name} received cancellation signal! "
|
||||
"Trying to process last batch."
|
||||
)
|
||||
if self.batch:
|
||||
await self.process_batch()
|
||||
raise
|
||||
except Exception:
|
||||
logger.exception(
|
||||
f"Event handler {self.route_name} received unhandled error."
|
||||
" Ignoring and continuing cautiously."
|
||||
)
|
||||
pass
|
||||
while True:
|
||||
try:
|
||||
item = await self.queue.get()
|
||||
self.batch.append(item)
|
||||
if len(self.batch) > self.batch_size:
|
||||
await self.process_batch()
|
||||
except asyncio.CancelledError:
|
||||
# Try and process the last batch
|
||||
logger.info(
|
||||
f"Event handler {self.route_name} received cancellation signal! "
|
||||
"Trying to process last batch."
|
||||
)
|
||||
if self.batch:
|
||||
await self.process_batch()
|
||||
raise
|
||||
except Exception:
|
||||
logger.exception(
|
||||
f"Event handler {self.route_name} received unhandled error."
|
||||
" Ignoring and continuing cautiously."
|
||||
)
|
||||
pass
|
||||
|
||||
@log_wrap(action='batch', isolate=False)
|
||||
async def process_batch(self):
|
||||
with logging_context(action='batch'):
|
||||
logger.debug("Processing Batch")
|
||||
# TODO: copy syntax might be more efficient here
|
||||
await self.model.table.insert_many(
|
||||
self.struct._fields,
|
||||
*map(tuple, self.batch)
|
||||
)
|
||||
self.batch.clear()
|
||||
logger.debug("Processing Batch")
|
||||
# TODO: copy syntax might be more efficient here
|
||||
await self.model.table.insert_many(
|
||||
self.struct._fields,
|
||||
*map(tuple, self.batch)
|
||||
)
|
||||
self.batch.clear()
|
||||
|
||||
def bind(self, client: AppClient):
|
||||
"""
|
||||
|
||||
@@ -67,7 +67,11 @@ class AnalyticsServer:
|
||||
results = await self.talk_shard_snapshot().broadcast()
|
||||
|
||||
# Make sure everyone sent results and there were no exceptions (e.g. concurrency)
|
||||
if not all(result is not None and not isinstance(result, Exception) for result in results.values()):
|
||||
failed = not isinstance(results, dict)
|
||||
failed = failed or not any(
|
||||
result is None or isinstance(result, Exception) for result in results.values()
|
||||
)
|
||||
if failed:
|
||||
# This should essentially never happen
|
||||
# Either some of the shards could not make a snapshot (e.g. Discord client issues)
|
||||
# or they disconnected in the process.
|
||||
|
||||
Reference in New Issue
Block a user