You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

59 lines
1.7 KiB

import logging
from odoo.http import WebRequest
from odoo import http
from odoo.sql_db import Cursor
from .models.profiler_profile import ProfilerProfile
_logger = logging.getLogger(__name__)
def patch_web_request_call_function():
"""Modify Odoo entry points so that profile can record.
Odoo is a multi-threaded program. Therefore, the :data:`profile` object
needs to be enabled/disabled each in each thread to capture all the
execution.
For instance, Odoo spawns a new thread for each request.
"""
_logger.info('Patching http.WebRequest._call_function')
webreq_f_origin = WebRequest._call_function
def webreq_f(*args, **kwargs):
with ProfilerProfile.profiling():
return webreq_f_origin(*args, **kwargs)
WebRequest._call_function = webreq_f
def patch_cursor_init():
_logger.info('Patching sql_dp.Cursor.__init__')
cursor_f_origin = Cursor.__init__
def init_f(self, *args, **kwargs):
cursor_f_origin(self, *args, **kwargs)
enable = ProfilerProfile.activate_deactivate_pglogs
if enable is not None:
self._obj.execute('SET log_min_duration_statement TO "%s"' %
((not enable) * -1,))
Cursor.__init__ = init_f
def patch_dispatch_rpc():
_logger.info('Patching Dispatch RPC http.dispatch_rpc')
dispatch_rpc = http.dispatch_rpc
def dispatch_rpc_f(service_name, method, params):
with ProfilerProfile.profiling():
return dispatch_rpc(service_name, method, params)
http.dispatch_rpc = dispatch_rpc_f
def post_load():
patch_web_request_call_function()
patch_cursor_init()
patch_dispatch_rpc()