Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit d7c2df2

Browse files
authored
Improve per-block CPU and DB usage metrics (#7426)
1 parent 4162c39 commit d7c2df2

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

changelog.d/7426.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Clean up some LoggingContext code.

synapse/logging/context.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

526540
class LoggingContextFilter(logging.Filter):

0 commit comments

Comments
 (0)