Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions sentry_sdk/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class INSTRUMENTER:

class DBOPERATION:
COMMIT = "COMMIT"
ROLLBACK = "ROLLBACK"


class SPANDATA:
Expand Down
13 changes: 13 additions & 0 deletions sentry_sdk/integrations/django/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,7 @@ def install_sql_hook():
real_executemany = CursorWrapper.executemany
real_connect = BaseDatabaseWrapper.connect
real_commit = BaseDatabaseWrapper._commit
real_rollback = BaseDatabaseWrapper._rollback
except AttributeError:
# This won't work on Django versions < 1.6
return
Expand Down Expand Up @@ -702,10 +703,22 @@ def _commit(self):
_set_db_data(span, self, DBOPERATION.COMMIT)
return real_commit(self)

@ensure_integration_enabled(DjangoIntegration, real_rollback)
def _rollback(self):
# type: (BaseDatabaseWrapper) -> None
with sentry_sdk.start_span(
op=OP.DB,
name=DBOPERATION.ROLLBACK,
origin=DjangoIntegration.origin_db,
) as span:
_set_db_data(span, self, DBOPERATION.ROLLBACK)
return real_rollback(self)

CursorWrapper.execute = execute
CursorWrapper.executemany = executemany
BaseDatabaseWrapper.connect = connect
BaseDatabaseWrapper._commit = _commit
BaseDatabaseWrapper._rollback = _rollback
ignore_logger("django.db.backends")


Expand Down
15 changes: 15 additions & 0 deletions tests/integrations/django/myapp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,26 @@ def path(path, *args, **kwargs):
views.postgres_insert_orm_no_autocommit,
name="postgres_insert_orm_no_autocommit",
),
path(
"postgres-insert-no-autocommit-rollback",
views.postgres_insert_orm_no_autocommit_rollback,
name="postgres_insert_orm_no_autocommit_rollback",
),
path(
"postgres-insert-atomic",
views.postgres_insert_orm_atomic,
name="postgres_insert_orm_atomic",
),
path(
"postgres-insert-atomic-rollback",
views.postgres_insert_orm_atomic_rollback,
name="postgres_insert_orm_atomic_rollback",
),
path(
"postgres-insert-atomic-exception",
views.postgres_insert_orm_atomic_exception,
name="postgres_insert_orm_atomic_exception",
),
path(
"postgres-select-slow-from-supplement",
helper_views.postgres_select_orm,
Expand Down
44 changes: 43 additions & 1 deletion tests/integrations/django/myapp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,27 @@ def postgres_insert_orm_no_autocommit(request, *args, **kwargs):
username="user1",
)
transaction.commit(using="postgres")
finally:
except Exception:
transaction.set_autocommit(True, using="postgres")
raise

transaction.set_autocommit(True, using="postgres")
return HttpResponse("ok {}".format(user))


@csrf_exempt
def postgres_insert_orm_no_autocommit_rollback(request, *args, **kwargs):
transaction.set_autocommit(False, using="postgres")
try:
user = User.objects.db_manager("postgres").create_user(
username="user1",
)
transaction.rollback(using="postgres")
except Exception:
transaction.set_autocommit(True, using="postgres")
raise

transaction.set_autocommit(True, using="postgres")
return HttpResponse("ok {}".format(user))


Expand All @@ -270,6 +288,30 @@ def postgres_insert_orm_atomic(request, *args, **kwargs):
return HttpResponse("ok {}".format(user))


@csrf_exempt
def postgres_insert_orm_atomic_rollback(request, *args, **kwargs):
with transaction.atomic(using="postgres"):
user = User.objects.db_manager("postgres").create_user(
username="user1",
)
transaction.set_rollback(True, using="postgres")
return HttpResponse("ok {}".format(user))


@csrf_exempt
def postgres_insert_orm_atomic_exception(request, *args, **kwargs):
try:
with transaction.atomic(using="postgres"):
user = User.objects.db_manager("postgres").create_user(
username="user1",
)
transaction.set_rollback(True, using="postgres")
1 / 0
except ZeroDivisionError:
pass
return HttpResponse("ok {}".format(user))


@csrf_exempt
def permission_denied_exc(*args, **kwargs):
raise PermissionDenied("bye")
Expand Down
Loading