Sanity-checking for metrics updates
Check that our clocks go forward.
1 files changed, 33 insertions, 7 deletions
diff --git a/synapse/util/logcontext.py b/synapse/util/logcontext.py
index fe412355d8..645d71282e 100644
--- a/synapse/util/logcontext.py
+++ b/synapse/util/logcontext.py
@@ -325,10 +325,9 @@ class LoggingContext(object):
)
return
- usage_end = get_thread_resource_usage()
-
- self._resource_usage.ru_utime += usage_end.ru_utime - self.usage_start.ru_utime
- self._resource_usage.ru_stime += usage_end.ru_stime - self.usage_start.ru_stime
+ utime_delta, stime_delta = self._get_cputime()
+ self._resource_usage.ru_utime += utime_delta
+ self._resource_usage.ru_stime += stime_delta
self.usage_start = None
@@ -346,13 +345,38 @@ class LoggingContext(object):
# can include resource usage so far.
is_main_thread = threading.current_thread() is self.main_thread
if self.alive and self.usage_start and is_main_thread:
- current = get_thread_resource_usage()
- res.ru_utime += current.ru_utime - self.usage_start.ru_utime
- res.ru_stime += current.ru_stime - self.usage_start.ru_stime
+ utime_delta, stime_delta = self._get_cputime()
+ res.ru_utime += utime_delta
+ res.ru_stime += stime_delta
return res
+ def _get_cputime(self):
+ """Get the cpu usage time so far
+
+ Returns: Tuple[float, float]: seconds in user mode, seconds in system mode
+ """
+ current = get_thread_resource_usage()
+
+ utime_delta = current.ru_utime - self.usage_start.ru_utime
+ stime_delta = current.ru_stime - self.usage_start.ru_stime
+
+ # sanity check
+ if utime_delta < 0:
+ raise ValueError("utime went backwards! %f < %f" % (
+ current.ru_utime, self.usage_start.ru_utime,
+ ))
+
+ if stime_delta < 0:
+ raise ValueError("stime went backwards! %f < %f" % (
+ current.ru_stime, self.usage_start.ru_stime,
+ ))
+
+ return utime_delta, stime_delta
+
def add_database_transaction(self, duration_sec):
+ if duration_sec < 0:
+ raise ValueError('DB txn time can only be non-negative')
self._resource_usage.db_txn_count += 1
self._resource_usage.db_txn_duration_sec += duration_sec
@@ -363,6 +387,8 @@ class LoggingContext(object):
sched_sec (float): number of seconds it took us to get a
connection
"""
+ if sched_sec < 0:
+ raise ValueError('DB scheduling time can only be non-negative')
self._resource_usage.db_sched_duration_sec += sched_sec
def record_event_fetch(self, event_count):
|