Skip to content

Commit 28b4f6b

Browse files
andor44LotharSee
authored andcommitted
Add automatic distributed tracing to Flask
1 parent 2f5ac8c commit 28b4f6b

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

ddtrace/contrib/flask/middleware.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@
2222

2323
class TraceMiddleware(object):
2424

25-
def __init__(self, app, tracer, service="flask", use_signals=True):
25+
def __init__(self, app, tracer, service="flask", use_signals=True, use_distributed_tracing=False):
2626
self.app = app
2727
self.app.logger.info("initializing trace middleware")
2828

2929
# save our traces.
3030
self._tracer = tracer
3131
self._service = service
32+
self._use_distributed_tracing = use_distributed_tracing
3233

3334
self._tracer.set_service_info(
3435
service=service,
@@ -85,13 +86,15 @@ def _connect(self, signal_to_handler):
8586

8687
# common methods
8788

88-
def _start_span(self):
89+
def _start_span(self, trace_id=None, parent_id=None):
8990
try:
9091
g.flask_datadog_span = self._tracer.trace(
9192
"flask.request",
9293
service=self._service,
9394
span_type=http.TYPE,
9495
)
96+
g.flask_datadog_span.trace_id = trace_id
97+
g.flask_datadog_span.span_id = parent_id
9598
except Exception:
9699
self.app.logger.exception("error tracing request")
97100

@@ -137,7 +140,10 @@ def _before_request(self):
137140
""" Starts tracing the current request and stores it in the global
138141
request object.
139142
"""
140-
self._start_span()
143+
if self._use_distributed_tracing:
144+
self._start_span(*_trace_context_from_request())
145+
else:
146+
self._start_span()
141147

142148
def _after_request(self, response):
143149
""" handles a successful response. """
@@ -151,7 +157,10 @@ def _after_request(self, response):
151157
# signal handling methods
152158

153159
def _request_started(self, sender):
154-
self._start_span()
160+
if self._use_distributed_tracing:
161+
self._start_span(*_trace_context_from_request())
162+
else:
163+
self._start_span()
155164

156165
def _request_finished(self, sender, response, **kwargs):
157166
try:
@@ -169,6 +178,11 @@ def _request_exception(self, *args, **kwargs):
169178
self.app.logger.exception("error tracing error")
170179

171180

181+
def _trace_context_from_request():
182+
return (request.headers.get('x-datadog-trace-id'),
183+
request.headers.get('x-datadog-parent-id'))
184+
185+
172186
def _patch_render(tracer):
173187
""" patch flask's render template methods with the given tracer. """
174188
# fall back to patching global method

0 commit comments

Comments
 (0)