Skip to content

Commit c5ea51b

Browse files
authored
fix: system stats calculation and prevent runtime errors
1 parent 4793ef5 commit c5ea51b

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/ci/cpu-usage-over-time.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ def __init__(self):
4848
data = file.readline().split()
4949
if data[0] != "cpu":
5050
raise Exception('did not start with "cpu"')
51+
if len(data) < 11:
52+
raise Exception("Unexpected /proc/stat format")
5153
self.user = int(data[1])
5254
self.nice = int(data[2])
5355
self.system = int(data[3])
@@ -82,11 +84,11 @@ def idle_since(self, prev):
8284
+ guest
8385
+ guest_nice
8486
)
85-
return float(idle) / float(total) * 100
87+
return float(idle) / total * 100 if total != 0 else 0.0
8688

8789
elif sys.platform == "win32":
8890
from ctypes.wintypes import DWORD
89-
from ctypes import Structure, windll, WinError, GetLastError, byref
91+
from ctypes import Structure, windll, WinError, byref
9092

9193
class FILETIME(Structure):
9294
_fields_ = [
@@ -104,7 +106,8 @@ def __init__(self):
104106
byref(user),
105107
)
106108

107-
assert success, WinError(GetLastError())[1]
109+
if not success:
110+
raise WinError()
108111

109112
self.idle = (idle.dwHighDateTime << 32) | idle.dwLowDateTime
110113
self.kernel = (kernel.dwHighDateTime << 32) | kernel.dwLowDateTime
@@ -114,7 +117,7 @@ def idle_since(self, prev):
114117
idle = self.idle - prev.idle
115118
user = self.user - prev.user
116119
kernel = self.kernel - prev.kernel
117-
return float(idle) / float(user + kernel) * 100
120+
return float(idle) / float(user + kernel - idle) * 100 if (user + kernel - idle) != 0 else 0.0
118121

119122
elif sys.platform == "darwin":
120123
from ctypes import *
@@ -159,7 +162,8 @@ def idle_since(self, prev):
159162
system = self.system - prev.system
160163
idle = self.idle - prev.idle
161164
nice = self.nice - prev.nice
162-
return float(idle) / float(user + system + idle + nice) * 100.0
165+
total = user + system + idle + nice
166+
return float(idle) / total * 100 if total != 0 else 0.0
163167

164168
else:
165169
print("unknown platform", sys.platform)
@@ -170,7 +174,7 @@ def idle_since(self, prev):
170174
while True:
171175
time.sleep(1)
172176
next_state = State()
173-
now = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None).isoformat()
177+
now = datetime.datetime.now(datetime.timezone.utc).isoformat()
174178
idle = next_state.idle_since(cur_state)
175179
print("%s,%s" % (now, idle))
176180
sys.stdout.flush()

0 commit comments

Comments
 (0)