X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/02825a88733a13a58775774053fb0945e9adf693..4cc70d306f608b6b7ca5076a6d066bb3e1c7bf2b:/apps/workbench/app/assets/javascripts/log_viewer.js diff --git a/apps/workbench/app/assets/javascripts/log_viewer.js b/apps/workbench/app/assets/javascripts/log_viewer.js index e8bbac604b..2e2fca2802 100644 --- a/apps/workbench/app/assets/javascripts/log_viewer.js +++ b/apps/workbench/app/assets/javascripts/log_viewer.js @@ -15,7 +15,13 @@ function addToLogViewer(logViewer, lines, taskState) { var message = v[12]; var type = ""; + var node = ""; + var slot = ""; if (v11 !== "") { + if (!taskState.hasOwnProperty(v11)) { + taskState[v11] = {}; + } + if (/^stderr /.test(message)) { message = message.substr(7); if (/^crunchstat: /.test(message)) { @@ -27,14 +33,40 @@ function addToLogViewer(logViewer, lines, taskState) { type = "task-output"; } } else { - if (/^success /.test(message)) { - taskState[v11] = "success"; + var m; + if (m = /^success in (\d+) second/.exec(message)) { + taskState[v11].outcome = "success"; + taskState[v11].runtime = Number(m[1]); + taskState.success_count += 1; + console.log(taskState[v11].runtime); } - else if (/^failure /.test(message)) { - taskState[v11] = "failure"; + else if (m = /^failure \([^\)]+\) after (\d+) second/.exec(message)) { + taskState[v11].outcome = "failure"; + taskState[v11].runtime = Number(m[1]); + taskState.failure_count += 1; + console.log(taskState[v11].runtime); + } + else if (m = /^child \d+ started on ([^.]*)\.(\d+)/.exec(message)) { + taskState[v11].node = m[1]; + taskState[v11].slot = m[2]; + if (taskState.nodes.indexOf(m[1], 0) == -1) { + taskState.nodes.push(m[1]); + } + for (var i in logViewer.items) { + if (i > 0) { + var val = logViewer.items[i].values(); + if (val.taskid === v11) { + val.node = m[1]; + val.slot = m[2]; + logViewer.items[i].values(val); + } + } + } } type = "task-dispatch"; } + node = taskState[v11].node; + slot = taskState[v11].slot; } else { if (/^status: /.test(message)) { type = "job-status"; @@ -46,8 +78,11 @@ function addToLogViewer(logViewer, lines, taskState) { logViewer.add({ id: logViewer.items.length, + ts: ts, timestamp: ts.toLocaleDateString() + " " + ts.toLocaleTimeString(), taskid: v11, + node: node, + slot: slot, message: message, type: type }); @@ -59,31 +94,133 @@ function addToLogViewer(logViewer, lines, taskState) { logViewer.update(); } -function sortByTaskThenId(a, b, opt) { +function sortById(a, b, opt) { a = a.values(); b = b.values(); - if (a["taskid"] === "" && b["taskid"] !== "") { + if (a["id"] > b["id"]) { + return 1; + } + if (a["id"] < b["id"]) { return -1; } - if (a["taskid"] !== "" && b["taskid"] === "") { + return 0; +} + +function sortByTask(a, b, opt) { + var aa = a.values(); + var bb = b.values(); + + if (aa["taskid"] === "" && bb["taskid"] !== "") { + return -1; + } + if (aa["taskid"] !== "" && bb["taskid"] === "") { return 1; } - if (a["taskid"] !== "" && b["taskid"] !== "") { - if (a["taskid"] > b["taskid"]) { + if (aa["taskid"] !== "" && bb["taskid"] !== "") { + if (aa["taskid"] > bb["taskid"]) { return 1; } - if (a["taskid"] < b["taskid"]) { + if (aa["taskid"] < bb["taskid"]) { return -1; } } - if (a["id"] > b["id"]) { + return sortById(a, b, opt); +} + +function sortByNode(a, b, opt) { + var aa = a.values(); + var bb = b.values(); + + if (aa["node"] === "" && bb["node"] !== "") { + return -1; + } + if (aa["node"] !== "" && bb["node"] === "") { return 1; } - if (a["id"] < b["id"]) { - return -1; + + if (aa["node"] !== "" && bb["node"] !== "") { + if (aa["node"] > bb["node"]) { + return 1; + } + if (aa["node"] < bb["node"]) { + return -1; + } + } + + if (aa["slot"] !== "" && bb["slot"] !== "") { + if (aa["slot"] > bb["slot"]) { + return 1; + } + if (aa["slot"] < bb["slot"]) { + return -1; + } + } + + return sortById(a, b, opt); +} + + +function dumbPluralize(n, s, p) { + if (typeof p === 'undefined') { + p = "s"; + } + if (n == 0 || n > 1) { + return n + " " + (s + p); + } else { + return n + " " + s; } - return 0; } + +function generateJobOverview(id, logViewer, taskState) { + var html = ""; + + var first = logViewer.items[1]; + var last = logViewer.items[logViewer.items.length-1]; + + { + html += "
"; + html += "Started at " + first.values().timestamp; + + var duration = (last.values().ts.getTime() - first.values().ts.getTime()) / 1000; + + var hours = 0; + var minutes = 0; + var seconds; + + if (duration >= 3600) { + hours = Math.floor(duration / 3600); + duration -= (hours * 3600); + } + if (duration >= 60) { + minutes = Math.floor(duration / 60); + duration -= (minutes * 60); + } + seconds = duration; + + var tcount = taskState.success_count + taskState.failure_count; + + html += ". " + dumbPluralize(tcount, " task") + " completed in "; + if (hours > 0) { + html += dumbPluralize(hours, " hour"); + } + if (minutes > 0) { + html += " " + dumbPluralize(minutes, " minute"); + } + if (seconds > 0) { + html += " " + dumbPluralize(seconds, " second"); + } + + html += " using " + dumbPluralize(taskState.nodes.length, " node"); + + html += ". " + dumbPluralize(taskState.success_count, " success", "es"); + html += ", " + dumbPluralize(taskState.failure_count, " failure"); + + html += ". Completed at " + last.values().timestamp; + html += "
"; + } + + $(id).html(html); +} \ No newline at end of file