@@ -431,15 +431,7 @@ def stop(self, rusage: "Optional[resource._RUsage]") -> None:
431431 return
432432
433433 utime_delta , stime_delta = self ._get_cputime (rusage )
434- self ._resource_usage .ru_utime += utime_delta
435- self ._resource_usage .ru_stime += stime_delta
436-
437- # if we have a parent, pass our CPU usage stats on
438- if self .parent_context :
439- self .parent_context ._resource_usage += self ._resource_usage
440-
441- # reset them in case we get entered again
442- self ._resource_usage .reset ()
434+ self .add_cputime (utime_delta , stime_delta )
443435 finally :
444436 self .usage_start = None
445437
@@ -497,30 +489,52 @@ def _get_cputime(self, current: "resource._RUsage") -> Tuple[float, float]:
497489
498490 return utime_delta , stime_delta
499491
492+ def add_cputime (self , utime_delta : float , stime_delta : float ) -> None :
493+ """Update the CPU time usage of this context (and any parents, recursively).
494+
495+ Args:
496+ utime_delta: additional user time, in seconds, spent in this context.
497+ stime_delta: additional system time, in seconds, spent in this context.
498+ """
499+ self ._resource_usage .ru_utime += utime_delta
500+ self ._resource_usage .ru_stime += stime_delta
501+ if self .parent_context :
502+ self .parent_context .add_cputime (utime_delta , stime_delta )
503+
500504 def add_database_transaction (self , duration_sec : float ) -> None :
505+ """Record the use of a database transaction and the length of time it took.
506+
507+ Args:
508+ duration_sec: The number of seconds the database transaction took.
509+ """
501510 if duration_sec < 0 :
502511 raise ValueError ("DB txn time can only be non-negative" )
503512 self ._resource_usage .db_txn_count += 1
504513 self ._resource_usage .db_txn_duration_sec += duration_sec
514+ if self .parent_context :
515+ self .parent_context .add_database_transaction (duration_sec )
505516
506517 def add_database_scheduled (self , sched_sec : float ) -> None :
507518 """Record a use of the database pool
508519
509520 Args:
510- sched_sec (float): number of seconds it took us to get a
511- connection
521+ sched_sec: number of seconds it took us to get a connection
512522 """
513523 if sched_sec < 0 :
514524 raise ValueError ("DB scheduling time can only be non-negative" )
515525 self ._resource_usage .db_sched_duration_sec += sched_sec
526+ if self .parent_context :
527+ self .parent_context .add_database_scheduled (sched_sec )
516528
517529 def record_event_fetch (self , event_count : int ) -> None :
518530 """Record a number of events being fetched from the db
519531
520532 Args:
521- event_count (int) : number of events being fetched
533+ event_count: number of events being fetched
522534 """
523535 self ._resource_usage .evt_db_fetch_count += event_count
536+ if self .parent_context :
537+ self .parent_context .record_event_fetch (event_count )
524538
525539
526540class LoggingContextFilter (logging .Filter ):
0 commit comments