pmux_logview.index = {
parent: pmux_logview, job_log_sort_keys: [ "job_id", "mapper", "start_time", "end_time", "elapsed_time" ], job_log_sort_key: "start_time", job_log_sort_order: "desc", job_log_nitems: 20, job_log_page: 0, job_log_realtime_jobs: {}, job_log_search_jobs: {}, reload_job_log_initialized: false, reload_dispatcher_log_initialized: false, job_log_ajax_requested: false, dispatcher_log_ajax_requested: false, need_reload_job_log: true, need_reload_dispatcher_log: false, reload_job_log_timer_id: null, reload_dispatcher_log_timer_id: null, draw_invoke_timer_id: null, tab_active_index: 0, selected_job_id: null, $main_tab: null, $job_log_realtime_table: null, $job_log_search_table: null, $job_log_type: null, $dispatcher_log_table: null, $load_button: null, $more_button: null, $job_chart_tchart: null, max_mapper_length: 35, $start_date_picker: null, $end_date_picker: null
};
pmux_logview.index.draw_job_chart = function() {
// convert tchart format var source = { settings: { drawActorsSwimlaneChart: false, width: $(window).innerWidth() - 80, tasksGanttChart : { label: "jobs gantt chart" }, tasksBarChart : { label: "jobs bar chart" } }, actors : null, tasks : {} }; var job_count = 0; if (this.$job_log_type.val() == "realtime") { for (job_id in this.job_log_realtime_jobs) { var from = Number(this.job_log_realtime_jobs[job_id].start_time_msec); var to; if ("end_time_msec" in this.job_log_realtime_jobs[job_id]) { to = Number(this.job_log_realtime_jobs[job_id].end_time_msec); } else { continue; } source.tasks[job_id] = { name: "id " + job_id, from: from, to: to, clickEventArg: this.job_log_realtime_jobs[job_id], nextTasks: null } job_count += 1; } } else { for (job_id in this.job_log_search_jobs) { var from = Number(this.job_log_search_jobs[job_id].start_time_msec); var to; if ("end_time_msec" in this.job_log_search_jobs[job_id]) { to = Number(this.job_log_search_jobs[job_id].end_time_msec); } else { continue; } source.tasks[job_id] = { name: "id " + job_id, from: from, to: to, clickEventArg: this.job_log_search_jobs[job_id], nextTasks: null } job_count += 1; } } if (job_count != 0) { this.$job_chart_tchart.tchart('update', source); }
}
pmux_logview.index.open_detail = function(job_id) {
window.open("detail?job_id=" + job_id, "_blank");
};
pmux_logview.index.update_progress_bar = function() {
$(".progress-bar").each(function() { var $target = $(this); var data_value = $target.attr("data-value"); $target.progressbar({value: Number(data_value)}); });
};
pmux_logview.index.reload_job_log = function(force, change_ui) {
if (!this.parent.can_reload) { return; } if (!force && this.job_log_ajax_requested) { return; } this.job_log_ajax_requested = true; var self = this; var param = { sort_order: this.job_log_sort_order, nitems: this.job_log_nitems, page: this.job_log_page } this.parent.ajax_base("log/job", "GET", param).done(function(data, textStatus, XMLHttpRequest) { if (!("jobs" in data)) { self.$job_log_realtime_table.fnClearTable(); self.$job_log_realtime_table.fnAddData(["invalid response", "", "", "", ""]); self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$more_button.show(); } return; } $.extend(true, self.job_log_realtime_jobs, data.jobs); self.$job_log_realtime_table.fnClearTable(); var sorted_jobs = []; for (var job_id in self.job_log_realtime_jobs) { sorted_jobs.push(self.job_log_realtime_jobs[job_id]); } if (self.$job_log_realtime_table.fnSettings().aaSorting.length == 0) { sorted_jobs.sort(function(a,b){ var aTime = Number(a.start_time_msec); var bTime = Number(b.start_time_msec); if ( aTime < bTime ) return 1; if ( aTime > bTime ) return -1; return 0; }); } var body_array = []; for (i = 0; i < sorted_jobs.length; i++) { var row_array = [] var job_id_html = ''; job_id_html += '<button class="detail-button container button-color button-normalize ui-corner-all" data-job-id="' + sorted_jobs[i]["job_id"] + '">'; if ("error_status" in sorted_jobs[i]) { job_id_html += ' <span class="icon-space"><font color="red">' + sorted_jobs[i].job_id + '</font></span>'; } else { job_id_html += ' <span class="icon-space">' + sorted_jobs[i].job_id + '</span>'; } job_id_html += ' </span><span class="button-icon-adjust ui-icon ui-icon-info"></span>'; job_id_html += '</button>'; if ("error_status" in sorted_jobs[i]) { job_id_html += '<button class="error-button error-info button-color button-normalize ui-corner-all" data-error-status="' + sorted_jobs[i].error_status + '" data-error-message="' + self.parent.html_escape(sorted_jobs[i].error_message) + '">'; job_id_html += '<div class="error-info ui-state-error"><span class="error-info ui-icon ui-icon-alert"></span></div>'; job_id_html += '</button>'; } row_array.push(job_id_html) if (sorted_jobs[i].mapper && sorted_jobs[i].mapper.length > self.max_mapper_length) { row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper.substring(0, self.max_mapper_length)) + '...</span>'); } else { row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper) + '</span>'); } row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].start_time + '</span>'); if (sorted_jobs[i].end_time.match(/^\d+%$/)) { var percent = sorted_jobs[i].end_time.replace("%",""); row_array.push('<span class="cell-nowrap"><div class="progress-bar" data-value="' + percent + '" ></div></span>'); } else { row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].end_time + '</span>'); } row_array.push(sorted_jobs[i].elapsed_time); body_array.push(row_array); } self.$job_log_realtime_table.fnAddData(body_array); self.update_progress_bar(); self.valid_last_job_id = true; self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$more_button.show(); } }).fail(function(XMLHttpRequest, textStatus, errorThrown) { self.parent.open_dialog("job log の読み込みに失敗しました。"); self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$more_button.show(); } });
};
pmux_logview.index.load_job_log = function(force, change_ui) {
if (!this.parent.can_reload) { return; } if (!force && this.job_log_ajax_requested) { return; } this.job_log_ajax_requested = true; var self = this; var param = { sort_order: this.job_log_sort_order, nitems: this.job_log_nitems, page: this.job_log_page } var start_date = this.$start_date_picker.datepicker('getDate'); var end_date = this.$end_date_picker.datepicker('getDate'); if (start_date != null) { param.start_time_msec = start_date.getTime(); } if (end_date != null) { param.end_time_msec = end_date.getTime(); } this.parent.ajax_base("log/job", "GET", param).done(function(data, textStatus, XMLHttpRequest) { if (!("jobs" in data)) { self.$job_log_search_table.fnClearTable(); self.$job_log_search_table.fnAddData(["invalid response", "", "", "", ""]); self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$load_button.show(); } return; } self.job_log_search_jobs = {}; $.extend(true, self.job_log_search_jobs, data.jobs); self.$job_log_search_table.fnClearTable(); var sorted_jobs = []; for (var job_id in self.job_log_search_jobs) { sorted_jobs.push(self.job_log_search_jobs[job_id]); } if (self.$job_log_search_table.fnSettings().aaSorting.length == 0) { sorted_jobs.sort(function(a,b){ var aTime = Number(a.start_time_msec); var bTime = Number(b.start_time_msec); if ( aTime < bTime ) return 1; if ( aTime > bTime ) return -1; return 0; }); } var body_array = []; for (i = 0; i < sorted_jobs.length; i++) { var row_array = [] var job_id_html = ''; job_id_html += '<button class="detail-button container button-color button-normalize ui-corner-all" data-job-id="' + sorted_jobs[i]["job_id"] + '">'; if ("error_status" in sorted_jobs[i]) { job_id_html += ' <span class="icon-space"><font color="red">' + sorted_jobs[i].job_id + '</font></span>'; } else { job_id_html += ' <span class="icon-space">' + sorted_jobs[i].job_id + '</span>'; } job_id_html += ' </span><span class="button-icon-adjust ui-icon ui-icon-info"></span>'; job_id_html += '</button>'; if ("error_status" in sorted_jobs[i]) { job_id_html += '<button class="error-button error-info button-color button-normalize ui-corner-all" data-error-status="' + sorted_jobs[i].error_status + '" data-error-message="' + self.parent.html_escape(sorted_jobs[i].error_message) + '">'; job_id_html += '<div class="error-info ui-state-error"><span class="error-info ui-icon ui-icon-alert"></span></div>'; job_id_html += '</button>'; } row_array.push(job_id_html) if (sorted_jobs[i].mapper && sorted_jobs[i].mapper.length > self.max_mapper_length) { row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper.substring(0, self.max_mapper_length)) + '...</span>'); } else { row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper) + '</span>'); } row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].start_time + '</span>'); if (sorted_jobs[i].end_time.match(/^\d+%$/)) { var percent = sorted_jobs[i].end_time.replace("%",""); row_array.push('<span class="cell-nowrap"><div class="progress-bar" data-value="' + percent + '" ></div></span>'); } else { row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].end_time + '</span>'); } row_array.push(sorted_jobs[i].elapsed_time); body_array.push(row_array); } self.$job_log_search_table.fnAddData(body_array); self.update_progress_bar(); self.valid_last_job_id = true; self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$load_button.show(); } }).fail(function(XMLHttpRequest, textStatus, errorThrown) { self.parent.open_dialog("job log の読み込みに失敗しました。"); self.job_log_ajax_requested = false; if (change_ui) { self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.$load_button.show(); } });
};
pmux_logview.index.reload_dispatcher_log = function() {
if (!this.parent.can_reload) { return; } if (this.dispatcher_log_ajax_requested) { return; } var self = this; this.parent.ajax_base("log/dispatcher", "GET", {}).done(function(data, textStatus, XMLHttpRequest) { self.$dispatcher_log_table.fnClearTable(); var body_array = []; for (var i = data.length - 1; i >= 0; i--) { body_array.push([data[i]]); } self.$dispatcher_log_table.fnAddData(body_array); self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.dispatcher_log_ajax_requested = false; }).fail(function(XMLHttpRequest, textStatus, errorThrown) { self.parent.open_dialog("dispatcher log の読み込みに失敗しました。"); self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) }); self.dispatcher_log_ajax_requested = false; }); this.dispatcher_log_ajax_requested = true;
};
pmux_logview.index.reload = function() {
var self = this; if (this.need_reload_job_log) { if (this.reload_job_log_timer_id == null) { this.reload_job_log_timer_id = setInterval(function(){ self.reload_job_log(false, false); }, 3000); } if (!this.reload_job_log_initialized) { this.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) }); this.reload_job_log(true, true); this.reload_job_log_initialized = true; } } else { if (this.reload_job_log_timer_id != null) { clearInterval(this.reload_job_log_timer_id); this.reload_job_log_timer_id = null; } } if (this.need_reload_dispatcher_log) { if (this.reload_dispatcher_log_timer_id == null) { this.reload_dispatcher_log_timer_id = setInterval(function(){ self.reload_dispatcher_log(); }, 3000); } if (!this.reload_dispatcher_log_initialized) { this.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) }); this.reload_dispatcher_log(); this.reload_dispatcher_log_initialized = true; } } else { if (this.reload_dispatcher_log_timer_id != null) { clearInterval(this.reload_dispatcher_log_timer_id); this.reload_dispatcher_log_timer_id = null; } }
};
pmux_logview.index.draw_invoke = function() {
if (this.tab_active_index == 2) { this.draw_job_chart(); } if (this.draw_invoke_timer_id != null) { clearInterval(this.draw_invoke_timer_id); this.draw_invoke_timer_id = null; }
}
pmux_logview.index.initialize = function() {
var self = this; this.parent.initialize(); this.$main_tab = $("#main-tabs").tabs({ active: this.tab_active_index, activate: function(event, ui) { self.tab_active_index = self.$main_tab.tabs("option", "active"); if (self.tab_active_index == 0) { self.need_reload_job_log = true; self.need_reload_dispatcher_log = false; }else if (self.tab_active_index == 1) { self.need_reload_job_log = false; self.need_reload_dispatcher_log = false; } else if (self.tab_active_index == 2) { self.need_reload_job_log = false; self.need_reload_dispatcher_log = true; } else if (self.tab_active_index == 3) { self.need_reload_job_log = false; self.need_reload_dispatcher_log = false; self.draw_job_chart(); } self.reload(); } }); this.$job_log_realtime_table = $("#job-log-realtime-table").dataTable({ aaSorting: [], bPaginate: false, bScrollCollapse: true, bSort: true, bFilter: true, bJQueryUI: true, bAutoWidth: true, sPaginationType: "full_numbers", fnRowCallback: function(nRow) { if (nRow.cells[0]) nRow.cells[0].noWrap = true; if (nRow.cells[1]) nRow.cells[1].noWrap = true; return nRow }, fnDrawCallback: function() { self.update_progress_bar(); var $this = (this) if ($this.fnSettings().aaSorting.length != 0) { var sort_key = self.job_log_sort_keys[$this.fnSettings().aaSorting[0][0]]; var sort_order = $this.fnSettings().aaSorting[0][1]; if (self.job_log_sort_key != sort_key || self.job_log_sort_order != sort_order) { self.job_log_sort_key = sort_key; self.job_log_sort_order = sort_order; } } self.$error_button = $(".error-button").click(function(event) { var html = '<table class="border task-tooltip"><thead class="task-tooltip"></thead>'; html += '<tbody class="task-tooltip"><tr class="task-tooltip">'; html += '<td class="task-tooltip">status:</td>'; html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-status") +'</td>'; html += '</tr><tr class="task-tooltip">'; html += '<td class="task-tooltip">message:</td>'; html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-message") +'</td>'; html += '</tr></tbody></table>'; self.parent.open_tooltip(html, event.target, event); }); self.$detail_button = $(".detail-button").click(function(event) { self.open_detail($(event.currentTarget).attr("data-job-id")); }); } }); this.$job_log_search_table = $("#job-log-search-table").dataTable({ aaSorting: [], bPaginate: false, bScrollCollapse: true, bSort: true, bFilter: true, bJQueryUI: true, bAutoWidth: true, sPaginationType: "full_numbers", fnRowCallback: function(nRow) { if (nRow.cells[0]) nRow.cells[0].noWrap = true; if (nRow.cells[1]) nRow.cells[1].noWrap = true; return nRow }, fnDrawCallback: function() { self.update_progress_bar(); var $this = (this) if ($this.fnSettings().aaSorting.length != 0) { var sort_key = self.job_log_sort_keys[$this.fnSettings().aaSorting[0][0]]; var sort_order = $this.fnSettings().aaSorting[0][1]; if (self.job_log_sort_key != sort_key || self.job_log_sort_order != sort_order) { self.job_log_sort_key = sort_key; self.job_log_sort_order = sort_order; } } self.$error_button = $(".error-button").click(function(event) { var html = '<table class="border task-tooltip"><thead class="task-tooltip"></thead>'; html += '<tbody class="task-tooltip"><tr class="task-tooltip">'; html += '<td class="task-tooltip">status:</td>'; html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-status") +'</td>'; html += '</tr><tr class="task-tooltip">'; html += '<td class="task-tooltip">message:</td>'; html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-message") +'</td>'; html += '</tr></tbody></table>'; self.parent.open_tooltip(html, event.target, event); }); self.$detail_button = $(".detail-button").click(function(event) { self.open_detail($(event.currentTarget).attr("data-job-id")); }); } }); this.$dispatcher_log_table = $("#dispatcher-log-table").dataTable({ aaSorting: [], bPaginate: false, bScrollCollapse: true, bSort: false, bFilter: true, bJQueryUI: true, bAutoWidth: true }); this.$more_button = $("#more-button").click(function() { self.job_log_page += 1; self.$more_button.hide(); self.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) }); self.reload_job_log(true, true); }); this.$job_chart_tchart = $("#job-chart-tchart").tchart({ onTaskClick: function(task, target, event) { var html = '<table class="border task-tooltip"><thead class="task-tooltip"></thead>'; html += '<tbody class="task-tooltip"><tr class="task-tooltip">'; for (key in task) { html += '<td class="task-tooltip">' + key +'</td>'; if (key == "job_id") { html += '<td><button class="container button-color button-normalize ui-corner-all" onClick="pmux_logview.index.open_detail(\'' + task[key] + '\')">'; html += ' <span class="icon-space">' + task[key] + '</span>'; html += ' </span><span class="button-icon-adjust ui-icon ui-icon-info"></span>'; html += '</button></td></tr><tr class="task-tooltip">'; } else { html += '<td class="task-tooltip">' + task[key] +'</td></tr><tr class="task-tooltip">'; } } html += '</tr></tbody></table>'; self.parent.open_tooltip(html, target, event); } }); this.$start_date_picker = $("#start-date-picker").datetimepicker({ dateFormat: "yy-mm-dd", timeFormat: 'HH:mm:ss', showMonthAfterYear: true }); this.$end_date_picker = $("#end-date-picker").datetimepicker({ dateFormat: 'yy-mm-dd', timeFormat: 'HH:mm:ss', showMonthAfterYear: true}); $(window).resize(function() { if (self.draw_invoke_timer_id == null) { self.draw_invoke_timer_id = setInterval(function() { self.draw_invoke() }, 1000); } }); this.$load_button = $("#load-button").click(function() { self.$load_button.hide(); self.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) }); self.load_job_log(true, true); }); this.$job_log_type = $("#job-log-type").change(function() { self.draw_job_chart(); }); this.reload();
};
$(document).ready(function(){
pmux_logview.index.initialize();
});