diff --git a/ddtrace/contrib/django/templates.py b/ddtrace/contrib/django/templates.py index aeeea4eba56..68da1a62644 100644 --- a/ddtrace/contrib/django/templates.py +++ b/ddtrace/contrib/django/templates.py @@ -31,14 +31,12 @@ def patch_template(tracer): setattr(Template, attr, Template.render) - class TracedTemplate(object): - - def render(self, context): - with tracer.trace('django.template', span_type=http.TEMPLATE) as span: - try: - return Template._datadog_original_render(self, context) - finally: - span.set_tag('django.template_name', context.template_name or 'unknown') - - Template.render = TracedTemplate.render.__func__ + def traced_render(self, context): + with tracer.trace('django.template', span_type=http.TEMPLATE) as span: + try: + return Template._datadog_original_render(self, context) + finally: + span.set_tag('django.template_name', context.template_name or 'unknown') + + Template.render = traced_render diff --git a/tests/contrib/django/__init__.py b/tests/contrib/django/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/contrib/django/tests.py b/tests/contrib/django/tests.py new file mode 100644 index 00000000000..0f57d12ddc3 --- /dev/null +++ b/tests/contrib/django/tests.py @@ -0,0 +1,48 @@ +import time + +# 3p +from django import template +from django.template.backends.dummy import TemplateStrings +from nose.tools import eq_ + +from ddtrace.contrib.django.templates import patch_template +from ddtrace.tracer import Tracer +from ...test_tracer import DummyWriter + + +def test_template(): + # trace and ensure it works + writer = DummyWriter() + tracer = Tracer(writer=writer) + assert not writer.pop() + patch_template(tracer) + + # setup a test template + params = { + 'DIRS': [], + 'APP_DIRS': True, + 'NAME': 'foo', + 'OPTIONS': {}, + } + engine = TemplateStrings(params) + engine.debug = False + engine.template_libraries = None + engine.template_builtins = None + + t = template.Template("hello {{name}}", engine=engine) + c = template.Context({'name':'matt'}) + + start = time.time() + eq_(t.render(c), 'hello matt') + end = time.time() + + spans = writer.pop() + assert spans, spans + eq_(len(spans), 1) + + span = spans[0] + eq_(span.span_type, 'template') + eq_(span.name, 'django.template') + eq_(span.get_tag('django.template_name'), 'unknown') + assert start < span.start < span.start + span.duration < end +