summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Cramer <dcramer@gmail.com>2014-03-31 21:11:29 -0700
committerDavid Cramer <dcramer@gmail.com>2014-03-31 21:11:29 -0700
commit4b758cbf70130ab5627e96f3fcf781c3aca359b1 (patch)
tree2e1968fc0c73064562fc447550dd63f582852f28
parente216a66f0b9a2836a41ada82d942a8f3c35be515 (diff)
downloadraven-4b758cbf70130ab5627e96f3fcf781c3aca359b1.tar.gz
Improve behavior when API returns valid errors
-rw-r--r--raven/base.py5
-rw-r--r--raven/exceptions.py14
-rw-r--r--raven/scripts/runner.py23
-rw-r--r--raven/transport/http.py25
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