summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/classes/toaster.bbclass70
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