diff options
| -rw-r--r-- | meta/classes/toaster.bbclass | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/meta/classes/toaster.bbclass b/meta/classes/toaster.bbclass index ec9b6c58b7..59c61c5cec 100644 --- a/meta/classes/toaster.bbclass +++ b/meta/classes/toaster.bbclass | |||
| @@ -153,6 +153,79 @@ python toaster_image_dumpdata() { | |||
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | 155 | ||
| 156 | |||
| 157 | # collect list of buildstats files based on fired events; when the build completes, collect all stats and fire an event with collected data | ||
| 158 | |||
| 159 | python toaster_collect_task_stats() { | ||
| 160 | import bb.build | ||
| 161 | import bb.event | ||
| 162 | import bb.data | ||
| 163 | import bb.utils | ||
| 164 | import os | ||
| 165 | |||
| 166 | def _append_read_list(v): | ||
| 167 | lock = bb.utils.lockfile(e.data.expand("${TOPDIR}/toaster.lock"), False, True) | ||
| 168 | |||
| 169 | with open(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist"), "a") as fout: | ||
| 170 | bn = get_bn(e) | ||
| 171 | bsdir = os.path.join(e.data.getVar('BUILDSTATS_BASE', True), bn) | ||
| 172 | taskdir = os.path.join(bsdir, e.data.expand("${PF}")) | ||
| 173 | fout.write("%s:%s:%s\n" % (e.taskfile, e.taskname, os.path.join(taskdir, e.task))) | ||
| 174 | |||
| 175 | bb.utils.unlockfile(lock) | ||
| 176 | |||
| 177 | def _read_stats(filename): | ||
| 178 | cpu_usage = 0 | ||
| 179 | disk_io = 0 | ||
| 180 | startio = '' | ||
| 181 | endio = '' | ||
| 182 | pn = '' | ||
| 183 | taskname = '' | ||
| 184 | statinfo = {} | ||
| 185 | |||
| 186 | with open(filename, 'r') as task_bs: | ||
| 187 | for line in task_bs.readlines(): | ||
| 188 | k,v = line.strip().split(": ", 1) | ||
| 189 | statinfo[k] = v | ||
| 190 | |||
| 191 | try: | ||
| 192 | cpu_usage = statinfo["CPU usage"] | ||
| 193 | endio = statinfo["EndTimeIO"] | ||
| 194 | startio = statinfo["StartTimeIO"] | ||
| 195 | except KeyError: | ||
| 196 | pass # we may have incomplete data here | ||
| 197 | |||
| 198 | if startio and endio: | ||
| 199 | disk_io = int(endio.strip('\n ')) - int(startio.strip('\n ')) | ||
| 200 | |||
| 201 | if cpu_usage: | ||
| 202 | cpu_usage = float(cpu_usage.strip('% \n')) | ||
| 203 | |||
| 204 | return {'cpu_usage': cpu_usage, 'disk_io': disk_io} | ||
| 205 | |||
| 206 | |||
| 207 | if isinstance(e, (bb.build.TaskSucceeded, bb.build.TaskFailed)): | ||
| 208 | _append_read_list(e) | ||
| 209 | pass | ||
| 210 | |||
| 211 | |||
| 212 | if isinstance(e, bb.event.BuildCompleted): | ||
| 213 | events = [] | ||
| 214 | with open(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist"), "r") as fin: | ||
| 215 | for line in fin: | ||
| 216 | (taskfile, taskname, filename) = line.strip().split(":") | ||
| 217 | events.append((taskfile, taskname, _read_stats(filename))) | ||
| 218 | bb.event.fire(bb.event.MetadataEvent("BuildStatsList", events), e.data) | ||
| 219 | os.unlink(os.path.join(e.data.getVar('BUILDSTATS_BASE', True), "toasterstatlist")) | ||
| 220 | } | ||
| 221 | |||
| 222 | |||
| 223 | # set event handlers | ||
| 224 | addhandler toaster_layerinfo_dumpdata | ||
| 225 | toaster_layerinfo_dumpdata[eventmask] = "bb.event.TreeDataPreparationCompleted" | ||
| 226 | |||
| 227 | addhandler toaster_collect_task_stats | ||
| 228 | toaster_collect_task_stats[eventmask] = "bb.event.BuildCompleted bb.build.TaskSucceeded bb.build.TaskFailed" | ||
| 156 | do_package[postfuncs] += "toaster_package_dumpdata " | 229 | do_package[postfuncs] += "toaster_package_dumpdata " |
| 157 | 230 | ||
| 158 | do_rootfs[postfuncs] += "toaster_image_dumpdata " | 231 | do_rootfs[postfuncs] += "toaster_image_dumpdata " |
