55# author : ly_13
66# date : 6/29/2023
77import logging
8+ import re
9+ from collections import defaultdict
810
911from celery import signature
1012from celery .signals import worker_ready , worker_shutdown , after_setup_logger
13+ from django .conf import settings
1114from django .core .cache import cache
12- from django .db .models .signals import pre_delete
15+ from django .core .signals import request_finished
16+ from django .db import connection
17+ from django .db .models .signals import pre_delete , pre_save
1318from django .dispatch import receiver
1419from django_celery_beat .models import PeriodicTask
1520from django_celery_results .models import TaskResult
1924from common .celery .logger import CeleryThreadTaskFileHandler
2025from common .celery .utils import get_celery_task_log_path
2126from common .utils import get_logger
27+ from server .utils import get_current_request
2228
2329logger = get_logger (__name__ )
2430safe_str = lambda x : x
2531
32+ pattern = re .compile (r'FROM `(\w+)`' )
33+
2634
2735@worker_ready .connect
2836def on_app_ready (sender = None , headers = None , ** kwargs ):
@@ -61,7 +69,6 @@ def delete_file_handler(sender, **kwargs):
6169 log_path = get_celery_task_log_path (task_id )
6270 remove_file (log_path )
6371
64-
6572@after_setup_logger .connect
6673def on_after_setup_logger (sender = None , logger = None , loglevel = None , format = None , ** kwargs ):
6774 if not logger :
@@ -71,3 +78,82 @@ def on_after_setup_logger(sender=None, logger=None, loglevel=None, format=None,
7178 formatter = logging .Formatter (format )
7279 task_handler .setFormatter (formatter )
7380 logger .addHandler (task_handler )
81+
82+
83+ class Counter :
84+ def __init__ (self ):
85+ self .counter = 0
86+ self .time = 0
87+
88+ def __gt__ (self , other ):
89+ return self .counter > other .counter
90+
91+ def __lt__ (self , other ):
92+ return self .counter < other .counter
93+
94+ def __eq__ (self , other ):
95+ return self .counter == other .counter
96+
97+
98+ def on_request_finished_logging_db_query (sender , ** kwargs ):
99+ queries = connection .queries
100+ counters = defaultdict (Counter )
101+ table_queries = defaultdict (list )
102+ for query in queries :
103+ if not query ['sql' ] or not query ['sql' ].startswith ('SELECT' ):
104+ continue
105+ tables = pattern .findall (query ['sql' ])
106+ table_name = '' .join (tables )
107+ time = query ['time' ]
108+ counters [table_name ].counter += 1
109+ counters [table_name ].time += float (time )
110+ counters ['total' ].counter += 1
111+ counters ['total' ].time += float (time )
112+ table_queries [table_name ].append (query )
113+
114+ counters = sorted (counters .items (), key = lambda x : x [1 ])
115+ if not counters :
116+ return
117+
118+ method = 'GET'
119+ path = '/Unknown'
120+ current_request = get_current_request ()
121+ if current_request :
122+ method = current_request .method
123+ path = current_request .get_full_path ()
124+
125+ print (">>>. [{}] {}" .format (method , path ))
126+
127+ for name , counter in counters :
128+ logger .debug ("Query {:3} times using {:.2f}s {}" .format (
129+ counter .counter , counter .time , name )
130+ )
131+
132+
133+ def _get_request_user ():
134+ current_request = get_current_request ()
135+ if current_request and current_request .user and current_request .user .is_authenticated :
136+ return current_request .user
137+
138+
139+ @receiver (pre_save )
140+ def on_create_set_creator (sender , instance = None , ** kwargs ):
141+ if getattr (instance , '_ignore_auto_creator' , False ):
142+ return
143+ if not hasattr (instance , 'creator' ) or instance .creator :
144+ return
145+ instance .creator = _get_request_user ()
146+ if hasattr (instance , 'dept_belong' ) and instance .creator :
147+ instance .dept_belong = instance .creator .dept
148+
149+
150+ @receiver (pre_save )
151+ def on_update_set_modifier (sender , instance = None , created = False , ** kwargs ):
152+ if getattr (instance , '_ignore_auto_modifier' , False ):
153+ return
154+ if hasattr (instance , 'modifier' ):
155+ instance .modifier = _get_request_user ()
156+
157+
158+ if settings .DEBUG_DEV :
159+ request_finished .connect (on_request_finished_logging_db_query )
0 commit comments