2222
2323class 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+
172186def _patch_render (tracer ):
173187 """ patch flask's render template methods with the given tracer. """
174188 # fall back to patching global method
0 commit comments