Skip to content

Commit ad3724c

Browse files
authored
Make Django signals tracing optional (#1929)
Adds an option signals_spans to the DjangoIntegrations that works the same as middleware_spans so the tracing of Django signals can be turned of.
1 parent ff60906 commit ad3724c

File tree

3 files changed

+87
-38
lines changed

3 files changed

+87
-38
lines changed

Diff for: sentry_sdk/integrations/django/__init__.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,20 @@ class DjangoIntegration(Integration):
9090

9191
transaction_style = ""
9292
middleware_spans = None
93+
signals_spans = None
9394

94-
def __init__(self, transaction_style="url", middleware_spans=True):
95-
# type: (str, bool) -> None
95+
def __init__(
96+
self, transaction_style="url", middleware_spans=True, signals_spans=True
97+
):
98+
# type: (str, bool, bool) -> None
9699
if transaction_style not in TRANSACTION_STYLE_VALUES:
97100
raise ValueError(
98101
"Invalid value for transaction_style: %s (must be in %s)"
99102
% (transaction_style, TRANSACTION_STYLE_VALUES)
100103
)
101104
self.transaction_style = transaction_style
102105
self.middleware_spans = middleware_spans
106+
self.signals_spans = signals_spans
103107

104108
@staticmethod
105109
def setup_once():

Diff for: sentry_sdk/integrations/django/signals_handlers.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def _get_receiver_name(receiver):
4343
def patch_signals():
4444
# type: () -> None
4545
"""Patch django signal receivers to create a span"""
46+
from sentry_sdk.integrations.django import DjangoIntegration
4647

4748
old_live_receivers = Signal._live_receivers
4849

@@ -66,8 +67,10 @@ def wrapper(*args, **kwargs):
6667

6768
return wrapper
6869

69-
for idx, receiver in enumerate(receivers):
70-
receivers[idx] = sentry_receiver_wrapper(receiver)
70+
integration = hub.get_integration(DjangoIntegration)
71+
if integration and integration.signals_spans:
72+
for idx, receiver in enumerate(receivers):
73+
receivers[idx] = sentry_receiver_wrapper(receiver)
7174

7275
return receivers
7376

Diff for: tests/integrations/django/test_basic.py

+76-34
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ def test_does_not_capture_403(sentry_init, client, capture_events, endpoint):
670670
sentry_init(integrations=[DjangoIntegration()])
671671
events = capture_events()
672672

673-
_content, status, _headers = client.get(reverse(endpoint))
673+
_, status, _ = client.get(reverse(endpoint))
674674
assert status.lower() == "403 forbidden"
675675

676676
assert not events
@@ -697,32 +697,14 @@ def test_render_spans(sentry_init, client, capture_events, render_span_tree):
697697

698698
for url, expected_line in views_tests:
699699
events = capture_events()
700-
_content, status, _headers = client.get(url)
700+
client.get(url)
701701
transaction = events[0]
702702
assert expected_line in render_span_tree(transaction)
703703

704704

705-
def test_middleware_spans(sentry_init, client, capture_events, render_span_tree):
706-
sentry_init(
707-
integrations=[DjangoIntegration()],
708-
traces_sample_rate=1.0,
709-
_experiments={"record_sql_params": True},
710-
)
711-
events = capture_events()
712-
713-
_content, status, _headers = client.get(reverse("message"))
714-
715-
message, transaction = events
716-
717-
assert message["message"] == "hi"
718-
719-
if DJANGO_VERSION >= (1, 10):
720-
assert (
721-
render_span_tree(transaction)
722-
== """\
705+
if DJANGO_VERSION >= (1, 10):
706+
EXPECTED_MIDDLEWARE_SPANS = """\
723707
- op="http.server": description=null
724-
- op="event.django": description="django.db.reset_queries"
725-
- op="event.django": description="django.db.close_old_connections"
726708
- op="middleware.django": description="django.contrib.sessions.middleware.SessionMiddleware.__call__"
727709
- op="middleware.django": description="django.contrib.auth.middleware.AuthenticationMiddleware.__call__"
728710
- op="middleware.django": description="django.middleware.csrf.CsrfViewMiddleware.__call__"
@@ -731,15 +713,9 @@ def test_middleware_spans(sentry_init, client, capture_events, render_span_tree)
731713
- op="middleware.django": description="django.middleware.csrf.CsrfViewMiddleware.process_view"
732714
- op="view.render": description="message"\
733715
"""
734-
)
735-
736-
else:
737-
assert (
738-
render_span_tree(transaction)
739-
== """\
716+
else:
717+
EXPECTED_MIDDLEWARE_SPANS = """\
740718
- op="http.server": description=null
741-
- op="event.django": description="django.db.reset_queries"
742-
- op="event.django": description="django.db.close_old_connections"
743719
- op="middleware.django": description="django.contrib.sessions.middleware.SessionMiddleware.process_request"
744720
- op="middleware.django": description="django.contrib.auth.middleware.AuthenticationMiddleware.process_request"
745721
- op="middleware.django": description="tests.integrations.django.myapp.settings.TestMiddleware.process_request"
@@ -749,22 +725,71 @@ def test_middleware_spans(sentry_init, client, capture_events, render_span_tree)
749725
- op="middleware.django": description="django.middleware.csrf.CsrfViewMiddleware.process_response"
750726
- op="middleware.django": description="django.contrib.sessions.middleware.SessionMiddleware.process_response"\
751727
"""
752-
)
728+
729+
730+
def test_middleware_spans(sentry_init, client, capture_events, render_span_tree):
731+
sentry_init(
732+
integrations=[
733+
DjangoIntegration(signals_spans=False),
734+
],
735+
traces_sample_rate=1.0,
736+
)
737+
events = capture_events()
738+
739+
client.get(reverse("message"))
740+
741+
message, transaction = events
742+
743+
assert message["message"] == "hi"
744+
assert render_span_tree(transaction) == EXPECTED_MIDDLEWARE_SPANS
753745

754746

755747
def test_middleware_spans_disabled(sentry_init, client, capture_events):
756748
sentry_init(
757-
integrations=[DjangoIntegration(middleware_spans=False)], traces_sample_rate=1.0
749+
integrations=[
750+
DjangoIntegration(middleware_spans=False, signals_spans=False),
751+
],
752+
traces_sample_rate=1.0,
758753
)
759754
events = capture_events()
760755

761-
_content, status, _headers = client.get(reverse("message"))
756+
client.get(reverse("message"))
762757

763758
message, transaction = events
764759

765760
assert message["message"] == "hi"
761+
assert not len(transaction["spans"])
762+
763+
764+
if DJANGO_VERSION >= (1, 10):
765+
EXPECTED_SIGNALS_SPANS = """\
766+
- op="http.server": description=null
767+
- op="event.django": description="django.db.reset_queries"
768+
- op="event.django": description="django.db.close_old_connections"\
769+
"""
770+
else:
771+
EXPECTED_SIGNALS_SPANS = """\
772+
- op="http.server": description=null
773+
- op="event.django": description="django.db.reset_queries"
774+
- op="event.django": description="django.db.close_old_connections"\
775+
"""
776+
777+
778+
def test_signals_spans(sentry_init, client, capture_events, render_span_tree):
779+
sentry_init(
780+
integrations=[
781+
DjangoIntegration(middleware_spans=False),
782+
],
783+
traces_sample_rate=1.0,
784+
)
785+
events = capture_events()
766786

767-
assert len(transaction["spans"]) == 2
787+
client.get(reverse("message"))
788+
789+
message, transaction = events
790+
791+
assert message["message"] == "hi"
792+
assert render_span_tree(transaction) == EXPECTED_SIGNALS_SPANS
768793

769794
assert transaction["spans"][0]["op"] == "event.django"
770795
assert transaction["spans"][0]["description"] == "django.db.reset_queries"
@@ -773,6 +798,23 @@ def test_middleware_spans_disabled(sentry_init, client, capture_events):
773798
assert transaction["spans"][1]["description"] == "django.db.close_old_connections"
774799

775800

801+
def test_signals_spans_disabled(sentry_init, client, capture_events):
802+
sentry_init(
803+
integrations=[
804+
DjangoIntegration(middleware_spans=False, signals_spans=False),
805+
],
806+
traces_sample_rate=1.0,
807+
)
808+
events = capture_events()
809+
810+
client.get(reverse("message"))
811+
812+
message, transaction = events
813+
814+
assert message["message"] == "hi"
815+
assert not transaction["spans"]
816+
817+
776818
def test_csrf(sentry_init, client):
777819
"""
778820
Assert that CSRF view decorator works even with the view wrapped in our own

0 commit comments

Comments
 (0)