From c5ea51bfdd7ae4f40ddbe03a8e7da368c00fea38 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Thu, 18 Sep 2025 12:34:41 +0300 Subject: [PATCH 1/2] fix: system stats calculation and prevent runtime errors --- src/ci/cpu-usage-over-time.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/ci/cpu-usage-over-time.py b/src/ci/cpu-usage-over-time.py index 19a39f349532c..b444b0aaeb5b6 100755 --- a/src/ci/cpu-usage-over-time.py +++ b/src/ci/cpu-usage-over-time.py @@ -48,6 +48,8 @@ def __init__(self): data = file.readline().split() if data[0] != "cpu": raise Exception('did not start with "cpu"') + if len(data) < 11: + raise Exception("Unexpected /proc/stat format") self.user = int(data[1]) self.nice = int(data[2]) self.system = int(data[3]) @@ -82,11 +84,11 @@ def idle_since(self, prev): + guest + guest_nice ) - return float(idle) / float(total) * 100 + return float(idle) / total * 100 if total != 0 else 0.0 elif sys.platform == "win32": from ctypes.wintypes import DWORD - from ctypes import Structure, windll, WinError, GetLastError, byref + from ctypes import Structure, windll, WinError, byref class FILETIME(Structure): _fields_ = [ @@ -104,7 +106,8 @@ def __init__(self): byref(user), ) - assert success, WinError(GetLastError())[1] + if not success: + raise WinError() self.idle = (idle.dwHighDateTime << 32) | idle.dwLowDateTime self.kernel = (kernel.dwHighDateTime << 32) | kernel.dwLowDateTime @@ -114,7 +117,7 @@ def idle_since(self, prev): idle = self.idle - prev.idle user = self.user - prev.user kernel = self.kernel - prev.kernel - return float(idle) / float(user + kernel) * 100 + return float(idle) / float(user + kernel - idle) * 100 if (user + kernel - idle) != 0 else 0.0 elif sys.platform == "darwin": from ctypes import * @@ -159,7 +162,8 @@ def idle_since(self, prev): system = self.system - prev.system idle = self.idle - prev.idle nice = self.nice - prev.nice - return float(idle) / float(user + system + idle + nice) * 100.0 + total = user + system + idle + nice + return float(idle) / total * 100 if total != 0 else 0.0 else: print("unknown platform", sys.platform) @@ -170,7 +174,7 @@ def idle_since(self, prev): while True: time.sleep(1) next_state = State() - now = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None).isoformat() + now = datetime.datetime.now(datetime.timezone.utc).isoformat() idle = next_state.idle_since(cur_state) print("%s,%s" % (now, idle)) sys.stdout.flush() From f8e0b4713fd9d07e2d9014ee68d707a4ee37af26 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:37:38 +0300 Subject: [PATCH 2/2] Update cpu-usage-over-time.py --- src/ci/cpu-usage-over-time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ci/cpu-usage-over-time.py b/src/ci/cpu-usage-over-time.py index b444b0aaeb5b6..80c0df018b82a 100755 --- a/src/ci/cpu-usage-over-time.py +++ b/src/ci/cpu-usage-over-time.py @@ -117,7 +117,7 @@ def idle_since(self, prev): idle = self.idle - prev.idle user = self.user - prev.user kernel = self.kernel - prev.kernel - return float(idle) / float(user + kernel - idle) * 100 if (user + kernel - idle) != 0 else 0.0 + return float(idle) / float(user + kernel - idle) * 100 if user + kernel - idle != 0 else 0.0 elif sys.platform == "darwin": from ctypes import *