diff options
author | David Cramer <dcramer@gmail.com> | 2014-03-31 21:11:29 -0700 |
---|---|---|
committer | David Cramer <dcramer@gmail.com> | 2014-03-31 21:11:29 -0700 |
commit | 4b758cbf70130ab5627e96f3fcf781c3aca359b1 (patch) | |
tree | 2e1968fc0c73064562fc447550dd63f582852f28 | |
parent | e216a66f0b9a2836a41ada82d942a8f3c35be515 (diff) | |
download | raven-4b758cbf70130ab5627e96f3fcf781c3aca359b1.tar.gz |
Improve behavior when API returns valid errors
-rw-r--r-- | raven/base.py | 5 | ||||
-rw-r--r-- | raven/exceptions.py | 14 | ||||
-rw-r--r-- | raven/scripts/runner.py | 23 | ||||
-rw-r--r-- | raven/transport/http.py | 25 |
4 files changed, 49 insertions, 18 deletions
diff --git a/raven/base.py b/raven/base.py index b8400ac..5473353 100644 --- a/raven/base.py +++ b/raven/base.py @@ -24,6 +24,7 @@ from types import FunctionType import raven from raven.conf import defaults from raven.context import Context +from raven.exceptions import APIError from raven.utils import six, json, get_versions, get_auth_header, merge_dicts from raven.utils.encoding import to_unicode from raven.utils.serializer import transform @@ -521,7 +522,9 @@ class Client(object): self.state.set_success() def _failed_send(self, e, url, data): - if isinstance(e, HTTPError): + if isinstance(e, APIError): + self.error_logger.error('Unable to capture event: %s', e.message) + elif isinstance(e, HTTPError): body = e.read() self.error_logger.error( 'Unable to reach Sentry log server: %s (url: %s, body: %s)', diff --git a/raven/exceptions.py b/raven/exceptions.py new file mode 100644 index 0000000..9277d04 --- /dev/null +++ b/raven/exceptions.py @@ -0,0 +1,14 @@ +from raven.utils import six + + +class APIError(Exception): + def __init__(self, message, code=0): + self.code = code + self.message = message + + def __unicode__(self): + return six.text_type("%s: %s" % (self.message, self.code)) + + +class RateLimited(APIError): + pass diff --git a/raven/scripts/runner.py b/raven/scripts/runner.py index 74fc049..f99f12d 100644 --- a/raven/scripts/runner.py +++ b/raven/scripts/runner.py @@ -43,17 +43,17 @@ def get_uid(): def send_test_message(client, options): - print("Client configuration:") + sys.stdout.write("Client configuration:\n") for k in ('servers', 'project', 'public_key', 'secret_key'): - print(' %-15s: %s' % (k, getattr(client, k))) - print() + sys.stdout.write(' %-15s: %s\n' % (k, getattr(client, k))) + sys.stdout.write('\n') if not all([client.servers, client.project, client.public_key, client.secret_key]): - print("Error: All values must be set!") + sys.stdout.write("Error: All values must be set!\n") sys.exit(1) if not client.is_enabled(): - print('Error: Client reports as being disabled!') + sys.stdout.write('Error: Client reports as being disabled!\n') sys.exit(1) data = options.get('data', { @@ -65,7 +65,8 @@ def send_test_message(client, options): } }) - print('Sending a test message...',) + sys.stdout.write('Sending a test message... ') + sys.stdout.flush() ident = client.get_ident(client.captureMessage( message='This is a test message generated using ``raven test``', @@ -80,17 +81,19 @@ def send_test_message(client, options): )) if client.state.did_fail(): - print('error!') + sys.stdout.write('error!\n') return False - print('success!') - print('Event ID was %r' % (ident,)) + sys.stdout.write('success!\n') + + sys.stdout.write('Event ID was %r\n' % (ident,)) def main(): root = logging.getLogger('sentry.errors') root.setLevel(logging.DEBUG) - root.addHandler(logging.StreamHandler()) + # if len(root.handlers) == 0: + # root.addHandler(logging.StreamHandler()) parser = OptionParser(version=get_version()) parser.add_option("--data", action="callback", callback=store_json, diff --git a/raven/transport/http.py b/raven/transport/http.py index 27f29ef..953ca57 100644 --- a/raven/transport/http.py +++ b/raven/transport/http.py @@ -8,6 +8,7 @@ raven.transport.http from __future__ import absolute_import from raven.conf import defaults +from raven.exceptions import APIError, RateLimited from raven.transport.base import Transport from raven.utils import six from raven.utils.http import urlopen @@ -40,11 +41,21 @@ class HTTPTransport(Transport): """ req = urllib2.Request(self._url, headers=headers) - response = urlopen( - url=req, - data=data, - timeout=self.timeout, - verify_ssl=self.verify_ssl, - ca_certs=self.ca_certs, - ).read() + try: + response = urlopen( + url=req, + data=data, + timeout=self.timeout, + verify_ssl=self.verify_ssl, + ca_certs=self.ca_certs, + ) + except urllib2.HTTPError as exc: + msg = exc.headers.get('x-sentry-error') + code = exc.getcode() + if code == 429: + raise RateLimited(msg, code) + elif msg: + raise APIError(msg, code) + else: + raise return response |