/
profiling.py
53 lines (39 loc) · 1.52 KB
/
profiling.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import time
from sqlalchemy import event
from sqlalchemy.engine import Engine
from flask import request, has_request_context
_TOTAL_HEADER_NAME = "X-Timing-Total"
_ACTIVE_HEADER_NAME = "X-Timing-Active"
_DB_HEADER_NAME = "X-Timing-DB"
_API_ENDPOINT_HEADER_NAME = "X-API-Endpoint"
import time
import logging
logging.basicConfig()
logger = logging.getLogger("myapp.sqltime")
logger.setLevel(logging.DEBUG)
@event.listens_for(Engine, "before_cursor_execute")
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
if not has_request_context():
return
profile_data = request.profile_data
profile_data[_DB_HEADER_NAME] -= time.perf_counter()
@event.listens_for(Engine, "after_cursor_execute")
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
if not has_request_context():
return
profile_data = request.profile_data
profile_data[_DB_HEADER_NAME] += time.perf_counter()
def profile_request_start():
request.profile_data = {
_TOTAL_HEADER_NAME: -time.perf_counter(),
_ACTIVE_HEADER_NAME: -time.process_time(),
_DB_HEADER_NAME: 0,
}
def profile_request_end(response):
profile_data = request.profile_data
profile_data[_TOTAL_HEADER_NAME] += time.perf_counter()
profile_data[_ACTIVE_HEADER_NAME] += time.process_time()
profile_data[_DB_HEADER_NAME] += 0
profile_data[_API_ENDPOINT_HEADER_NAME] = f"{request.endpoint}:{request.method}"
response.headers.extend(profile_data)
return response