diff options
-rw-r--r-- | meta/classes/toaster.bbclass | 70 |
1 files changed, 45 insertions, 25 deletions
diff --git a/meta/classes/toaster.bbclass b/meta/classes/toaster.bbclass index 51a4c74e5b..a17501e03e 100644 --- a/meta/classes/toaster.bbclass +++ b/meta/classes/toaster.bbclass | |||
@@ -202,25 +202,37 @@ python toaster_collect_task_stats() { | |||
202 | import bb.utils | 202 | import bb.utils |
203 | import os | 203 | import os |
204 | 204 | ||
205 | toaster_statlist_file = os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist") | ||
206 | |||
205 | if not e.data.getVar('BUILDSTATS_BASE', True): | 207 | if not e.data.getVar('BUILDSTATS_BASE', True): |
206 | return # if we don't have buildstats, we cannot collect stats | 208 | return # if we don't have buildstats, we cannot collect stats |
207 | 209 | ||
210 | def stat_to_float(value): | ||
211 | return float(value.strip('% \n\r')) | ||
212 | |||
208 | def _append_read_list(v): | 213 | def _append_read_list(v): |
209 | lock = bb.utils.lockfile(e.data.expand("${TOPDIR}/toaster.lock"), False, True) | 214 | lock = bb.utils.lockfile(e.data.expand("${TOPDIR}/toaster.lock"), False, True) |
210 | 215 | ||
211 | with open(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist"), "a") as fout: | 216 | with open(toaster_statlist_file, "a") as fout: |
212 | taskdir = e.data.expand("${BUILDSTATS_BASE}/${BUILDNAME}/${PF}") | 217 | taskdir = e.data.expand("${BUILDSTATS_BASE}/${BUILDNAME}/${PF}") |
213 | fout.write("%s::%s::%s::%s\n" % (e.taskfile, e.taskname, os.path.join(taskdir, e.task), e.data.expand("${PN}"))) | 218 | fout.write("%s::%s::%s::%s\n" % (e.taskfile, e.taskname, os.path.join(taskdir, e.task), e.data.expand("${PN}"))) |
214 | 219 | ||
215 | bb.utils.unlockfile(lock) | 220 | bb.utils.unlockfile(lock) |
216 | 221 | ||
217 | def _read_stats(filename): | 222 | def _read_stats(filename): |
218 | cpu_usage = 0 | 223 | # seconds |
219 | disk_io = 0 | 224 | cpu_time_user = 0 |
220 | started = '0' | 225 | cpu_time_system = 0 |
221 | ended = '0' | 226 | |
222 | pn = '' | 227 | # bytes |
228 | disk_io_read = 0 | ||
229 | disk_io_write = 0 | ||
230 | |||
231 | started = 0 | ||
232 | ended = 0 | ||
233 | |||
223 | taskname = '' | 234 | taskname = '' |
235 | |||
224 | statinfo = {} | 236 | statinfo = {} |
225 | 237 | ||
226 | with open(filename, 'r') as task_bs: | 238 | with open(filename, 'r') as task_bs: |
@@ -228,41 +240,49 @@ python toaster_collect_task_stats() { | |||
228 | k,v = line.strip().split(": ", 1) | 240 | k,v = line.strip().split(": ", 1) |
229 | statinfo[k] = v | 241 | statinfo[k] = v |
230 | 242 | ||
231 | if "CPU usage" in statinfo: | ||
232 | cpu_usage = str(statinfo["CPU usage"]).strip('% \n\r') | ||
233 | |||
234 | if "IO write_bytes" in statinfo: | ||
235 | disk_io = disk_io + int(statinfo["IO write_bytes"].strip('% \n\r')) | ||
236 | |||
237 | if "IO read_bytes" in statinfo: | ||
238 | disk_io = disk_io + int(statinfo["IO read_bytes"].strip('% \n\r')) | ||
239 | |||
240 | if "Started" in statinfo: | 243 | if "Started" in statinfo: |
241 | started = str(statinfo["Started"]).strip('% \n\r') | 244 | started = stat_to_float(statinfo["Started"]) |
242 | 245 | ||
243 | if "Ended" in statinfo: | 246 | if "Ended" in statinfo: |
244 | ended = str(statinfo["Ended"]).strip('% \n\r') | 247 | ended = stat_to_float(statinfo["Ended"]) |
245 | 248 | ||
246 | elapsed_time = float(ended) - float(started) | 249 | if "Child rusage ru_utime" in statinfo: |
250 | cpu_time_user = cpu_time_user + stat_to_float(statinfo["Child rusage ru_utime"]) | ||
247 | 251 | ||
248 | cpu_usage = float(cpu_usage) | 252 | if "Child rusage ru_stime" in statinfo: |
253 | cpu_time_system = cpu_time_system + stat_to_float(statinfo["Child rusage ru_stime"]) | ||
249 | 254 | ||
250 | return {'cpu_usage': cpu_usage, 'disk_io': disk_io, 'elapsed_time': elapsed_time} | 255 | if "IO write_bytes" in statinfo: |
256 | write_bytes = int(statinfo["IO write_bytes"].strip('% \n\r')) | ||
257 | disk_io_write = disk_io_write + write_bytes | ||
251 | 258 | ||
259 | if "IO read_bytes" in statinfo: | ||
260 | read_bytes = int(statinfo["IO read_bytes"].strip('% \n\r')) | ||
261 | disk_io_read = disk_io_read + read_bytes | ||
262 | |||
263 | return { | ||
264 | 'stat_file': filename, | ||
265 | 'cpu_time_user': cpu_time_user, | ||
266 | 'cpu_time_system': cpu_time_system, | ||
267 | 'disk_io_read': disk_io_read, | ||
268 | 'disk_io_write': disk_io_write, | ||
269 | 'started': started, | ||
270 | 'ended': ended | ||
271 | } | ||
252 | 272 | ||
253 | if isinstance(e, (bb.build.TaskSucceeded, bb.build.TaskFailed)): | 273 | if isinstance(e, (bb.build.TaskSucceeded, bb.build.TaskFailed)): |
254 | _append_read_list(e) | 274 | _append_read_list(e) |
255 | pass | 275 | pass |
256 | 276 | ||
257 | 277 | if isinstance(e, bb.event.BuildCompleted) and os.path.exists(toaster_statlist_file): | |
258 | if isinstance(e, bb.event.BuildCompleted) and os.path.exists(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist")): | ||
259 | events = [] | 278 | events = [] |
260 | with open(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist"), "r") as fin: | 279 | with open(toaster_statlist_file, "r") as fin: |
261 | for line in fin: | 280 | for line in fin: |
262 | (taskfile, taskname, filename, recipename) = line.strip().split("::") | 281 | (taskfile, taskname, filename, recipename) = line.strip().split("::") |
263 | events.append((taskfile, taskname, _read_stats(filename), recipename)) | 282 | stats = _read_stats(filename) |
283 | events.append((taskfile, taskname, stats, recipename)) | ||
264 | bb.event.fire(bb.event.MetadataEvent("BuildStatsList", events), e.data) | 284 | bb.event.fire(bb.event.MetadataEvent("BuildStatsList", events), e.data) |
265 | os.unlink(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist")) | 285 | os.unlink(toaster_statlist_file) |
266 | } | 286 | } |
267 | 287 | ||
268 | # dump relevant build history data as an event when the build is completed | 288 | # dump relevant build history data as an event when the build is completed |