Files
2020-04-08 10:39:44 -07:00

59 lines
1.8 KiB
Python

import ddtrace
import tornado
from ddtrace.vendor.wrapt import wrap_function_wrapper as _w
from . import handlers, application, decorators, template, compat, context_provider
from ...utils.wrappers import unwrap as _u
def patch():
"""
Tracing function that patches the Tornado web application so that it will be
traced using the given ``tracer``.
"""
# patch only once
if getattr(tornado, '__datadog_patch', False):
return
setattr(tornado, '__datadog_patch', True)
# patch Application to initialize properly our settings and tracer
_w('tornado.web', 'Application.__init__', application.tracer_config)
# patch RequestHandler to trace all Tornado handlers
_w('tornado.web', 'RequestHandler._execute', handlers.execute)
_w('tornado.web', 'RequestHandler.on_finish', handlers.on_finish)
_w('tornado.web', 'RequestHandler.log_exception', handlers.log_exception)
# patch Template system
_w('tornado.template', 'Template.generate', template.generate)
# patch Python Futures if available when an Executor pool is used
compat.wrap_futures()
# configure the global tracer
ddtrace.tracer.configure(
context_provider=context_provider,
wrap_executor=decorators.wrap_executor,
)
def unpatch():
"""
Remove all tracing functions in a Tornado web application.
"""
if not getattr(tornado, '__datadog_patch', False):
return
setattr(tornado, '__datadog_patch', False)
# unpatch Tornado
_u(tornado.web.RequestHandler, '_execute')
_u(tornado.web.RequestHandler, 'on_finish')
_u(tornado.web.RequestHandler, 'log_exception')
_u(tornado.web.Application, '__init__')
_u(tornado.concurrent, 'run_on_executor')
_u(tornado.template.Template, 'generate')
# unpatch `futures`
compat.unwrap_futures()