@@ -19,11 +19,11 @@ class TimerPanel(Panel):
1919
2020 def nav_subtitle (self ):
2121 stats = self .get_stats ()
22- if hasattr ( self , "_start_rusage " ):
23- utime = self . _end_rusage . ru_utime - self . _start_rusage . ru_utime
24- stime = self . _end_rusage . ru_stime - self . _start_rusage . ru_stime
22+ if stats . get ( "utime " ):
23+ utime = stats . get ( "utime" )
24+ stime = stats . get ( "stime" )
2525 return _ ("CPU: %(cum)0.2fms (%(total)0.2fms)" ) % {
26- "cum" : (utime + stime ) * 1000.0 ,
26+ "cum" : (utime + stime ),
2727 "total" : stats ["total_time" ],
2828 }
2929 elif "total_time" in stats :
@@ -64,27 +64,44 @@ def process_request(self, request):
6464 self ._start_rusage = resource .getrusage (resource .RUSAGE_SELF )
6565 return super ().process_request (request )
6666
67+ def serialize_rusage (self , data ):
68+ fields_to_serialize = [
69+ "ru_utime" ,
70+ "ru_stime" ,
71+ "ru_nvcsw" ,
72+ "ru_nivcsw" ,
73+ "ru_minflt" ,
74+ "ru_majflt" ,
75+ ]
76+ return {field : getattr (data , field ) for field in fields_to_serialize }
77+
6778 def generate_stats (self , request , response ):
6879 stats = {}
6980 if hasattr (self , "_start_time" ):
7081 stats ["total_time" ] = (perf_counter () - self ._start_time ) * 1000
71- if hasattr ( self , "_start_rusage" ) :
82+ if self . has_content :
7283 self ._end_rusage = resource .getrusage (resource .RUSAGE_SELF )
73- stats ["utime" ] = 1000 * self ._elapsed_ru ("ru_utime" )
74- stats ["stime" ] = 1000 * self ._elapsed_ru ("ru_stime" )
84+ start = self .serialize_rusage (self ._start_rusage )
85+ end = self .serialize_rusage (self ._end_rusage )
86+ stats .update (
87+ {
88+ "utime" : 1000 * self ._elapsed_ru (start , end , "ru_utime" ),
89+ "stime" : 1000 * self ._elapsed_ru (start , end , "ru_stime" ),
90+ "vcsw" : self ._elapsed_ru (start , end , "ru_nvcsw" ),
91+ "ivcsw" : self ._elapsed_ru (start , end , "ru_nivcsw" ),
92+ "minflt" : self ._elapsed_ru (start , end , "ru_minflt" ),
93+ "majflt" : self ._elapsed_ru (start , end , "ru_majflt" ),
94+ }
95+ )
7596 stats ["total" ] = stats ["utime" ] + stats ["stime" ]
76- stats ["vcsw" ] = self ._elapsed_ru ("ru_nvcsw" )
77- stats ["ivcsw" ] = self ._elapsed_ru ("ru_nivcsw" )
78- stats ["minflt" ] = self ._elapsed_ru ("ru_minflt" )
79- stats ["majflt" ] = self ._elapsed_ru ("ru_majflt" )
8097 # these are documented as not meaningful under Linux. If you're
8198 # running BSD feel free to enable them, and add any others that I
8299 # hadn't gotten to before I noticed that I was getting nothing but
83100 # zeroes and that the docs agreed. :-(
84101 #
85- # stats['blkin'] = self._elapsed_ru('ru_inblock')
86- # stats['blkout'] = self._elapsed_ru('ru_oublock')
87- # stats['swap'] = self._elapsed_ru('ru_nswap')
102+ # stats['blkin'] = self._elapsed_ru(start, end, 'ru_inblock')
103+ # stats['blkout'] = self._elapsed_ru(start, end, 'ru_oublock')
104+ # stats['swap'] = self._elapsed_ru(start, end, 'ru_nswap')
88105 # stats['rss'] = self._end_rusage.ru_maxrss
89106 # stats['srss'] = self._end_rusage.ru_ixrss
90107 # stats['urss'] = self._end_rusage.ru_idrss
@@ -102,5 +119,6 @@ def generate_server_timing(self, request, response):
102119 "total_time" , "Elapsed time" , stats .get ("total_time" , 0 )
103120 )
104121
105- def _elapsed_ru (self , name ):
106- return getattr (self ._end_rusage , name ) - getattr (self ._start_rusage , name )
122+ @staticmethod
123+ def _elapsed_ru (start , end , name ):
124+ return end .get (name ) - start .get (name )
0 commit comments