[V3 Sentry] Allow toggling of Sentry logging (#1214)

* Refactor sentry to allow toggle

* Rename sentry module

* Protect sentry manager

* Fix tests

* Fix EOF newlines

* Add docstrings
This commit is contained in:
Tobotimus 2018-01-15 15:26:26 +11:00 committed by GitHub
parent e18f94c17d
commit 73c08da037
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 70 additions and 34 deletions

View File

@ -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.json_io import JsonIO
from redbot.core.global_checks import init_global_checks from redbot.core.global_checks import init_global_checks
from redbot.core.events import init_events 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.cli import interactive_config, confirm, parse_cli_flags, ask_sentry
from redbot.core.core_commands import Core from redbot.core.core_commands import Core
from redbot.core.dev_commands import Dev from redbot.core.dev_commands import Dev
@ -129,7 +128,7 @@ def main():
sys.exit(1) sys.exit(1)
loop.run_until_complete(_get_prefix_and_token(red, tmp_data)) loop.run_until_complete(_get_prefix_and_token(red, tmp_data))
if tmp_data['enable_sentry']: if tmp_data['enable_sentry']:
init_sentry_logging(sentry_log) red.enable_sentry()
cleanup_tasks = True cleanup_tasks = True
try: try:
loop.run_until_complete(red.start(token, bot=not cli_flags.not_bot)) loop.run_until_complete(red.start(token, bot=not cli_flags.not_bot))

View File

@ -1,5 +1,6 @@
import asyncio import asyncio
import os import os
import logging
from collections import Counter from collections import Counter
from enum import Enum from enum import Enum
from importlib.machinery import ModuleSpec from importlib.machinery import ModuleSpec
@ -17,7 +18,7 @@ from . import (
rpc rpc
) )
from .help_formatter import Help, help as help_ from .help_formatter import Help, help as help_
from .sentry import SentryManager
from .utils import TYPE_CHECKING from .utils import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
@ -102,6 +103,22 @@ class RedBase(BotBase, RpcMethodMixin):
self.add_command(help_) 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): async def _dict_abuse(self, indict):
""" """
Please blame <@269933075037814786> for this. Please blame <@269933075037814786> for this.

View File

@ -476,6 +476,23 @@ class Core:
await ctx.send(_("Locale has been set.")) 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.command()
@commands.cooldown(1, 60, commands.BucketType.user) @commands.cooldown(1, 60, commands.BucketType.user)
async def contact(self, ctx, *, message: str): async def contact(self, ctx, *, message: str):
@ -705,4 +722,3 @@ class Core:
async def rpc_reload(self, request): async def rpc_reload(self, request):
await self.rpc_unload(request) await self.rpc_unload(request)
await self.rpc_load(request) await self.rpc_load(request)

30
redbot/core/sentry.py Normal file
View File

@ -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)

View File

@ -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)

View File

@ -1,12 +1,12 @@
import logging import logging
from redbot.core import sentry_setup from redbot.core import sentry
def test_sentry_capture(red): def test_sentry_capture(red):
log = logging.getLogger(__name__) 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.") mgr.client.captureMessage("Message from test_sentry module.")