Replaced Bugsnag with Sentry - requires config changes!

Note that pillar/bugsnag_extra.py still exists; I'm keeping it around for
a while until we know what info we miss in Sentry, can port it, and then
remove/refactor it.
This commit is contained in:
Sybren A. Stüvel 2017-12-07 12:58:21 +01:00
parent 6c4dd8ae02
commit fc25ca9c03
3 changed files with 33 additions and 35 deletions

View File

@ -21,6 +21,7 @@ from flask_babel import Babel, gettext as _
from flask.templating import TemplateNotFound from flask.templating import TemplateNotFound
import pymongo.collection import pymongo.collection
import pymongo.database import pymongo.database
from raven.contrib.flask import Sentry
from werkzeug.local import LocalProxy from werkzeug.local import LocalProxy
@ -59,7 +60,17 @@ class ConfigurationMissingError(SystemExit):
""" """
class PillarServer(Eve): class BlinkerCompatibleEve(Eve):
"""Workaround for https://github.com/pyeve/eve/issues/1087"""
def __getattr__(self, name):
if name in {"im_self", "im_func"}:
raise AttributeError("type object '%s' has no attribute '%s'" %
(self.__class__.__name__, name))
return super().__getattr__(name)
class PillarServer(BlinkerCompatibleEve):
def __init__(self, app_root, **kwargs): def __init__(self, app_root, **kwargs):
from .extension import PillarExtension from .extension import PillarExtension
from celery import Celery from celery import Celery
@ -94,7 +105,9 @@ class PillarServer(Eve):
self._config_auth_token_hmac_key() self._config_auth_token_hmac_key()
self._config_tempdirs() self._config_tempdirs()
self._config_git() self._config_git()
self._config_bugsnag()
self.sentry: typing.Optional[Sentry] = None
self._config_sentry()
self._config_google_cloud_storage() self._config_google_cloud_storage()
self.algolia_index_users = None self.algolia_index_users = None
@ -187,39 +200,19 @@ class PillarServer(Eve):
self.config['GIT_REVISION'] = 'unknown' self.config['GIT_REVISION'] = 'unknown'
self.log.info('Git revision %r', self.config['GIT_REVISION']) self.log.info('Git revision %r', self.config['GIT_REVISION'])
def _config_bugsnag(self): def _config_sentry(self):
bugsnag_api_key = self.config.get('BUGSNAG_API_KEY') sentry_dsn = self.config.get('SENTRY_CONFIG', {}).get('dsn')
if self.config.get('TESTING') or not bugsnag_api_key: if self.config.get('TESTING') or sentry_dsn in {'', '-set-in-config-local-'}:
self.log.info('Bugsnag NOT configured.') self.log.warning('Sentry NOT configured.')
self.sentry = None
return return
import bugsnag self.sentry = Sentry(self, logging=True, level=logging.WARNING,
from bugsnag.handlers import BugsnagHandler logging_exclusions=('werkzeug',))
release_stage = self.config.get('BUGSNAG_RELEASE_STAGE', 'unconfigured') # bugsnag.before_notify(bugsnag_extra.add_pillar_request_to_notification)
if self.config.get('DEBUG'): # got_request_exception.connect(self.__notify_bugsnag)
release_stage += '-debug' self.log.info('Sentry setup complete')
bugsnag.configure(
api_key=bugsnag_api_key,
project_root="/data/git/pillar/pillar",
release_stage=release_stage
)
bs_handler = BugsnagHandler()
bs_handler.setLevel(logging.ERROR)
self.log.addHandler(bs_handler)
# This is what bugsnag.flask.handle_exceptions also tries to do,
# but it passes the app to the connect() call, which causes an
# error. Since we only have one app, we can do without.
from flask import got_request_exception
from . import bugsnag_extra
bugsnag.before_notify(bugsnag_extra.add_pillar_request_to_notification)
got_request_exception.connect(self.__notify_bugsnag)
self.log.info('Bugsnag setup complete')
def __notify_bugsnag(self, sender, exception, **extra): def __notify_bugsnag(self, sender, exception, **extra):
import bugsnag import bugsnag

View File

@ -65,8 +65,13 @@ GOOGLE_SITE_VERIFICATION = ''
ADMIN_USER_GROUP = '5596e975ea893b269af85c0e' ADMIN_USER_GROUP = '5596e975ea893b269af85c0e'
SUBSCRIBER_USER_GROUP = '5596e975ea893b269af85c0f' SUBSCRIBER_USER_GROUP = '5596e975ea893b269af85c0f'
BUGSNAG_API_KEY = ''
BUGSNAG_RELEASE_STAGE = 'development' SENTRY_CONFIG = {
'dsn': '-set-in-config-local-',
# 'release': raven.fetch_git_sha(os.path.dirname(__file__)),
}
# See https://docs.sentry.io/clients/python/integrations/flask/#settings
SENTRY_USER_ATTRS = ['username', 'full_name', 'email', 'objectid']
ALGOLIA_USER = '-SECRET-' ALGOLIA_USER = '-SECRET-'
ALGOLIA_API_KEY = '-SECRET-' ALGOLIA_API_KEY = '-SECRET-'

View File

@ -5,7 +5,6 @@ attrs==16.2.0
algoliasearch==1.12.0 algoliasearch==1.12.0
bcrypt==3.1.3 bcrypt==3.1.3
blinker==1.4 blinker==1.4
bugsnag[flask]==3.1.1
bleach==1.4.3 bleach==1.4.3
celery[redis]==4.0.2 celery[redis]==4.0.2
CommonMark==0.7.2 CommonMark==0.7.2
@ -24,6 +23,7 @@ ndg-httpsclient==0.4.0
Pillow==4.1.1 Pillow==4.1.1
python-dateutil==2.5.3 python-dateutil==2.5.3
rauth==0.7.3 rauth==0.7.3
raven[flask]==6.3.0
redis==2.10.5 redis==2.10.5
WebOb==1.5.0 WebOb==1.5.0
wheel==0.29.0 wheel==0.29.0