Skip to content

Commit c3a3627

Browse files
committed
Fix flask instrumentation not closing spans
The flask instrumentation was not closing spans if an exception happened during the rendering of a template for flask > 0.10
1 parent 6f5025c commit c3a3627

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

ddtrace/contrib/flask/middleware.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,7 @@ def __init__(self, app, tracer, service="flask", use_signals=True):
5959
self.app.before_request(self._before_request)
6060
self.app.after_request(self._after_request)
6161

62-
# Instrument template rendering. If it's flask >= 0.11, we can use
63-
# signals, Otherwise we have to patch a global method.
64-
template_signals = {
65-
'before_render_template': self._template_started, # added in 0.11
66-
'template_rendered': self._template_done
67-
}
68-
if self.use_signals and _signals_exist(template_signals):
69-
self._connect(template_signals)
70-
else:
71-
_patch_render(tracer)
62+
_patch_render(tracer)
7263

7364
def _flask_signals_exist(self, names):
7465
""" Return true if the current version of flask has all of the given
@@ -177,19 +168,6 @@ def _request_exception(self, *args, **kwargs):
177168
except Exception:
178169
self.app.logger.exception("error tracing error")
179170

180-
def _template_started(self, sender, template, *args, **kwargs):
181-
span = self._tracer.trace('flask.template')
182-
try:
183-
span.span_type = http.TEMPLATE
184-
span.set_tag("flask.template", template.name or "string")
185-
finally:
186-
g.flask_datadog_tmpl_span = span
187-
188-
def _template_done(self, *arg, **kwargs):
189-
span = getattr(g, 'flask_datadog_tmpl_span', None)
190-
if span:
191-
span.finish()
192-
193171

194172
def _patch_render(tracer):
195173
""" patch flask's render template methods with the given tracer. """

tests/contrib/flask/test_flask.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ def tmpl():
5959
def tmpl_err():
6060
return render_template('err.html')
6161

62+
@app.route('/tmpl/render_err')
63+
def tmpl_render_err():
64+
return render_template('render_err.html')
6265

6366
@app.route('/child')
6467
def child():
@@ -215,6 +218,36 @@ def test_template_err(self):
215218
eq_(s.meta.get(http.STATUS_CODE), '500')
216219
eq_(s.meta.get(http.METHOD), 'GET')
217220

221+
def test_template_render_err(self):
222+
tracer.debug_logging = True
223+
start = time.time()
224+
try:
225+
app.get('/tmpl/render_err')
226+
except Exception:
227+
pass
228+
else:
229+
assert 0
230+
end = time.time()
231+
232+
# ensure trace worked
233+
assert not tracer.current_span(), tracer.current_span().pprint()
234+
spans = writer.pop()
235+
eq_(len(spans), 2)
236+
by_name = {s.name:s for s in spans}
237+
s = by_name["flask.request"]
238+
eq_(s.service, service)
239+
eq_(s.resource, "tmpl_render_err")
240+
assert s.start >= start
241+
assert s.duration <= end - start
242+
eq_(s.error, 1)
243+
eq_(s.meta.get(http.STATUS_CODE), '500')
244+
eq_(s.meta.get(http.METHOD), 'GET')
245+
t = by_name["flask.template"]
246+
eq_(t.get_tag("flask.template"), "render_err.html")
247+
eq_(t.error, 1)
248+
eq_(t.parent_id, s.span_id)
249+
eq_(t.trace_id, s.trace_id)
250+
218251
def test_error(self):
219252
start = time.time()
220253
rv = app.get('/error')
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hello {{object.method()}}

0 commit comments

Comments
 (0)