Skip to content

Commit 978a07f

Browse files
Add Django template tag for adding sentry tracing information (#2222)
Adding sentry_trace_meta to template context so meta tags including Sentry trace information can be rendered using {{ sentry_trace_meta }} in the Django templates --------- Co-authored-by: Ivana Kellyerova <[email protected]>
1 parent e6ef1e8 commit 978a07f

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

sentry_sdk/integrations/django/templates.py

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.template import TemplateSyntaxError
2+
from django.utils.safestring import mark_safe
23
from django import VERSION as DJANGO_VERSION
34

45
from sentry_sdk import _functools, Hub
@@ -88,6 +89,11 @@ def render(request, template_name, context=None, *args, **kwargs):
8889
if hub.get_integration(DjangoIntegration) is None:
8990
return real_render(request, template_name, context, *args, **kwargs)
9091

92+
# Inject trace meta tags into template context
93+
context = context or {}
94+
if "sentry_trace_meta" not in context:
95+
context["sentry_trace_meta"] = mark_safe(hub.trace_propagation_meta())
96+
9197
with hub.start_span(
9298
op=OP.TEMPLATE_RENDER,
9399
description=_get_template_name_description(template_name),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ sentry_trace_meta }}

tests/integrations/django/myapp/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def path(path, *args, **kwargs):
5555
path("template-exc", views.template_exc, name="template_exc"),
5656
path("template-test", views.template_test, name="template_test"),
5757
path("template-test2", views.template_test2, name="template_test2"),
58+
path("template-test3", views.template_test3, name="template_test3"),
5859
path("postgres-select", views.postgres_select, name="postgres_select"),
5960
path(
6061
"permission-denied-exc",

tests/integrations/django/myapp/views.py

+9
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,15 @@ def template_test2(request, *args, **kwargs):
175175
)
176176

177177

178+
@csrf_exempt
179+
def template_test3(request, *args, **kwargs):
180+
from sentry_sdk import Hub
181+
182+
hub = Hub.current
183+
capture_message(hub.get_traceparent() + "\n" + hub.get_baggage())
184+
return render(request, "trace_meta.html", {})
185+
186+
178187
@csrf_exempt
179188
def postgres_select(request, *args, **kwargs):
180189
from django.db import connections

tests/integrations/django/test_basic.py

+20
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,26 @@ def test_read_request(sentry_init, client, capture_events):
706706
assert "data" not in event["request"]
707707

708708

709+
def test_template_tracing_meta(sentry_init, client, capture_events):
710+
sentry_init(integrations=[DjangoIntegration()], traces_sample_rate=1.0)
711+
events = capture_events()
712+
713+
# The view will capture_message the sentry-trace and baggage information
714+
content, _, _ = client.get(reverse("template_test3"))
715+
rendered_meta = b"".join(content).decode("utf-8")
716+
717+
traceparent, baggage = events[0]["message"].split("\n")
718+
expected_meta = (
719+
'<meta name="sentry-trace" content="%s"><meta name="baggage" content="%s">\n'
720+
% (
721+
traceparent,
722+
baggage,
723+
)
724+
)
725+
726+
assert rendered_meta == expected_meta
727+
728+
709729
@pytest.mark.parametrize("with_executing_integration", [[], [ExecutingIntegration()]])
710730
def test_template_exception(
711731
sentry_init, client, capture_events, with_executing_integration

0 commit comments

Comments
 (0)