|
1 | 1 | from django.template import TemplateSyntaxError |
| 2 | +from django import VERSION as DJANGO_VERSION |
2 | 3 |
|
| 4 | +from sentry_sdk import _functools, Hub |
3 | 5 | from sentry_sdk._types import MYPY |
4 | 6 |
|
5 | 7 | if MYPY: |
@@ -40,6 +42,50 @@ def get_template_frame_from_exception(exc_value): |
40 | 42 | return None |
41 | 43 |
|
42 | 44 |
|
| 45 | +def patch_templates(): |
| 46 | + # type: () -> None |
| 47 | + from django.template.response import SimpleTemplateResponse |
| 48 | + from sentry_sdk.integrations.django import DjangoIntegration |
| 49 | + |
| 50 | + real_rendered_content = SimpleTemplateResponse.rendered_content |
| 51 | + |
| 52 | + @property # type: ignore |
| 53 | + def rendered_content(self): |
| 54 | + # type: (SimpleTemplateResponse) -> str |
| 55 | + hub = Hub.current |
| 56 | + if hub.get_integration(DjangoIntegration) is None: |
| 57 | + return real_rendered_content.fget(self) |
| 58 | + |
| 59 | + with hub.start_span( |
| 60 | + op="django.template.render", description=self.template_name |
| 61 | + ) as span: |
| 62 | + span.set_data("context", self.context_data) |
| 63 | + return real_rendered_content.fget(self) |
| 64 | + |
| 65 | + SimpleTemplateResponse.rendered_content = rendered_content |
| 66 | + |
| 67 | + if DJANGO_VERSION < (1, 7): |
| 68 | + return |
| 69 | + import django.shortcuts |
| 70 | + |
| 71 | + real_render = django.shortcuts.render |
| 72 | + |
| 73 | + @_functools.wraps(real_render) |
| 74 | + def render(request, template_name, context=None, *args, **kwargs): |
| 75 | + # type: (django.http.HttpRequest, str, Optional[Dict[str, Any]], *Any, **Any) -> django.http.HttpResponse |
| 76 | + hub = Hub.current |
| 77 | + if hub.get_integration(DjangoIntegration) is None: |
| 78 | + return real_render(request, template_name, context, *args, **kwargs) |
| 79 | + |
| 80 | + with hub.start_span( |
| 81 | + op="django.template.render", description=template_name |
| 82 | + ) as span: |
| 83 | + span.set_data("context", context) |
| 84 | + return real_render(request, template_name, context, *args, **kwargs) |
| 85 | + |
| 86 | + django.shortcuts.render = render |
| 87 | + |
| 88 | + |
43 | 89 | def _get_template_frame_from_debug(debug): |
44 | 90 | # type: (Dict[str, Any]) -> Dict[str, Any] |
45 | 91 | if debug is None: |
|
0 commit comments