latest PDF - Read the Docs

Raven Documentation
Release 5.2.0
David Cramer
January 23, 2015
Contents
1
Users Guide
1.1 Install . . . .
1.2 Configuration
1.3 Usage . . . .
1.4 Integrations .
1.5 Transports .
.
.
.
.
.
3
3
3
7
11
27
2
Developers
2.1 Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
3
Reference
3.1 Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
31
4
Supported Platforms
39
5
About Sentry
41
6
Resources
43
7
Deprecation Notes
45
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
i
ii
Raven Documentation, Release 5.2.0
Raven is a standalone (and the official) Python client for Sentry.
This version of Raven requires Sentry 7.0 or newer.
Contents
1
Raven Documentation, Release 5.2.0
2
Contents
CHAPTER 1
Users Guide
1.1 Install
If you haven’t already, start by downloading Raven. The easiest way is with pip:
pip install raven --upgrade
Or with setuptools:
easy_install -U raven
1.1.1 Requirements
If you installed using pip or setuptools you shouldn’t need to worry about requirements. Otherwise you will need to
install the following packages in your environment:
• simplejson
1.2 Configuration
This document describes configuration options available to Sentry.
1.2.1 Configuring the Client
Settings are specified as part of the initialization of the client.
As of Raven 1.2.0, you can now configure all clients through a standard DSN string. This can be specified as a default
using the SENTRY_DSN environment variable, as well as passed to all clients by using the dsn argument.
from raven import Client
# Read configuration from the environment
client = Client()
# Manually specify a DSN
client = Client(’http://public:[email protected]/1’)
A reasonably configured client should generally include a few additional settings:
3
Raven Documentation, Release 5.2.0
import raven
client = raven.Client(
dsn=’http://public:[email protected]/1’
# inform the client which parts of code are yours
# include_paths=[’my.app’]
include_paths=[__name__.rsplit(’.’, 1)[0]],
# pass along the version of your application
# release=’1.0.0’
# release=raven.fetch_package_version(’my-app’)
release=raven.fetch_git_sha(os.path.dirname(__file__)),
)
1.2.2 The Sentry DSN
The DSN can be found in Sentry by navigation to Account -> Projects -> [Project Name] -> [Member Name]. Its
template resembles the following:
’{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}’
It is composed of six important pieces:
• The Protocol used. This can be one of the following: http, https, or udp.
• The public and secret keys to authenticate the client.
• The hostname of the Sentry server.
• An optional path if Sentry is not located at the webserver root. This is specific to HTTP requests.
• The project ID which the authenticated user is bound to.
Note: Protocol may also contain transporter type: gevent+http, gevent+https, twisted+http, tornado+http, eventlet+http, eventlet+https
For Python 3.3+ also available: aiohttp+http and aiohttp+https
1.2.3 Client Arguments
The following are valid arguments which may be passed to the Raven client:
dsn
A sentry compatible DSN.
dsn = ’http://public:[email protected]/1’
project
Set this to your Sentry project ID. The default value for installations is 1.
4
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
project = 1
public_key
Set this to the public key of the project member which will authenticate as the client. You can find this information on
the member details page of your project within Sentry.
public_key = ’fb9f9e31ea4f40d48855c603f15a2aa4’
secret_key
Set this to the secret key of the project member which will authenticate as the client. You can find this information on
the member details page of your project within Sentry.
secret_key = ’6e968b3d8ba240fcb50072ad9cba0810’
site
An optional, arbitrary string to identify this client installation.
site = ’my site name’
name
This will override the server_name value for this installation. Defaults to socket.gethostname().
name = ’sentry_rocks_’ + socket.gethostname()
release
The version of your application. This will map up into a Release in Sentry.
release = ’1.0.3’
exclude_paths
Extending this allow you to ignore module prefixes when we attempt to discover which function an error comes from
(typically a view)
exclude_paths = [
’django’,
’sentry’,
’raven’,
’lxml.objectify’,
]
1.2. Configuration
5
Raven Documentation, Release 5.2.0
include_paths
For example, in Django this defaults to your list of INSTALLED_APPS, and is used for drilling down where an
exception is located
include_paths = [
’django’,
’sentry’,
’raven’,
’lxml.objectify’,
]
list_max_length
The maximum number of items a list-like container should store.
If an iterable is longer than the specified length, the left-most elements up to length will be kept.
Note: This affects sets as well, which are unordered.
list_max_length = 50
string_max_length
The maximum characters of a string that should be stored.
If a string is longer than the given length, it will be truncated down to the specified size.
string_max_length = 200
auto_log_stacks
Should Raven automatically log frame stacks (including locals) for all calls as it would for exceptions.
auto_log_stacks = True
processors
A list of processors to apply to events before sending them to the Sentry server. Useful for sending additional global
state data or sanitizing data that you want to keep off of the server.
processors = (
’raven.processors.SanitizePasswordsProcessor’,
)
1.2.4 Sanitizing Data
Several processors are included with Raven to assist in data sanitiziation. These are configured with the processors
value.
raven.processors.SanitizePasswordsProcessor
Removes all keys which resemble password, secret, or api_key within stacktrace contexts and HTTP
bits (such as cookies, POST data, the querystring, and environment).
6
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
raven.processors.RemoveStackLocalsProcessor
Removes all stacktrace context variables. This will cripple the functionality of Sentry, as you’ll only get raw
tracebacks, but it will ensure no local scoped information is available to the server.
raven.processors.RemovePostDataProcessor
Removes the body of all HTTP data.
1.3 Usage
1.3.1 Capture an Error
from raven import Client
client = Client(’http://dd2c825ff9b1417d88a99573903ebf80:91631495b10b45f8a1cdbc492088da6a@localhost:9
try:
1 / 0
except ZeroDivisionError:
client.captureException()
1.3.2 Adding Context
A few helpers exist for adding context to a request. These are most useful within a middleware, or some kind of
context wrapper.
# If you’re using the Django client, we already deal with this for you.
class DjangoUserContext(object):
def process_request(self, request):
client.user_context({
’email’: request.user.email,
})
def process_response(self, request):
client.context.clear()
See also:
• Client.extra_context
• Client.http_context
• Client.tags_context
1.3.3 Testing the Client
Once you’ve got your server configured, you can test the Raven client by using it’s CLI:
raven test <DSN value>
If you’ve configured your environment to have SENTRY_DSN available, you can simply drop the optional DSN
argument:
raven test
You should get something like the following, assuming you’re configured everything correctly:
1.3. Usage
7
Raven Documentation, Release 5.2.0
$ raven test sync+http://dd2c825ff9b1417d88a99573903ebf80:91631495b10b45f8a1cdbc492088da6a@localhost:
Using DSN configuration:
sync+http://dd2c825ff9b1417d88a99573903ebf80:91631495b10b45f8a1cdbc492088da6a@localhost:9000/1
Client configuration:
servers
: [’http://localhost:9000/api/store/’]
project
: 1
public_key
: dd2c825ff9b1417d88a99573903ebf80
secret_key
: 91631495b10b45f8a1cdbc492088da6a
Sending a test message... success!
The test message can be viewed at the following URL:
http://localhost:9000/1/search/?q=c988bf5cb7db4653825c92f6864e7206$b8a6fbd29cc9113a149ad62cf7e0ddd5
1.3.4 Client API
class raven.base.Client(dsn=None, raise_send_errors=False, **options)
The base Raven client, which handles both local direct communication with Sentry (through the GroupedMessage API), as well as communicating over the HTTP API to multiple servers.
Will read default configuration from the environment variable SENTRY_DSN if available.
>>> from raven import Client
>>> # Read configuration from ‘‘os.environ[’SENTRY_DSN’]‘‘
>>> client = Client()
>>> # Specify a DSN explicitly
>>> client = Client(dsn=’https://public_key:[email protected]/project_id’)
>>> # Record an exception
>>> try:
>>>
1/0
>>> except ZeroDivisionError:
>>>
ident = client.get_ident(client.captureException())
>>>
print "Exception caught; reference is %s" % ident
build_msg(event_type, data=None, date=None, time_spent=None, extra=None, stack=None, public_key=None, tags=None, **kwargs)
Captures, processes and serializes an event into a dict object
The result of build_msg should be a standardized dict, with all default values available.
capture(event_type, data=None, date=None, time_spent=None, extra=None,
tags=None, **kwargs)
Captures and processes an event and pipes it off to SentryClient.send.
stack=None,
To use structured data (interfaces) with capture:
>>> capture(’raven.events.Message’, message=’foo’, data={
>>>
’request’: {
>>>
’url’: ’...’,
>>>
’data’: {},
>>>
’query_string’: ’...’,
>>>
’method’: ’POST’,
>>>
},
>>>
’logger’: ’logger.name’,
8
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
>>> }, extra={
>>>
’key’: ’value’,
>>> })
The finalized data structure contains the following (some optional) builtin values:
>>> {
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> }
# the culprit and version information
’culprit’: ’full.module.name’, # or /arbitrary/path
# all detectable installed modules
’modules’: {
’full.module.name’: ’version string’,
},
# arbitrary data provided by user
’extra’: {
’key’: ’value’,
}
Parameters
• event_type – the module path to the Event class. Builtins can use shorthand class notation
and exclude the full module path.
• data – the data base, useful for specifying structured data interfaces. Any key which
contains a ‘.’ will be assumed to be a data interface.
• date – the datetime of this event
• time_spent – a integer value representing the duration of the event (in milliseconds)
• extra – a dictionary of additional standard metadata
• stack – a stacktrace for the event
• tags – list of extra tags
Returns a tuple with a 32-length string identifying this event
captureException(exc_info=None, **kwargs)
Creates an event from an exception.
>>> try:
>>>
exc_info = sys.exc_info()
>>>
client.captureException(exc_info)
>>> finally:
>>>
del exc_info
If exc_info is not provided, or is set to True, then this method will perform the exc_info =
sys.exc_info() and the requisite clean-up for you.
kwargs are passed through to .capture.
captureMessage(message, **kwargs)
Creates an event from message.
>>> client.captureMessage(’My event just happened!’)
captureQuery(query, params=(), engine=None, **kwargs)
Creates an event for a SQL query.
1.3. Usage
9
Raven Documentation, Release 5.2.0
>>> client.captureQuery(’SELECT * FROM foo’)
capture_exceptions(function_or_exceptions, **kwargs)
Wrap a function in try/except and automatically call .captureException if it raises an exception,
then the exception is reraised.
By default, it will capture Exception
>>> @client.capture_exceptions
>>> def foo():
>>>
raise Exception()
You can also specify exceptions to be caught specifically
>>> @client.capture_exceptions((IOError, LookupError))
>>> def bar():
>>>
...
kwargs are passed through to .captureException.
context
Updates this clients thread-local context for future events.
>>> def view_handler(view_func, *args, **kwargs):
>>>
client.context.merge(tags={’key’: ’value’})
>>>
try:
>>>
return view_func(*args, **kwargs)
>>>
finally:
>>>
client.context.clear()
decode(data)
Unserializes a string, data.
encode(data)
Serializes data into a raw string.
extra_context(data, **kwargs)
Update the extra context for future events.
>>> client.extra_context({’foo’: ’bar’})
get_ident(result)
Returns a searchable string representing a message.
>>> result = client.capture(**kwargs)
>>> ident = client.get_ident(result)
get_public_dsn(scheme=None)
Returns a public DSN which is consumable by raven-js
>>> # Return scheme-less DSN
>>> print client.get_public_dsn()
>>> # Specify a scheme to use (http or https)
>>> print client.get_public_dsn(’https’)
http_context(data, **kwargs)
Update the http context for future events.
>>> client.http_context({’url’: ’http://example.com’})
10
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
is_enabled()
Return a boolean describing whether the client should attempt to send events.
send(auth_header=None, **data)
Serializes the message and passes the payload onto send_encoded.
send_encoded(message, auth_header=None, **kwargs)
Given an already serialized message, signs the message and passes the payload off to send_remote for
each server specified in the servers configuration.
tags_context(data, **kwargs)
Update the tags context for future events.
>>> client.tags_context({’version’: ’1.0’})
user_context(data)
Update the user context for future events.
>>> client.user_context({’email’: ’[email protected]’})
1.4 Integrations
Note: Some integrations allow specifying these in a standard configuration, otherwise they are generally passed upon
instantiation of the Sentry client.
1.4.1 Bottle
Setup
The first thing you’ll need to do is to disable catchall in your Bottle app:
import bottle
app = bottle.app()
app.catchall = False
Note: Bottle will not propagate exceptions to the underlying WSGI middleware by default. Setting catchall to False
disables that.
Sentry will act as Middleware:
from raven.contrib.bottle import Sentry
app = Sentry(app, client)
Usage
Once you’ve configured the Sentry application you need only call run with it:
run(app=app)
If you want to send additional events, a couple of shortcuts are provided on the Bottle request app object.
Capture an arbitrary exception by calling captureException:
1.4. Integrations
11
Raven Documentation, Release 5.2.0
>>> try:
>>>
1 / 0
>>> except ZeroDivisionError:
>>>
request.app.sentry.captureException()
Log a generic message with captureMessage:
>>> request.app.sentry.captureMessage(’hello, world!’)
1.4.2 Celery
tl;dr register a couple of signals to hijack Celery error handling
from raven import Client
from raven.contrib.celery import register_signal, register_logger_signal
client = Client()
# register a custom filter to filter out duplicate logs
register_logger_signal(client)
# hook into the Celery error handler
register_signal(client)
A more complex version to encapsulate behavior:
import celery
class Celery(celery.Celery):
def on_configure(self):
import raven
from raven.contrib.celery import register_signal, register_logger_signal
client = raven.Client()
# register a custom filter to filter out duplicate logs
register_logger_signal(client)
# hook into the Celery error handler
register_signal(client)
app = Celery(__name__)
app.config_from_object(’django.conf:settings’)
1.4.3 Django
Support
While older versions of Django will likely work, officially only version 1.4 and newer are supported.
Setup
Using the Django integration is as simple as adding raven.contrib.django.raven_compat to your installed
apps:
12
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
INSTALLED_APPS = (
’raven.contrib.django.raven_compat’,
)
Note: This causes Raven to install a hook in Django that will automatically report uncaught exceptions.
Additional settings for the client are configured using the RAVEN_CONFIG dictionary:
import raven
RAVEN_CONFIG = {
’dsn’: ’http://public:[email protected]/1’,
’release’: raven.fetch_git_sha(os.path.dirname(__file__)),
}
Once you’ve configured the client, you can test it using the standard Django management interface:
python manage.py raven test
You’ll be referencing the client slightly differently in Django as well:
from raven.contrib.django.raven_compat.models import client
client.captureException()
Using with Raven.js
A Django template tag is provided to render a proper public DSN inside your templates, you must first load raven:
{% load raven %}
Inside your template, you can now use:
<script>Raven.config(’{% sentry_public_dsn %}’).install()</script>
By default, the DSN is generated in a protocol relative fashion, e.g. //[email protected]/1. If you need a
specific protocol, you can override:
{% sentry_public_dsn ’https’ %}
See Raven.js documentation for more information.
Integration with logging
To integrate with the standard library’s logging module:
LOGGING = {
’version’: 1,
’disable_existing_loggers’: True,
’root’: {
’level’: ’WARNING’,
’handlers’: [’sentry’],
},
’formatters’: {
’verbose’: {
’format’: ’%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s’
},
},
1.4. Integrations
13
Raven Documentation, Release 5.2.0
’handlers’: {
’sentry’: {
’level’: ’ERROR’,
’class’: ’raven.contrib.django.raven_compat.handlers.SentryHandler’,
},
’console’: {
’level’: ’DEBUG’,
’class’: ’logging.StreamHandler’,
’formatter’: ’verbose’
}
},
’loggers’: {
’django.db.backends’: {
’level’: ’ERROR’,
’handlers’: [’console’],
’propagate’: False,
},
’raven’: {
’level’: ’DEBUG’,
’handlers’: [’console’],
’propagate’: False,
},
’sentry.errors’: {
’level’: ’DEBUG’,
’handlers’: [’console’],
’propagate’: False,
},
},
}
Usage
Logging usage works the same way as it does outside of Django, with the addition of an optional request key in the
extra data:
logger.error(’There was some crazy error’, exc_info=True, extra={
# Optionally pass a request and we’ll grab any information we can
’request’: request,
})
404 Logging
In certain conditions you may wish to log 404 events to the Sentry server. To do this, you simply need to enable a
Django middleware:
MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + (
’raven.contrib.django.raven_compat.middleware.Sentry404CatchMiddleware’,
...,
)
Message References
Sentry supports sending a message ID to your clients so that they can be tracked easily by your development team.
There are two ways to access this information, the first is via the X-Sentry-ID HTTP response header. Adding this
14
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
is as simple as appending a middleware to your stack:
MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + (
# We recommend putting this as high in the chain as possible
’raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware’,
...,
)
Another alternative method is rendering it within a template. By default, Sentry will attach request.sentry when
it catches a Django exception. In our example, we will use this information to modify the default 500.html which
is rendered, and show the user a case reference ID. The first step in doing this is creating a custom handler500()
in your urls.py file:
from django.conf.urls.defaults import *
from django.views.defaults import page_not_found, server_error
def handler500(request):
"""
500 error handler which includes ‘‘request‘‘ in the context.
Templates: ‘500.html‘
Context: None
"""
from django.template import Context, loader
from django.http import HttpResponseServerError
t = loader.get_template(’500.html’) # You need to create a 500.html template.
return HttpResponseServerError(t.render(Context({
’request’: request,
})))
Once we’ve successfully added the request context variable, adding the Sentry reference ID to our 500.html is
simple:
<p>You’ve encountered an error, oh noes!</p>
{% if request.sentry.id %}
<p>If you need assistance, you may reference this error as <strong>{{ request.sentry.id }}</stron
{% endif %}
WSGI Middleware
If you are using a WSGI interface to serve your app, you can also apply a middleware which will ensure that you catch
errors even at the fundamental level of your Django application:
from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
from django.core.handlers.wsgi import WSGIHandler
application = Sentry(WSGIHandler())
Additional Settings
SENTRY_CLIENT
In some situations you may wish for a slightly different behavior to how Sentry communicates with your server. For
this, Raven allows you to specify a custom client:
1.4. Integrations
15
Raven Documentation, Release 5.2.0
SENTRY_CLIENT = ’raven.contrib.django.raven_compat.DjangoClient’
Caveats
Error Handling Middleware
If you already have middleware in place that handles process_exception() you will need to take extra care
when using Sentry.
For example, the following middleware would suppress Sentry logging due to it returning a response:
class MyMiddleware(object):
def process_exception(self, request, exception):
return HttpResponse(’foo’)
To work around this, you can either disable your error handling middleware, or add something like the following:
from django.core.signals import got_request_exception
class MyMiddleware(object):
def process_exception(self, request, exception):
# Make sure the exception signal is fired for Sentry
got_request_exception.send(sender=self, request=request)
return HttpResponse(’foo’)
Note that this technique may break unit tests using the Django test client (django.test.client.Client) if a
view under test generates a Http404 or PermissionDenied exception, because the exceptions won’t be translated into the expected 404 or 403 response codes.
Or, alternatively, you can just enable Sentry responses:
from raven.contrib.django.raven_compat.models import sentry_exception_handler
class MyMiddleware(object):
def process_exception(self, request, exception):
# Make sure the exception signal is fired for Sentry
sentry_exception_handler(request=request)
return HttpResponse(’foo’)
Gunicorn
If you are running Django with gunicorn and using the gunicorn executable, instead of the run_gunicorn
management command, you will need to add a hook to gunicorn to activate Raven:
def when_ready(server):
from django.core.management import call_command
call_command(’validate’)
Circus
If you are running Django with circus and chaussette you will also need to add a hook to circus to activate Raven:
def run_raven(*args, **kwargs):
"""Set up raven for django by running a django command.
It is necessary because chaussette doesn’t run a django command.
16
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
"""
from django.conf import settings
from django.core.management import call_command
if not settings.configured:
settings.configure()
call_command(’validate’)
return True
And in your circus configuration:
[socket:dwebapp]
host = 127.0.0.1
port = 8080
[watcher:dwebworker]
cmd = chaussette --fd $(circus.sockets.dwebapp) dproject.wsgi.application
use_sockets = True
numprocesses = 2
hooks.after_start = dproject.hooks.run_raven
1.4.4 Flask
Installation
If you haven’t already, install raven with its explicit Flask dependencies:
pip install raven[flask]
Setup
The first thing you’ll need to do is to initialize Raven under your application:
from raven.contrib.flask import Sentry
sentry = Sentry(app, dsn=’http://public_key:[email protected]/1’)
If you don’t specify the dsn value, we will attempt to read it from your environment under the SENTRY_DSN key.
You can optionally configure logging too:
import logging
from raven.contrib.flask import Sentry
sentry = Sentry(app, logging=True, level=logging.ERROR)
Building applications on the fly? You can use Raven’s init_app hook:
sentry = Sentry(dsn=’http://public_key:[email protected]/1’)
def create_app():
app = Flask(__name__)
sentry.init_app(app)
return app
You can pass parameters in the init_app hook:
1.4. Integrations
17
Raven Documentation, Release 5.2.0
sentry = Sentry()
def create_app():
app = Flask(__name__)
sentry.init_app(app, dsn=’http://public_key:[email protected]/1’,
logging=True, level=logging.ERROR)
return app
Settings
Additional settings for the client can be configured using SENTRY_<setting name> in your application’s configuration:
class MyConfig(object):
SENTRY_DSN = ’http://public_key:[email protected]/1’
SENTRY_INCLUDE_PATHS = [’myproject’]
If Flask-Login is used by your application (including Flask-Security), user information will be captured when an
exception or message is captured. By default, only the id (current_user.get_id()), is_authenticated, and
is_anonymous is captured for the user. If you would like additional attributes on the current_user to be
captured, you can configure them using SENTRY_USER_ATTRS:
class MyConfig(object):
SENTRY_USER_ATTRS = [’username’, ’first_name’, ’last_name’, ’email’]
email will be captured as sentry.interfaces.User.email, and any additionl attributes will be available
under sentry.interfaces.User.data
You can specify the types of exceptions that should not be reported by Sentry client in your application by setting the
RAVEN_IGNORE_EXCEPTIONS configuration value on your Flask app configuration:
class MyExceptionType(Exception):
def __init__(self, message):
super(MyExceptionType, self).__init__(message)
app = Flask(__name__)
app.config["RAVEN_IGNORE_EXCEPTIONS"] = [MyExceptionType]
Usage
Once you’ve configured the Sentry application it will automatically capture uncaught exceptions within Flask. If you
want to send additional events, a couple of shortcuts are provided on the Sentry Flask middleware object.
Capture an arbitrary exception by calling captureException:
>>> try:
>>>
1 / 0
>>> except ZeroDivisionError:
>>>
sentry.captureException()
Log a generic message with captureMessage:
>>> sentry.captureMessage(’hello, world!’)
18
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
Getting the last event id
If possible, the last Sentry event ID is stored in the request context g.sentry_event_id variable. This allow to
present the user an error ID if have done a custom error 500 page.
<h2>Error 500</h2>
{% if g.sentry_event_id %}
<p>The error identifier is {{ g.sentry_event_id }}</p>
{% endif %}
1.4.5 Logbook
Raven provides a logbook handler which will pipe messages to Sentry.
First you’ll need to configure a handler:
from raven.handlers.logbook import SentryHandler
# Manually specify a client
client = Client(...)
handler = SentryHandler(client)
You can also automatically configure the default client with a DSN:
# Configure the default client
handler = SentryHandler(’http://public:[email protected]/1’)
Finally, bind your handler to your context:
from raven.handlers.logbook import SentryHandler
client = Client(...)
sentry_handler = SentryHandler(client)
with sentry_handler.applicationbound():
# everything logged here will go to sentry.
...
1.4.6 Logging
Sentry supports the ability to directly tie into the logging module. To use it simply add SentryHandler to your
logger.
First you’ll need to configure a handler:
from raven.handlers.logging import SentryHandler
# Manually specify a client
client = Client(...)
handler = SentryHandler(client)
You can also automatically configure the default client with a DSN:
# Configure the default client
handler = SentryHandler(’http://public:[email protected]/1’)
Finally, call the setup_logging() helper function:
1.4. Integrations
19
Raven Documentation, Release 5.2.0
from raven.conf import setup_logging
setup_logging(handler)
Another option is to use logging.config.dictConfig:
LOGGING = {
’version’: 1,
’disable_existing_loggers’: True,
’formatters’: {
’console’: {
’format’: ’[%(asctime)s][%(levelname)s] %(name)s %(filename)s:%(funcName)s:%(lineno)d | %
’datefmt’: ’%H:%M:%S’,
},
},
’handlers’: {
’console’: {
’level’: ’DEBUG’,
’class’: ’logging.StreamHandler’,
’formatter’: ’console’
},
’sentry’: {
’level’: ’ERROR’,
’class’: ’raven.handlers.logging.SentryHandler’,
’dsn’: ’http://public:[email protected]/1’,
},
},
’loggers’: {
’’: {
’handlers’: [’console’, ’sentry’],
’level’: ’DEBUG’,
’propagate’: False,
},
’your_app’: {
’level’: ’DEBUG’,
’propagate’: True,
},
}
}
Usage
A recommended pattern in logging is to simply reference the modules name for each logger, so for example, you might
at the top of your module define the following:
import logging
logger = logging.getLogger(__name__)
You can also use the exc_info and extra={’stack’: True} arguments on your log methods. This will
store the appropriate information and allow Sentry to render it based on that information:
# If you’re actually catching an exception, use ‘exc_info=True‘
logger.error(’There was an error, with a stacktrace!’, exc_info=True)
20
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
# If you don’t have an exception, but still want to capture a stacktrace, use the ‘stack‘ arg
logger.error(’There was an error, with a stacktrace!’, extra={
’stack’: True,
})
Note: Depending on the version of Python you’re using, extra might not be an acceptable keyword argument
for a logger’s .exception() method (.debug(), .info(), .warning(), .error() and .critical()
should work fine regardless of Python version). This should be fixed as of Python 3.2. Official issue here:
http://bugs.python.org/issue15541.
While we don’t recommend this, you can also enable implicit stack capturing for all messages:
client = Client(..., auto_log_stacks=True)
handler = SentryHandler(client)
logger.error(’There was an error, with a stacktrace!’)
You may also pass additional information to be stored as meta information with the event. As long as the key name
is not reserved and not private (_foo) it will be displayed on the Sentry dashboard. To do this, pass it as data within
your extra clause:
logger.error(’There was some crazy error’, exc_info=True, extra={
# Optionally you can pass additional arguments to specify request info
’culprit’: ’my.view.name’,
’data’: {
# You may specify any values here and Sentry will log and output them
’username’: request.user.username,
}
})
Note: The url and view keys are used internally by Sentry within the extra data.
Note: Any key (in data) prefixed with _ will not automatically output on the Sentry details view.
Sentry will intelligently group messages if you use proper string formatting. For example, the following messages
would be seen as the same message within Sentry:
logger.error(’There was some %s error’, ’crazy’)
logger.error(’There was some %s error’, ’fun’)
logger.error(’There was some %s error’, 1)
Note: Other languages that provide a logging package that is comparable to the python logging package may
define a Sentry handler. Check the Extending Sentry documentation.
1.4.7 Pylons
WSGI Middleware
A Pylons-specific middleware exists to enable easy configuration from settings:
from raven.contrib.pylons import Sentry
application = Sentry(application, config)
1.4. Integrations
21
Raven Documentation, Release 5.2.0
Configuration is handled via the sentry namespace:
[sentry]
dsn=http://public:[email protected]/1
include_paths=my.package,my.other.package,
exclude_paths=my.package.crud
Logger setup
Add the following lines to your project’s .ini file to setup SentryHandler:
[loggers]
keys = root, sentry
[handlers]
keys = console, sentry
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console, sentry
[logger_sentry]
level = WARN
handlers = console
qualname = sentry.errors
propagate = 0
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_sentry]
class = raven.handlers.logging.SentryHandler
args = (’SENTRY_DSN’,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
Note: You may want to setup other loggers as well.
1.4.8 Pyramid
PasteDeploy Filter
A filter factory for PasteDeploy exists to allow easily inserting Raven into a WSGI pipeline:
22
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
[pipeline:main]
pipeline =
raven
tm
MyApp
[filter:raven]
use = egg:raven#raven
dsn = http://public:[email protected]/1
include_paths = my.package, my.other.package
exclude_paths = my.package.crud
In the [filter:raven] section, you must specify the entry-point for raven with the use = key. All other raven
client parameters can be included in this section as well.
See the Pyramid PasteDeploy Configuration Documentation for more information.
Logger setup
Add the following lines to your project’s .ini file to setup SentryHandler:
[loggers]
keys = root, sentry
[handlers]
keys = console, sentry
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console, sentry
[logger_sentry]
level = WARN
handlers = console
qualname = sentry.errors
propagate = 0
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_sentry]
class = raven.handlers.logging.SentryHandler
args = (’http://public:[email protected]/1’,)
level = WARNING
formatter = generic
[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
Note: You may want to setup other loggers as well. See the Pyramid Logging Documentation for more information.
1.4. Integrations
23
Raven Documentation, Release 5.2.0
1.4.9 WSGI Middleware
Raven includes a simple to use WSGI middleware.
from raven import Client
from raven.middleware import Sentry
application = Sentry(
application,
Client(’http://public:[email protected]/1’)
)
Note: Many frameworks will not propagate exceptions to the underlying WSGI middleware by default.
1.4.10 ZeroRPC
Setup
The ZeroRPC integration comes as middleware for ZeroRPC. The middleware can be configured like the original
Raven client (using keyword arguments) and registered into ZeroRPC’s context manager:
import zerorpc
from raven.contrib.zerorpc import SentryMiddleware
sentry = SentryMiddleware(dsn=’udp://public_key:[email protected]:4242/1’)
zerorpc.Context.get_instance().register_middleware(sentry)
By default, the middleware will hide internal frames from ZeroRPC when it submits exceptions to Sentry. This
behavior can be disabled by passing the hide_zerorpc_frames parameter to the middleware:
sentry = SentryMiddleware(hide_zerorpc_frames=False, dsn=’udp://public_key:[email protected]:424
Compatibility
• ZeroRPC-Python < 0.4.0 is compatible with Raven <= 3.1.0;
• ZeroRPC-Python >= 0.4.0 requires Raven > 3.1.0.
Caveats
Since sending an exception to Sentry will basically block your RPC call, you are strongly advised to use the UDP
server of Sentry. In any cases, a cleaner and long term solution would be to make Raven requests to the Sentry server
asynchronous.
1.4.11 Zope/Plone
zope.conf
Zope has extensible logging configuration options. A basic setup for logging looks like that:
24
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
<eventlog>
level INFO
<logfile>
path ${buildout:directory}/var/{:_buildout_section_name_}.log
level INFO
</logfile>
%import raven.contrib.zope
<sentry>
dsn YOUR_DSN
level ERROR
</sentry>
</eventlog>
This configuration keeps the regular logging to a logfile, but adds logging to sentry for ERRORs.
All options of raven.base.Client are supported. See usage-label
Nobody writes zope.conf files these days, instead buildout recipe does that. To add the equivalent configuration, you
would do this:
[instance]
recipe = plone.recipe.zope2instance
...
event-log-custom =
%import raven.contrib.zope
<logfile>
path ${buildout:directory}/var/instance.log
level INFO
</logfile>
<sentry>
dsn YOUR_DSN
level ERROR
</sentry>
1.4.12 Tornado
Setup
The first thing you’ll need to do is to initialize sentry client under your application
import tornado.web
from raven.contrib.tornado import AsyncSentryClient
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
application.sentry_client = AsyncSentryClient(
’http://public_key:secret_key@host:port/project’
)
1.4. Integrations
25
Raven Documentation, Release 5.2.0
Usage
Once the sentry client is attached to the application, request handlers can automatically capture uncaught exceptions
by inheriting the SentryMixin class.
import tornado.web
from raven.contrib.tornado import SentryMixin
class UncaughtExceptionExampleHandler(SentryMixin, tornado.web.RequestHandler):
def get(self):
1/0
You can also send events manually using the shortcuts defined in SentryMixin. The shortcuts can be used for both
asynchronous and synchronous usage.
Asynchronous
import tornado.web
import tornado.gen
from raven.contrib.tornado import SentryMixin
class AsyncMessageHandler(SentryMixin, tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
self.write("You requested the main page")
yield tornado.gen.Task(
self.captureMessage, "Request for main page served"
)
self.finish()
class AsyncExceptionHandler(SentryMixin, tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
try:
raise ValueError()
except Exception as e:
response = yield tornado.gen.Task(
self.captureException, exc_info=True
)
self.finish()
Tip: The value returned by the yield is a HTTPResponse obejct.
Synchronous
import tornado.web
from raven.contrib.tornado import SentryMixin
class AsyncExampleHandler(SentryMixin, tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
self.captureMessage("Request for main page served")
26
Chapter 1. Users Guide
Raven Documentation, Release 5.2.0
1.5 Transports
A transport is the mechanism in which Raven sends the HTTP request to the Sentry server. By default, Raven uses a
threaded asynchronous transport, but you can easily adjust this by modifying your SENTRY_DSN value.
Transport registration is done via the URL prefix, so for example, a synchronous transport is as simple as prefixing
your SENTRY_DSN with the sync+ value.
Options are passed to transports via the querystring.
All transports should support at least the following options:
timeout = 1 The time to wait for a response from the server, in seconds.
verify_ssl = 1 If the connection is HTTPS, validate the certificate and hostname.
ca_certs = [raven]/data/cacert.pem A certificate bundle to use when validating SSL connections.
For example, to increase the timeout and to disable SSL verification:
SENTRY_DSN = ’http://public:[email protected]/1?timeout=5&verify_ssl=0’
1.5.1 aiohttp
Should only be used within a PEP 3156 compatible event loops (asyncio itself and others).
SENTRY_DSN = ’aiohttp+http://public:[email protected]/1’
1.5.2 Eventlet
Should only be used within an Eventlet IO loop.
SENTRY_DSN = ’eventlet+http://public:[email protected]/1’
1.5.3 Gevent
Should only be used within a Gevent IO loop.
SENTRY_DSN = ’gevent+http://public:[email protected]/1’
1.5.4 Requests
Requires the requests library. Synchronous.
SENTRY_DSN = ’requests+http://public:[email protected]/1’
1.5.5 Sync
A synchronous blocking transport.
SENTRY_DSN = ’sync+http://public:[email protected]/1’
1.5. Transports
27
Raven Documentation, Release 5.2.0
1.5.6 Threaded (Default)
Spawns a async worked for processing messages.
SENTRY_DSN = ’threaded+http://public:[email protected]/1’
1.5.7 Tornado
Should only be used within a Tornado IO loop.
SENTRY_DSN = ’tornado+http://public:[email protected]/1’
1.5.8 Twisted
Should only be used within a Twisted event loop.
SENTRY_DSN = ’twisted+http://public:[email protected]/1’
28
Chapter 1. Users Guide
CHAPTER 2
Developers
2.1 Contributing
Want to contribute back to Sentry? This page describes the general development flow, our philosophy, the test suite,
and issue tracking.
(Though it actually doesn’t describe all of that, yet)
2.1.1 Setting up an Environment
Sentry is designed to run off of setuptools with minimal work. Because of this setting up a development environment
requires only a few steps.
The first thing you’re going to want to do, is build a virtualenv and install any base dependancies.
virtualenv ~/.virtualenvs/raven
source ~/.virtualenvs/raven/bin/activate
make
That’s it :)
2.1.2 Running the Test Suite
The test suite is also powered off of py.test, and can be run in a number of ways. Usually though, you’ll just want to
use our helper method to make things easy:
make test
2.1.3 Contributing Back Code
Ideally all patches should be sent as a pull request on GitHub, and include tests. If you’re fixing a bug or making a
large change the patch must include test coverage.
You can see a list of open pull requests (pending changes) by visiting https://github.com/getsentry/raven-python/pulls
29
Raven Documentation, Release 5.2.0
30
Chapter 2. Developers
CHAPTER 3
Reference
3.1 Changelog
3.1.1 Version 5.2.0
• Protocol version is now 6 (requires Sentry 7.0 or newer).
• Added release option to Client.
• Added fetch_git_sha helper.
• Added fetch_package_version helper.
3.1.2 Version 5.1.0
• Added aiohttp transport.
• Corrected behavior with auto_log_stacks and exceptions.
• Add support for certifi.
• Expanded Flask support.
• Expanded Django support.
• Corrected an issue where processors were not correctly applying.
3.1.3 Version 5.0.0
• Sentry client protocol is now version 5.
• Various improvements to threaded transport.
3.1.4 Version 4.2.0
• SSL verification is now on by default.
• Rate limits and other valid API errors are now handled more gracefully.
• Added last_event_id and X-Sentry-ID header to Flask.
31
Raven Documentation, Release 5.2.0
3.1.5 Version 4.1.0
• Added verify_ssl option to HTTP transport (defaults to False).
• Added capture_locals option (defaults to True).
• message can now be passed to capture* functions.
• Django <1.4 is no longer supported.
• Function object serialization has been improved.
• SanitizePasswordsProcessor removes API keys.
3.1.6 Version 4.0.0
• Sentry client protocol is now version 4.
3.1.7 Version 3.6.0
This changelog does not attempt to account for all changes between 3.6.0 and 3.0.0, but rather focuses on recent
important changes
• Transport modules paths have been refactored.
• The threaded transport is now the default.
• Client.context has changed. Please see documentation for new API.
• Client.user_context was added.
• Client.http_context was added.
• Client.extra_context was added.
• Client.tags_context was added.
• Flask support has been greatly improved.
• raven.contrib.celery.Client has been removed as it was invalid.
3.1.8 Version 3.0.0
Version 3.0 of Raven requires a Sentry server running at least version 5.1, as it implements version 3 of the protocol.
Support includes:
• Sending ‘python’ as the platform.
• The ‘tags’ option (on all constructors that support options).
• Updated authentication header.
Additionally, the following has changed:
• Configuring the client with an empty DSN value will disable sending of messages.
• All clients should now check Client.is_enabled() to verify if they should send data.
• Client.create_from_text and Client.create_from_exception have been removed.
• Client.message and Client.exception have been removed.
32
Chapter 3. Reference
Raven Documentation, Release 5.2.0
• The key setting has been removed.
• The DEBUG setting in Django no longer disables Raven.
• The register_signals option in RAVEN_CONFIG (Django) is no longer used.
• A new helper, Client.context() is now available for scoping options.
• Client.captureExceptions is now deprecated in favor of Client.context.
• Credit card values will now be sanitized with the default processors.
• A new eventlet+http transport exists.
• A new threaded+http transport exists.
• PyPy is now supported.
• Django 1.5 should now be supported (experimental).
• Gevent 1.0 should now be supported (experimental).
• Python 2.5 is no longer supported.
• [Django] The skip_sentry attribute is no longer supported. A new option config option has replaced this:
SENTRY_IGNORE_EXCEPTIONS.
3.1.9 Version 2.0.0
• New serializers exist (and can be registered) against Raven. See raven.utils.serializer for more
information.
• You can now pass tags to the capture method. This will require a Sentry server compatible with the new
tags protocol.
• A new gevent+http transport exists.
• A new tornado+http transport exists.
• A new twisted+http transport exists.
• Zope integration has been added. See docs for more information.
• PasteDeploy integration has been added. See docs for more information.
• A Django endpoint now exists for proxying requests to Sentry. See raven.contrib.django.views for
more information.
3.1.10 Version 1.9.0
• Signatures are no longer sent with messages. This requires the server version to be at least 4.4.6.
• Several fixes and additions were added to the Django report view.
• long types are now handled in transform().
• Improved integration with Celery (and django-celery) for capturing errors.
3.1. Changelog
33
Raven Documentation, Release 5.2.0
3.1.11 Version 1.8.0
• There is now a builtin view as part of the Django integration for sending events server-side (from the client) to
Sentry. The view is currently undocumented, but is available as {% url raven-report %} and will use
your server side credentials. To use this view you’d simply swap out the servers configuration in raven-js and
point it to the given URL.
• A new middleware for ZeroRPC now exists.
• A new protocol for registering transports now exists.
• Corrected some behavior in the UDP transport.
• Celery signals are now connected by default within the Django integration.
3.1.12 Version 1.7.0
• The password sanitizer will now attempt to sanitize key=value pairs within strings (such as the querystring).
• Two new santiziers were added: RemoveStackLocalsProcessor and RemovePostDataProcessor
3.1.13 Version 1.6.0
• Stacks must now be passed as a list of tuples (frame, lineno) rather than a list of frames. This includes calls to
logging (extra={‘stack’: []}), as well as explicit client calls (capture(stack=[])).
This corrects some issues (mostly in tracebacks) with the wrong lineno being reported for a frame.
3.1.14 Version 1.4.0
• Raven now tracks the state of the Sentry server. If it receives an error, it will slow down requests to the server
(by passing them into a named logger, sentry.errors), and increasingly delay the next try with repeated failures,
up to about a minute.
3.1.15 Version 1.3.6
• gunicorn is now disabled in default logging configuration
3.1.16 Version 1.3.5
• Moved exception and message methods to capture{Exception,Message}.
• Added captureQuery method.
3.1.17 Version 1.3.4
• Corrected duplicate DSN behavior in Django client.
34
Chapter 3. Reference
Raven Documentation, Release 5.2.0
3.1.18 Version 1.3.3
• Django can now be configured by setting SENTRY_DSN.
• Improve logging for send_remote failures (and correct issue created when send_encoded was introduced).
• Renamed SantizePassworsProcessor to SanitizePassworsProcessor.
3.1.19 Version 1.3.2
• Support sending the culprit with logging messages as part of extra.
3.1.20 Version 1.3.1
• Added client.exception and client.message shortcuts.
3.1.21 Version 1.3.0
• Refactored client send API to be more easily extensible.
• MOAR TESTS!
3.1.22 Version 1.2.2
• Gracefully handle exceptions in Django client when using integrated setup.
• Added Client.error_logger as a new logger instance that points to sentry.errors.
3.1.23 Version 1.2.1
• Corrected behavior with raven logging errors to send_remote which could potentially cause a very large backlog
to Sentry when it should just log to sentry.errors.
• Ensure the site argument is sent to the server.
3.1.24 Version 1.2.0
• Made DSN a first-class citizen throughout Raven.
• Added a Pylons-specific WSGI middleware.
• Improved the generic WSGI middleware to capture HTTP information.
• Improved logging and logbook handlers.
3.1.25 Version 1.1.6
• Corrected logging stack behavior so that it doesnt capture raven+logging extensions are part of the frames.
3.1. Changelog
35
Raven Documentation, Release 5.2.0
3.1.26 Version 1.1.5
• Remove logging attr magic.
3.1.27 Version 1.1.4
• Correct encoding behavior on bool and float types.
3.1.28 Version 1.1.3
• Fix ‘request’ attribute on Django logging.
3.1.29 Version 1.1.2
• Corrected logging behavior with extra data to match pre 1.x behavior.
3.1.30 Version 1.1.1
• Handle frames that are missing f_globals and f_locals.
• Stricter conversion of int and boolean values.
• Handle invalid sources for templates in Django.
3.1.31 Version 1.1.0
• varmap was refactored to send keys back to callbacks.
• SanitizePasswordProcessor now handles http data.
3.1.32 Version 1.0.5
• Renaming raven2 to raven as it causes too many issues.
3.1.33 Version 1.0.4
• Corrected a bug in setup_logging.
• Raven now sends “sentry_version” header which is the expected server version.
3.1.34 Version 1.0.3
• Handle more edge cases on stack iteration.
3.1.35 Version 1.0.2
• Gracefully handle invalid f_locals.
36
Chapter 3. Reference
Raven Documentation, Release 5.2.0
3.1.36 Version 1.0.1
• All datetimes are assumed to be utcnow() as of Sentry 2.0.0-RC5
3.1.37 Version 1.0.0
• Now only works with Sentry>=2.0.0 server.
• Raven is now listed as raven2 on PyPi.
3.1.38 Version 0.8.0
• raven.contrib.celery is now useable.
• raven.contrib.django.celery is now useable.
• Fixed a bug with request.raw_post_data buffering in Django.
3.1.39 Version 0.7.1
• Servers would stop iterating after the first successful post which was not the intended behavior.
3.1.40 Version 0.7.0
• You can now explicitly pass a list of frame objects to the process method.
3.1.41 Version 0.6.1
• The default logging handler (SentryHandler) will now accept a set of kwargs to instantiate a new client with
(GH-10).
• Fixed a bug with checksum generation when module or function were missing (GH-9).
3.1.42 Version 0.6.0
• Added a Django-specific WSGI middleware.
3.1.43 Version 0.5.1
• Two minor fixes for the Django client:
• Ensure the __sentry__ key exists in data in (GH-8).
• properly set kwargs[’data’] to an empty list when its a NoneType (GH-6).
3.1. Changelog
37
Raven Documentation, Release 5.2.0
3.1.44 Version 0.5.0
• Require servers on base Client.
• Added support for the site option in Client.
• Moved raven.contrib.django.logging to raven.contrib.django.handlers.
3.1.45 Version 0.4.0
• Fixed an infinite loop in iter_tb.
3.1.46 Version 0.3.0
• Removed the thrashed key in request.sentry for the Django integration.
• Changed the logging handler to correctly inherit old-style classes (GH-1).
• Added a client argument to raven.contrib.django.models.get_client().
3.1.47 Version 0.2.0
• auto_log_stacks now works with create_from_text
• added Client.get_ident
3.1.48 Version 0.1.0
• Initial version of Raven (extracted from django-sentry 1.12.1).
38
Chapter 3. Reference
CHAPTER 4
Supported Platforms
• Python 2.6
• Python 2.7
• Python 3.2
• Python 3.3
• PyPy
• Google App Engine
39
Raven Documentation, Release 5.2.0
40
Chapter 4. Supported Platforms
CHAPTER 5
About Sentry
Sentry provides you with a generic interface to view and interact with your error logs. With this it allows you to
interact and view near real-time information to discover issues and more easily trace them in your application.
More information about Sentry can be found at http://www.getsentry.com/
41
Raven Documentation, Release 5.2.0
42
Chapter 5. About Sentry
CHAPTER 6
Resources
• Documentation
• Bug Tracker
• Code
• Mailing List
• IRC (irc.freenode.net, #sentry)
43
Raven Documentation, Release 5.2.0
44
Chapter 6. Resources
CHAPTER 7
Deprecation Notes
Milestones releases are 1.3 or 1.4, and our deprecation policy is to a two version step. For example, a feature will be
deprecated in 1.3, and completely removed in 1.4.
45
Raven Documentation, Release 5.2.0
46
Chapter 7. Deprecation Notes
Index
B
S
build_msg() (raven.base.Client method), 8
send() (raven.base.Client method), 11
send_encoded() (raven.base.Client method), 11
C
capture() (raven.base.Client method), 8
capture_exceptions() (raven.base.Client method), 10
captureException() (raven.base.Client method), 9
captureMessage() (raven.base.Client method), 9
captureQuery() (raven.base.Client method), 9
Client (class in raven.base), 8
context (raven.base.Client attribute), 10
T
tags_context() (raven.base.Client method), 11
U
user_context() (raven.base.Client method), 11
D
decode() (raven.base.Client method), 10
E
encode() (raven.base.Client method), 10
extra_context() (raven.base.Client method), 10
G
get_ident() (raven.base.Client method), 10
get_public_dsn() (raven.base.Client method), 10
H
http_context() (raven.base.Client method), 10
I
is_enabled() (raven.base.Client method), 10
P
Python Enhancement Proposals
PEP 3156, 27
R
raven.processors.RemovePostDataProcessor
(built-in
variable), 7
raven.processors.RemoveStackLocalsProcessor (built-in
variable), 7
raven.processors.SanitizePasswordsProcessor
(built-in
variable), 6
47