fix(logger): Livelogging ratelimit prevention.

This commit is contained in:
2023-09-24 11:22:17 +03:00
parent fe0d120907
commit a7663f9267
2 changed files with 26 additions and 11 deletions

View File

@@ -10,6 +10,7 @@ from io import StringIO
from functools import wraps from functools import wraps
from contextvars import ContextVar from contextvars import ContextVar
import discord
from discord import Webhook, File from discord import Webhook, File
import aiohttp import aiohttp
@@ -304,6 +305,10 @@ class WebHookHandler(logging.StreamHandler):
self.webhook = Webhook.from_url(self.webhook_url, session=self.session) self.webhook = Webhook.from_url(self.webhook_url, session=self.session)
async def post(self, record): async def post(self, record):
if record.context == 'Webhook Logger':
# Don't livelog livelog errors
# Otherwise we recurse and Cloudflare hates us
return
log_context.set("Webhook Logger") log_context.set("Webhook Logger")
log_action_stack.set(("Logging",)) log_action_stack.set(("Logging",))
log_app.set(record.app) log_app.set(record.app)
@@ -371,7 +376,7 @@ class WebHookHandler(logging.StreamHandler):
except BucketFull: except BucketFull:
logger.warning( logger.warning(
"Can't keep up! " "Can't keep up! "
"Ignoring records on live-logger {self.webhook.id}." f"Ignoring records on live-logger {self.webhook.id}."
) )
self.ignored += 1 self.ignored += 1
return return
@@ -383,6 +388,7 @@ class WebHookHandler(logging.StreamHandler):
) )
self.ignored = 0 self.ignored = 0
try:
if as_file or len(message) > 1900: if as_file or len(message) > 1900:
with StringIO(message) as fp: with StringIO(message) as fp:
fp.seek(0) fp.seek(0)
@@ -393,6 +399,11 @@ class WebHookHandler(logging.StreamHandler):
) )
else: else:
await self.webhook.send(self.prefix + '\n' + message, username=log_app.get()) await self.webhook.send(self.prefix + '\n' + message, username=log_app.get())
except discord.HTTPException:
logger.exception(
"Live logger errored. Slowing down live logger."
)
self.bucket.fill()
handlers = [] handlers = []

View File

@@ -80,6 +80,10 @@ class Bucket:
self._last_full = False self._last_full = False
self._level += 1 self._level += 1
def fill(self):
self._leak()
self._level = max(self._level, self.max_level + 1)
async def wait(self): async def wait(self):
""" """
Wait until the bucket has room. Wait until the bucket has room.