fix(logger): Livelogging ratelimit prevention.
This commit is contained in:
@@ -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 = []
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user