def test_test_context(): assert testing.get_sentry_messages() == [] logger = logging.getLogger('test_test_context') with testing.TestContext() as ctx: logger.info('foo', extra={'a': 1}) logger.warning('bar', extra={'b': 2}) talisker.statsd.get_client().timing('statsd', 3) talisker.sentry.get_client().capture( 'Message', message='test', extra={'foo': 'bar'}, ) ctx.assert_log(name=logger.name, msg='foo', level='info', extra={'a': 1}) ctx.assert_log(name=logger.name, msg='bar', level='warning', extra={'b': 2}) with pytest.raises(AssertionError) as exc: ctx.assert_log(name=logger.name, msg='XXX', level='info', extra={"baz": 1}) assert str(exc.value) == textwrap.dedent(""" Could not find log out of {0} logs. Search terms that could not be found: msg=XXX extra["baz"]=1 """).strip().format(len(ctx.logs), 'u' if sys.version_info[0] == 2 else '') with pytest.raises(AssertionError) as exc: ctx.assert_not_log(name=logger.name, msg='foo', level='info') assert str(exc.value) == textwrap.dedent(""" Found log matching the following: level={0}'info' msg={0}'foo' name='test_test_context' """).strip().format('u' if sys.version_info[0] == 2 else '') assert ctx.statsd == ['statsd:3.000000|ms'] # ensure there are not sentry messages left over assert testing.get_sentry_messages() == [] assert len(ctx.sentry) == 1 assert ctx.sentry[0]['message'] == 'test' # check that extra values have been decoded correctly assert ctx.sentry[0]['extra']['foo'] == 'bar'
def test_talisker_client_defaults_explicit_config(config): config['TALISKER_ENV'] = 'production' config['TALISKER_UNIT'] = 'talisker-1' config['TALISKER_DOMAIN'] = 'example.com' # raven flask integration passes in all possible kwargs as None kwargs = { 'release': 'release', 'hook_libraries': ['requests'], 'site': 'site', 'environment': 'environment', 'name': 'name', } client = create_test_client(**kwargs) # this is unpleasant, but it saves us mocking assert raven.breadcrumbs.install_logging_hook.called is False assert raven.breadcrumbs._hook_requests.called is True assert raven.breadcrumbs._install_httplib.called is False # check message try: raise Exception('test') except Exception: client.captureException() messages = testing.get_sentry_messages(client) data = messages[0] assert data['release'] == 'release' assert data['environment'] == 'environment' assert data['server_name'] == 'name' assert data['tags']['site'] == 'site'
def test_flask_sentry_app_tag(flask_app): sentry = talisker.flask.sentry(flask_app) response = get_url(flask_app, '/') assert response.status_code == 500 msgs = get_sentry_messages(sentry.client) assert msgs[0]['tags']['flask_app'] == flask_app.name
def test_flask_sentry_app_config_ignore_exc(flask_app, monkeypatch, context): monkeypatch.setitem(flask_app.config, 'SENTRY_CONFIG', {'ignore_exceptions': ['IgnoredException']}) sentry = talisker.flask.sentry(flask_app) assert 'IgnoredException' in sentry.client.ignore_exceptions response = get_url(flask_app, '/ignored') assert response.status_code == 500 assert len(get_sentry_messages(sentry.client)) == 0
def test_flask_sentry_sends_message(flask_app): sentry = talisker.flask.sentry(flask_app) response = get_url(flask_app, '/') assert response.status_code == 500 msgs = get_sentry_messages(sentry.client) assert len(msgs) == 1 msg = msgs[0] if 'culprit' in msg: assert msg['culprit'] == '/' else: assert msg['transaction'] == '/'
def test_flask_sentry_uses_app_config_to_set_name(flask_app, monkeypatch): monkeypatch.setitem(flask_app.config, 'SENTRY_NAME', 'SomeName') sentry = talisker.flask.sentry(flask_app) assert sentry.client.name == 'SomeName' response = get_url(flask_app, '/') assert response.status_code == 500 msgs = get_sentry_messages(sentry.client) assert len(msgs) == 1 msg = msgs[0] assert msg['server_name'] == 'SomeName'
def test_logs_ignored(): client = create_test_client() client.context.clear() # set up a root logger with a formatter logging.getLogger('talisker.slowqueries').info('talisker.slowqueries') logging.getLogger('talisker.requests').info('talisker.requests') logging.getLogger('talisker').info('talisker') try: raise Exception('test') except Exception: client.captureException() messages = testing.get_sentry_messages(client) data = messages[0] assert len(data['breadcrumbs']) == 1 crumb = data['breadcrumbs']['values'][0] assert crumb['message'] == 'talisker' assert crumb['category'] == 'talisker'
def test_talisker_client_defaults(config, context): config['TALISKER_ENV'] = 'production' config['TALISKER_UNIT'] = 'talisker-1' config['TALISKER_DOMAIN'] = 'example.com' client = create_test_client() context.assert_log(msg='configured raven') # check client side assert (list(sorted(client.processors)) == list(sorted(talisker.sentry.default_processors))) # this is unpleasant, but it saves us mocking assert raven.breadcrumbs.install_logging_hook.called is False assert raven.breadcrumbs._hook_requests.called is False assert raven.breadcrumbs._install_httplib.called is False # check message try: client.extra_context({'start_time': time.time() - 1}) client.user_context({ 'id': 'id', 'email': 'email', 'username': '******' }) raven.breadcrumbs.record(msg='foo') raise Exception('test') except Exception: client.captureException() messages = testing.get_sentry_messages(client) data = messages[0] assert data['release'] == 'test-rev-id' assert data['tags'] == { 'environment': 'production', 'unit': 'talisker-1', 'domain': 'example.com', } assert data['user'] == {'id': 'id'} assert all( c['data']['start'] == 1000 for c in data['breadcrumbs']['values'] )
def test_talisker_client_sanitizes(config): # raven flask integration passes in all possible kwargs as None kwargs = {'sanitize_keys': ['foo', 'bar']} client = create_test_client(**kwargs) try: client.extra['foo'] = 'foo' client.extra['bar'] = 'bar' client.extra['sessionid'] = 'sessionid' client.extra['csrftoken'] = 'csrftoken' raise Exception('test') except Exception: client.captureException() messages = testing.get_sentry_messages(client) data = messages[0] assert data['extra']['foo'] == '********' assert data['extra']['bar'] == '********' assert data['extra']['sessionid'] == '********' assert data['extra']['csrftoken'] == '********'