diff options
-rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 64 | ||||
-rw-r--r-- | bitbake/lib/bb/ui/toasterui.py | 2 |
2 files changed, 21 insertions, 45 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index b2e21ef2a6..fef849d9a0 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
@@ -319,23 +319,16 @@ class BuildInfoHelper(object): | |||
319 | assert False | 319 | assert False |
320 | return None | 320 | return None |
321 | 321 | ||
322 | def _get_recipe_information_from_build_event(self, event): | 322 | def _get_recipe_information_from_taskfile(self, taskfile): |
323 | 323 | ||
324 | layer_version_obj = self._get_layer_version_for_path(re.split(':', event.taskfile)[-1]) | 324 | layer_version_obj = self._get_layer_version_for_path(re.split(':', taskfile)[-1]) |
325 | 325 | ||
326 | recipe_info = {} | 326 | recipe_info = {} |
327 | recipe_info['layer_version'] = layer_version_obj | 327 | recipe_info['layer_version'] = layer_version_obj |
328 | recipe_info['file_path'] = re.split(':', event.taskfile)[-1] | 328 | recipe_info['file_path'] = re.split(':', taskfile)[-1] |
329 | 329 | ||
330 | return recipe_info | 330 | return recipe_info |
331 | 331 | ||
332 | def _get_task_build_stats(self, task_object): | ||
333 | bs_path = self._get_path_information(task_object) | ||
334 | for bp in bs_path: # TODO: split for each target | ||
335 | task_build_stats = self._get_build_stats_from_file(bp, task_object.task_name) | ||
336 | |||
337 | return task_build_stats | ||
338 | |||
339 | def _get_path_information(self, task_object): | 332 | def _get_path_information(self, task_object): |
340 | build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/" | 333 | build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/" |
341 | build_stats_path = [] | 334 | build_stats_path = [] |
@@ -356,36 +349,6 @@ class BuildInfoHelper(object): | |||
356 | 349 | ||
357 | return build_stats_path | 350 | return build_stats_path |
358 | 351 | ||
359 | def _get_build_stats_from_file(self, bs_path, task_name): | ||
360 | |||
361 | task_bs_filename = str(bs_path) + str(task_name) | ||
362 | task_bs = open(task_bs_filename, 'r') | ||
363 | |||
364 | cpu_usage = 0 | ||
365 | disk_io = 0 | ||
366 | startio = '' | ||
367 | endio = '' | ||
368 | |||
369 | for line in task_bs.readlines(): | ||
370 | if line.startswith('CPU usage: '): | ||
371 | cpu_usage = line[11:] | ||
372 | elif line.startswith('EndTimeIO: '): | ||
373 | endio = line[11:] | ||
374 | elif line.startswith('StartTimeIO: '): | ||
375 | startio = line[13:] | ||
376 | |||
377 | task_bs.close() | ||
378 | |||
379 | if startio and endio: | ||
380 | disk_io = int(endio.strip('\n ')) - int(startio.strip('\n ')) | ||
381 | |||
382 | if cpu_usage: | ||
383 | cpu_usage = float(cpu_usage.strip('% \n')) | ||
384 | |||
385 | task_build_stats = {'cpu_usage': cpu_usage, 'disk_io': disk_io} | ||
386 | |||
387 | return task_build_stats | ||
388 | |||
389 | def _remove_redundant(self, string): | 352 | def _remove_redundant(self, string): |
390 | ret = [] | 353 | ret = [] |
391 | for i in string.split(): | 354 | for i in string.split(): |
@@ -435,7 +398,7 @@ class BuildInfoHelper(object): | |||
435 | def store_started_task(self, event): | 398 | def store_started_task(self, event): |
436 | identifier = event.taskfile + event.taskname | 399 | identifier = event.taskfile + event.taskname |
437 | 400 | ||
438 | recipe_information = self._get_recipe_information_from_build_event(event) | 401 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) |
439 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) | 402 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) |
440 | 403 | ||
441 | task_information = self._get_task_information(event, recipe) | 404 | task_information = self._get_task_information(event, recipe) |
@@ -458,9 +421,23 @@ class BuildInfoHelper(object): | |||
458 | 421 | ||
459 | self.internal_state[identifier] = {'start_time': datetime.datetime.now()} | 422 | self.internal_state[identifier] = {'start_time': datetime.datetime.now()} |
460 | 423 | ||
424 | |||
425 | def store_tasks_stats(self, event): | ||
426 | for (taskfile, taskname, taskstats) in event.data: | ||
427 | recipe_information = self._get_recipe_information_from_taskfile(taskfile) | ||
428 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) | ||
429 | |||
430 | task_information = {} | ||
431 | task_information['build'] = self.internal_state['build'] | ||
432 | task_information['recipe'] = recipe | ||
433 | task_information['task_name'] = taskname | ||
434 | task_information['cpu_usage'] = taskstats['cpu_usage'] | ||
435 | task_information['disk_io'] = taskstats['disk_io'] | ||
436 | task_obj = self.orm_wrapper.get_update_task_object(task_information) | ||
437 | |||
461 | def update_and_store_task(self, event): | 438 | def update_and_store_task(self, event): |
462 | identifier = event.taskfile + event.taskname | 439 | identifier = event.taskfile + event.taskname |
463 | recipe_information = self._get_recipe_information_from_build_event(event) | 440 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) |
464 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) | 441 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) |
465 | task_information = self._get_task_information(event,recipe) | 442 | task_information = self._get_task_information(event,recipe) |
466 | try: | 443 | try: |
@@ -483,9 +460,6 @@ class BuildInfoHelper(object): | |||
483 | 460 | ||
484 | if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)): | 461 | if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)): |
485 | task_information['outcome'] = Task.OUTCOME_SUCCESS | 462 | task_information['outcome'] = Task.OUTCOME_SUCCESS |
486 | task_build_stats = self._get_task_build_stats(self.orm_wrapper.get_update_task_object(task_information)) | ||
487 | task_information['cpu_usage'] = task_build_stats['cpu_usage'] | ||
488 | task_information['disk_io'] = task_build_stats['disk_io'] | ||
489 | del self.internal_state[identifier] | 463 | del self.internal_state[identifier] |
490 | 464 | ||
491 | if isinstance(event, (bb.runqueue.runQueueTaskFailed, bb.runqueue.sceneQueueTaskFailed)): | 465 | if isinstance(event, (bb.runqueue.runQueueTaskFailed, bb.runqueue.sceneQueueTaskFailed)): |
diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py index 50493e7b0d..318fc28adb 100644 --- a/bitbake/lib/bb/ui/toasterui.py +++ b/bitbake/lib/bb/ui/toasterui.py | |||
@@ -238,6 +238,8 @@ def main(server, eventHandler, params ): | |||
238 | buildinfohelper.store_build_package_information(event) | 238 | buildinfohelper.store_build_package_information(event) |
239 | if event.type == "LayerInfo": | 239 | if event.type == "LayerInfo": |
240 | buildinfohelper.store_layer_info(event) | 240 | buildinfohelper.store_layer_info(event) |
241 | if event.type == "BuildStatsList": | ||
242 | buildinfohelper.store_tasks_stats(event) | ||
241 | continue | 243 | continue |
242 | 244 | ||
243 | # ignore | 245 | # ignore |