Cerin
Cerin

Reputation: 64739

How to ignore certain Python errors from Sentry capture

I have Sentry configured to capture all errors from a Django+Celery application. It works ok, but I'm finding an obnoxious use case is when I have to restart my Celery workers, PostgreSQL database or messaging server, which causes thousands of various kinds of "database/messaging server cannot be reached" errors. This pollutes the Sentry reports, and sometimes even exceeds my event quota.

Their docs mention an "ignore_exceptions" parameter, but it's in their old deprecated client that I'm not using, nor is recommended to be used for new projects. How would you do this in the new API?

Upvotes: 20

Views: 18659

Answers (3)

cảnh nguyễn
cảnh nguyễn

Reputation: 898

To ignore all related errors, there are two ways:

  1. Use before_send
import sentry_sdk
from rest_framework.exceptions import ValidationError

def before_send(event, hint):
    if 'exc_info' in hint:
        exc_type, exc_value, tb = hint['exc_info'] 
        if isinstance(exc_value, (KeyError, ValidationError)):
            return None
    return event

sentry_sdk.init(
    dsn='SENTRY_DSN',
    before_send=before_send
)
  1. Use ignore_errors
import sentry_sdk
from rest_framework.exceptions import ValidationError

sentry_dsk.init(
    dsn='SENTRY_DSN',
    ignore_errors=[
       KeyError() ,
       ValidationError('my error message'),
    ]  # All event error (KeyError, ValidationError) will be ignored
)

To ignore a specific event error, just ignore this event ValidationError('my error message') with a custom def before_send:

def before_send(event, hint):
    if 'exc_info' in hint:
        exc_type, exc_value, tb = hint['exc_info'] 
        if exc_value.args[0] in ['my error message', 'my error message 2', ...]:
            return None
    return event

This is documented in the sentry-python documentation at: https://docs.sentry.io/platforms/python/guides/django/configuration/filtering/

Note: The hint parameter has 3 cases, you need to know in which case your error will be. https://docs.sentry.io/platforms/python/guides/django/configuration/filtering/hints/

Upvotes: 8

A. Wilson
A. Wilson

Reputation: 8840

It took me some source-diving to actually find it, but the option in the new SDK is "ignore_errors". It takes an iterable where each element can be either a string or a type (like the old interface).

I hesitate to link to it because its an internal method that could change at any time, but here is the snapshot of it at the time of me writing this.

As an example (reimplementing Markus's answer):

import sentry_sdk

sentry_sdk.init(ignore_errors=[IgnoredErrorFoo, IgnoredErrorBar])

Upvotes: 34

Markus Unterwaditzer
Markus Unterwaditzer

Reputation: 8244

You can use before-send to filter errors by arbitrary criteria. Since it's unclear what you actually want to filter by, here's an example that filters by type. However, you can extend it with custom logic to e.g. match by exception message.

import sentry_sdk

def before_send(event, hint):
    if 'exc_info' in hint:
        exc_type, exc_value, tb = hint['exc_info']
        if isinstance(exc_value, (IgnoredErrorFoo, IgnoredErrorBar)):
            return None
    return event

sentry_sdk.init(before_send=before_send)

Upvotes: 17

Related Questions