diff --git a/redbot/__main__.py b/redbot/__main__.py index b1f0b8f43..28029fef5 100644 --- a/redbot/__main__.py +++ b/redbot/__main__.py @@ -10,7 +10,6 @@ from redbot.core.data_manager import load_basic_configuration, config_file from redbot.core.json_io import JsonIO from redbot.core.global_checks import init_global_checks from redbot.core.events import init_events -from redbot.core.sentry_setup import init_sentry_logging from redbot.core.cli import interactive_config, confirm, parse_cli_flags, ask_sentry from redbot.core.core_commands import Core from redbot.core.dev_commands import Dev @@ -129,7 +128,7 @@ def main(): sys.exit(1) loop.run_until_complete(_get_prefix_and_token(red, tmp_data)) if tmp_data['enable_sentry']: - init_sentry_logging(sentry_log) + red.enable_sentry() cleanup_tasks = True try: loop.run_until_complete(red.start(token, bot=not cli_flags.not_bot)) diff --git a/redbot/core/bot.py b/redbot/core/bot.py index 17163b252..906ca6e8f 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -1,5 +1,6 @@ import asyncio import os +import logging from collections import Counter from enum import Enum from importlib.machinery import ModuleSpec @@ -17,7 +18,7 @@ from . import ( rpc ) from .help_formatter import Help, help as help_ - +from .sentry import SentryManager from .utils import TYPE_CHECKING if TYPE_CHECKING: @@ -102,6 +103,22 @@ class RedBase(BotBase, RpcMethodMixin): self.add_command(help_) + self._sentry_mgr = None + + def enable_sentry(self): + """Enable Sentry logging for Red.""" + if self._sentry_mgr is None: + sentry_log = logging.getLogger('red.sentry') + sentry_log.setLevel(logging.WARNING) + self._sentry_mgr = SentryManager(sentry_log) + self._sentry_mgr.enable() + + def disable_sentry(self): + """Disable Sentry logging for Red.""" + if self._sentry_mgr is None: + return + self._sentry_mgr.disable() + async def _dict_abuse(self, indict): """ Please blame <@269933075037814786> for this. diff --git a/redbot/core/core_commands.py b/redbot/core/core_commands.py index f0157229b..5564a9c32 100644 --- a/redbot/core/core_commands.py +++ b/redbot/core/core_commands.py @@ -476,6 +476,23 @@ class Core: await ctx.send(_("Locale has been set.")) + @_set.command() + @checks.is_owner() + async def sentry(self, ctx: commands.Context, on_or_off: bool): + """Enable or disable Sentry logging. + + Sentry is the service Red uses to manage error reporting. This should + be disabled if you have made your own modifications to the redbot + package. + """ + await ctx.bot.db.enable_sentry.set(on_or_off) + if on_or_off: + ctx.bot.enable_sentry() + await ctx.send(_("Done. Sentry logging is now enabled.")) + else: + ctx.bot.disable_sentry() + await ctx.send(_("Done. Sentry logging is now disabled.")) + @commands.command() @commands.cooldown(1, 60, commands.BucketType.user) async def contact(self, ctx, *, message: str): @@ -705,4 +722,3 @@ class Core: async def rpc_reload(self, request): await self.rpc_unload(request) await self.rpc_load(request) - diff --git a/redbot/core/sentry.py b/redbot/core/sentry.py new file mode 100644 index 000000000..e1808f04b --- /dev/null +++ b/redbot/core/sentry.py @@ -0,0 +1,30 @@ +import logging +from raven import Client +from raven.handlers.logging import SentryHandler + +from redbot.core import __version__ + +__all__ = ("SentryManager",) + + +class SentryManager: + """Simple class to manage sentry logging for Red.""" + + def __init__(self, logger: logging.Logger): + self.client = Client( + dsn=("https://62402161d4cd4ef18f83b16f3e22a020:9310ef55a502442598203205a84da2bb@" + "sentry.io/253983"), + release=__version__, + include_paths=['redbot'], + enable_breadcrumbs=False + ) + self.handler = SentryHandler(self.client) + self.logger = logger + + def enable(self): + """Enable error reporting for Sentry.""" + self.logger.addHandler(self.handler) + + def disable(self): + """Disable error reporting for Sentry.""" + self.logger.removeHandler(self.handler) diff --git a/redbot/core/sentry_setup.py b/redbot/core/sentry_setup.py deleted file mode 100644 index ed360e24e..000000000 --- a/redbot/core/sentry_setup.py +++ /dev/null @@ -1,26 +0,0 @@ -from raven import Client -from raven.handlers.logging import SentryHandler - -from redbot.core import __version__ - -__all__ = ("init_sentry_logging",) - - -include_paths = ( - 'redbot', -) - -client = None - - -def init_sentry_logging(logger): - global client - client = Client( - dsn=("https://62402161d4cd4ef18f83b16f3e22a020:9310ef55a502442598203205a84da2bb@" - "sentry.io/253983"), - release=__version__, - include_paths=['redbot'], - enable_breadcrumbs=False - ) - handler = SentryHandler(client) - logger.addHandler(handler) diff --git a/tests/core/test_sentry.py b/tests/core/test_sentry.py index 0b9cdca8f..227bab053 100644 --- a/tests/core/test_sentry.py +++ b/tests/core/test_sentry.py @@ -1,12 +1,12 @@ import logging -from redbot.core import sentry_setup +from redbot.core import sentry def test_sentry_capture(red): log = logging.getLogger(__name__) - sentry_setup.init_sentry_logging(log) + mgr = sentry.SentryManager(log) - assert sentry_setup.client is not None + assert mgr.client is not None - sentry_setup.client.captureMessage("Message from test_sentry module.") \ No newline at end of file + mgr.client.captureMessage("Message from test_sentry module.")