diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ea9678ab2..7c3c8d4a1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -18,7 +18,6 @@ redbot/core/i18n.py @tekulvw redbot/core/json_io.py @tekulvw redbot/core/modlog.py @palmtree5 redbot/core/rpc.py @tekulvw -redbot/core/sentry_setup.py @Kowlin @tekulvw redbot/core/utils/chat_formatting.py @tekulvw redbot/core/utils/mod.py @palmtree5 redbot/core/utils/data_converter.py @mikeshardmind diff --git a/Pipfile.lock b/Pipfile.lock index a665966cb..0b5caee71 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -251,20 +251,6 @@ ], "version": "==3.13" }, - "raven": { - "hashes": [ - "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", - "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" - ], - "version": "==6.10.0" - }, - "raven-aiohttp": { - "hashes": [ - "sha256:1444a49c93a85b8bb57c6ee649e512368dce7a26ad64ac3a01d86aa5669d77f3", - "sha256:6a34b6a9841ad0fd827eeb158edb5826c5c5bd7babe2cde2a3f23eb85313af04" - ], - "version": "==0.7.0" - }, "red-discordbot": { "editable": true, "extras": [ @@ -683,20 +669,6 @@ ], "version": "==3.13" }, - "raven": { - "hashes": [ - "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", - "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" - ], - "version": "==6.10.0" - }, - "raven-aiohttp": { - "hashes": [ - "sha256:1444a49c93a85b8bb57c6ee649e512368dce7a26ad64ac3a01d86aa5669d77f3", - "sha256:6a34b6a9841ad0fd827eeb158edb5826c5c5bd7babe2cde2a3f23eb85313af04" - ], - "version": "==0.7.0" - }, "red-discordbot": { "editable": true, "extras": [ diff --git a/redbot/__main__.py b/redbot/__main__.py index 59dab93a9..5dd9d33b2 100644 --- a/redbot/__main__.py +++ b/redbot/__main__.py @@ -10,7 +10,7 @@ from redbot.core.data_manager import create_temp_config, load_basic_configuratio 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.cli import interactive_config, confirm, parse_cli_flags, ask_sentry +from redbot.core.cli import interactive_config, confirm, parse_cli_flags from redbot.core.core_commands import Core from redbot.core.dev_commands import Dev from redbot.core import __version__ @@ -77,11 +77,7 @@ def init_loggers(cli_flags): logger.addHandler(fhandler) logger.addHandler(stdout_handler) - # Sentry stuff - sentry_logger = logging.getLogger("red.sentry") - sentry_logger.setLevel(logging.WARNING) - - return logger, sentry_logger + return logger async def _get_prefix_and_token(red, indict): @@ -92,7 +88,6 @@ async def _get_prefix_and_token(red, indict): """ indict["token"] = await red.db.token() indict["prefix"] = await red.db.prefix() - indict["enable_sentry"] = await red.db.enable_sentry() def list_instances(): @@ -136,7 +131,7 @@ def main(): cli_flags.instance_name = "temporary_red" create_temp_config() load_basic_configuration(cli_flags.instance_name) - log, sentry_log = init_loggers(cli_flags) + log = init_loggers(cli_flags) red = Red(cli_flags=cli_flags, description=description, pm_help=None) init_global_checks(red) init_events(red, cli_flags) @@ -166,8 +161,6 @@ def main(): if cli_flags.dry_run: loop.run_until_complete(red.http.close()) sys.exit(0) - if tmp_data["enable_sentry"]: - red.enable_sentry() try: loop.run_until_complete(red.start(token, bot=True)) except discord.LoginFailure: @@ -184,7 +177,6 @@ def main(): red._shutdown_mode = ExitCodes.SHUTDOWN except Exception as e: log.critical("Fatal exception", exc_info=e) - sentry_log.critical("Fatal Exception", exc_info=e) loop.run_until_complete(red.logout()) finally: pending = asyncio.Task.all_tasks(loop=red.loop) diff --git a/redbot/core/bot.py b/redbot/core/bot.py index 59a4f8ab6..21a0ed70f 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -16,7 +16,6 @@ from . import Config, i18n, commands, errors from .cog_manager import CogManager from .help_formatter import Help, help as help_ from .rpc import RPCMixin -from .sentry import SentryManager from .utils import common_filters @@ -47,7 +46,6 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): owner=None, whitelist=[], blacklist=[], - enable_sentry=None, locale="en", embeds=True, color=15158332, @@ -120,23 +118,8 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): self.add_command(help_) - self._sentry_mgr = None self._permissions_hooks: List[commands.CheckPredicate] = [] - 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. @@ -516,8 +499,6 @@ class Red(RedBase, discord.AutoShardedClient): async def logout(self): """Logs out of Discord and closes all connections.""" - if self._sentry_mgr: - await self._sentry_mgr.close() await super().logout() diff --git a/redbot/core/cli.py b/redbot/core/cli.py index 55e0ba3c0..af29bc44c 100644 --- a/redbot/core/cli.py +++ b/redbot/core/cli.py @@ -1,8 +1,6 @@ import argparse import asyncio -from redbot.core.bot import Red - def confirm(m=""): return input(m).lower().strip() in ("y", "yes") @@ -42,26 +40,9 @@ def interactive_config(red, token_set, prefix_set): if prefix: loop.run_until_complete(red.db.prefix.set([prefix])) - ask_sentry(red) - return token -def ask_sentry(red: Red): - loop = asyncio.get_event_loop() - print( - "\nThank you for installing Red V3! Red is constantly undergoing\n" - " improvements, and we would like to ask if you are comfortable with\n" - " the bot automatically submitting fatal error logs to the development\n" - ' team. If you wish to opt into the process please type "yes":\n' - ) - if not confirm("> "): - loop.run_until_complete(red.db.enable_sentry.set(False)) - else: - loop.run_until_complete(red.db.enable_sentry.set(True)) - print("\nThank you for helping us with the development process!") - - def parse_cli_flags(args): parser = argparse.ArgumentParser( description="Red - Discord Bot", usage="redbot [arguments]" diff --git a/redbot/core/core_commands.py b/redbot/core/core_commands.py index 51ac92969..2d129e65b 100644 --- a/redbot/core/core_commands.py +++ b/redbot/core/core_commands.py @@ -1015,23 +1015,6 @@ class Core(commands.Cog, CoreLogic): 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.")) - @_set.command() @checks.is_owner() async def custominfo(self, ctx: commands.Context, *, text: str = None): diff --git a/redbot/core/events.py b/redbot/core/events.py index 7531ee8ea..121162b4f 100644 --- a/redbot/core/events.py +++ b/redbot/core/events.py @@ -19,34 +19,18 @@ from .utils.chat_formatting import inline, bordered, format_perms_list from .utils import fuzzy_command_search, format_fuzzy_results log = logging.getLogger("red") -sentry_log = logging.getLogger("red.sentry") init() INTRO = """ -______ _ ______ _ _ ______ _ -| ___ \ | | | _ (_) | | | ___ \ | | -| |_/ /___ __| | ______ | | | |_ ___ ___ ___ _ __ __| | | |_/ / ___ | |_ +______ _ ______ _ _ ______ _ +| ___ \ | | | _ (_) | | | ___ \ | | +| |_/ /___ __| | ______ | | | |_ ___ ___ ___ _ __ __| | | |_/ / ___ | |_ | // _ \/ _` | |______| | | | | / __|/ __/ _ \| '__/ _` | | ___ \/ _ \| __| -| |\ \ __/ (_| | | |/ /| \__ \ (_| (_) | | | (_| | | |_/ / (_) | |_ +| |\ \ __/ (_| | | |/ /| \__ \ (_| (_) | | | (_| | | |_/ / (_) | |_ \_| \_\___|\__,_| |___/ |_|___/\___\___/|_| \__,_| \____/ \___/ \__| """ -def should_log_sentry(exception) -> bool: - e = exception - while e.__cause__ is not None: - e = e.__cause__ - - tb = e.__traceback__ - tb_frame = None - while tb is not None: - tb_frame = tb.tb_frame - tb = tb.tb_next - - module = tb_frame.f_globals.get("__name__") - return module is not None and module.startswith("redbot") - - def init_events(bot, cli_flags): @bot.event async def on_connect(): @@ -142,7 +126,6 @@ def init_events(bot, cli_flags): ) INFO2 = [] - sentry = await bot.db.enable_sentry() mongo_enabled = storage_type() != "JSON" reqs_installed = {"docs": None, "test": None} for key in reqs_installed.keys(): @@ -155,7 +138,6 @@ def init_events(bot, cli_flags): reqs_installed[key] = True options = ( - ("Error Reporting", sentry), ("MongoDB", mongo_enabled), ("Voice", True), ("Docs", reqs_installed["docs"]), @@ -177,10 +159,6 @@ def init_events(bot, cli_flags): bot.color = discord.Colour(await bot.db.color()) - @bot.event - async def on_error(event_method, *args, **kwargs): - sentry_log.exception("Exception in {}".format(event_method)) - @bot.event async def on_command_error(ctx, error): if isinstance(error, commands.MissingRequiredArgument): @@ -201,11 +179,6 @@ def init_events(bot, cli_flags): "Exception in command '{}'".format(ctx.command.qualified_name), exc_info=error.original, ) - if should_log_sentry(error): - sentry_log.exception( - "Exception in command '{}'".format(ctx.command.qualified_name), - exc_info=error.original, - ) message = "Error in command '{}'. Check your console or logs for details.".format( ctx.command.qualified_name @@ -245,13 +218,6 @@ def init_events(bot, cli_flags): ) else: log.exception(type(error).__name__, exc_info=error) - try: - sentry_error = error.original - except AttributeError: - sentry_error = error - - if should_log_sentry(sentry_error): - sentry_log.exception("Unhandled command error.", exc_info=sentry_error) @bot.event async def on_message(message): diff --git a/redbot/core/sentry.py b/redbot/core/sentry.py deleted file mode 100644 index 23df5a7e4..000000000 --- a/redbot/core/sentry.py +++ /dev/null @@ -1,41 +0,0 @@ -import asyncio -import logging -from raven import Client -from raven.handlers.logging import SentryHandler -from raven_aiohttp import AioHttpTransport - -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, - transport=AioHttpTransport, - ) - 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) - loop = asyncio.get_event_loop() - loop.create_task(self.close()) - - async def close(self): - """Wait for the Sentry client to send pending messages and shut down.""" - await self.client.remote.get_transport().close() diff --git a/tests/cogs/downloader/test_downloader.py b/tests/cogs/downloader/test_downloader.py index c5fb029ad..f9a9831bf 100644 --- a/tests/cogs/downloader/test_downloader.py +++ b/tests/cogs/downloader/test_downloader.py @@ -4,7 +4,6 @@ from pathlib import Path import pytest from unittest.mock import MagicMock -from raven.versioning import fetch_git_sha from redbot.pytest.downloader import * @@ -60,18 +59,6 @@ async def test_current_branch(bot_repo): assert branch not in ("WRONG", "") -@pytest.mark.asyncio -async def test_current_hash(bot_repo): - branch = await bot_repo.current_branch() - bot_repo.branch = branch - - commit = await bot_repo.current_commit() - - sentry_sha = fetch_git_sha(str(bot_repo.folder_path)) - - assert sentry_sha == commit - - @pytest.mark.asyncio async def test_existing_repo(repo_manager): repo_manager.does_repo_exist = MagicMock(return_value=True) diff --git a/tests/core/test_sentry.py b/tests/core/test_sentry.py deleted file mode 100644 index 227bab053..000000000 --- a/tests/core/test_sentry.py +++ /dev/null @@ -1,12 +0,0 @@ -import logging - -from redbot.core import sentry - - -def test_sentry_capture(red): - log = logging.getLogger(__name__) - mgr = sentry.SentryManager(log) - - assert mgr.client is not None - - mgr.client.captureMessage("Message from test_sentry module.")