pmux-logview 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -28,6 +28,8 @@ module Pmux
28
28
  @@task_welapse_re = Regexp.new("^ welapse:")
29
29
  @@task_elapse_re = Regexp.new("^ elapse:")
30
30
  @@job_finished_at_re = Regexp.new("^:job_finished_at:")
31
+ @@error_status_re = Regexp.new("^:error_status:")
32
+ @@error_message_re = Regexp.new("^:error_message:")
31
33
  @@quote_re = Regexp.new("^['\"]|['\"]$")
32
34
 
33
35
  @logger = nil
@@ -58,7 +60,7 @@ module Pmux
58
60
  start_time = DateTime::parse(value.strip())
59
61
  job["start_time_msec"] = start_time.strftime("%Q")
60
62
  job["start_time"] = start_time.strftime("%Y-%m-%d %H:%M:%S")
61
- elsif doc_cnt == 1 && @@map_tasks_re =~ ln
63
+ elsif doc_cnt == 1 && (@@map_tasks_re =~ ln || @@reduce_tasks_re =~ ln)
62
64
  empty, key, value = ln.split(":", 3)
63
65
  job[key] = value.strip().to_i()
64
66
  elsif doc_cnt == 1 && @@mapper_re =~ ln
@@ -72,6 +74,13 @@ module Pmux
72
74
  job["end_time_msec"] = end_time.strftime("%Q")
73
75
  job["end_time"] = end_time.strftime("%Y-%m-%d %H:%M:%S")
74
76
  cachable = true
77
+ elsif doc_cnt == 3 && @@error_status_re =~ ln
78
+ empty, key, value = ln.split(":", 3)
79
+ job[key] = value.strip()
80
+ cachable = true
81
+ elsif doc_cnt == 3 && @@error_message_re =~ ln
82
+ empty, key, value = ln.split(":", 3)
83
+ job[key] = value.strip().gsub(@@quote_re, "")
75
84
  end
76
85
  }
77
86
  }
@@ -318,26 +327,20 @@ module Pmux
318
327
  return nil
319
328
  end
320
329
  end
321
- #begin
322
- #f = File.open(file_path)
323
- #docs = YAML::load_stream(f)
324
- docs = full_parse(file_path)
325
- parse_data = []
326
- for idx in [0, 1, 2]
327
- if idx == 0 && !docs[idx].nil?
328
- docs[idx]["job_started_at_msec"] = docs[idx]["job_started_at"].strftime("%Q") if !docs[idx]["job_started_at"].nil?
329
- elsif idx == 2 && !docs[idx].nil?
330
- docs[idx]["job_finished_at_msec"] = docs[idx]["job_finished_at"].strftime("%Q") if !docs[idx]["job_finished_at"].nil?
331
- end
332
- if docs[idx].nil?
333
- parse_data.push({})
334
- else
335
- parse_data.push(docs[idx])
336
- end
330
+ docs = full_parse(file_path)
331
+ parse_data = []
332
+ for idx in [0, 1, 2]
333
+ if idx == 0 && !docs[idx].nil?
334
+ docs[idx]["job_started_at_msec"] = docs[idx]["job_started_at"].strftime("%Q") if !docs[idx]["job_started_at"].nil?
335
+ elsif idx == 2 && !docs[idx].nil?
336
+ docs[idx]["job_finished_at_msec"] = docs[idx]["job_finished_at"].strftime("%Q") if !docs[idx]["job_finished_at"].nil?
337
337
  end
338
- #ensure
339
- # f.close() if !f.nil?
340
- #end
338
+ if docs[idx].nil?
339
+ parse_data.push({})
340
+ else
341
+ parse_data.push(docs[idx])
342
+ end
343
+ end
341
344
  return parse_data
342
345
  end
343
346
 
@@ -133,7 +133,7 @@ table.dataTable tr.even td.sorting_3 { background-color: #E9F9FF; }
133
133
  #task-tooltip {
134
134
  position: absolute ! important;
135
135
  opacity: 0.94;
136
- z-index: 10;
136
+ z-index: 100;
137
137
  font-family: sans-serif;
138
138
  font-size: 16px;
139
139
  }
@@ -19,6 +19,11 @@ pmux_logview.ajax_base = function(url, method, param) {
19
19
  });
20
20
  };
21
21
 
22
+ pmux_logview.html_escape = function(text) {
23
+ var dummy = document.createElement('div');
24
+ return $(dummy).text(text).html().replace(/"/g, """)
25
+ };
26
+
22
27
  pmux_logview.get_user_name = function() {
23
28
  return this.$user_name.text();
24
29
  };
@@ -53,7 +58,11 @@ pmux_logview.update_reload_button = function() {
53
58
 
54
59
  pmux_logview.open_tooltip = function(html, target, event) {
55
60
  var $target = $(target);
56
- var target_height = ($target.attr("height") / 2);
61
+ base_height = $target.attr("height");
62
+ if (base_height == undefined) {
63
+ base_height = 0;
64
+ }
65
+ var target_height = (base_height);
57
66
  this.$task_tooltip.html(html).show();
58
67
  var doc_height = this.$task_tooltip.outerHeight();
59
68
  var doc_width = this.$task_tooltip.outerWidth();
@@ -62,8 +71,13 @@ pmux_logview.open_tooltip = function(html, target, event) {
62
71
  if (event.pageX + doc_width > window_width) {
63
72
  x_adjust = event.pageX + doc_width - window_width + 4;
64
73
  }
65
- this.$task_tooltip.css("top", event.layerY - target_height - doc_height)
66
- .css("left", event.layerX - x_adjust);
74
+ var base_x = event.layerX;
75
+ var base_y = event.layerY;
76
+ if (base_x == undefined) {
77
+ base_x = event.pageX;
78
+ base_y = event.pageY - 100; // offset
79
+ }
80
+ this.$task_tooltip.css("top", base_y - target_height - doc_height).css("left", base_x - x_adjust);
67
81
  };
68
82
 
69
83
  pmux_logview.open_dialog = function(html) {
@@ -83,11 +97,12 @@ pmux_logview.initialize = function() {
83
97
  });
84
98
  $("body").click(function(e) {
85
99
  var $target = $(e.target);
86
- var svg_class = $target.attr("class");
87
- if (svg_class != "actorsSwimlaneChartTaskRect" &&
88
- svg_class != "tasksGanttChartTaskRect" &&
89
- svg_class != "tasksBarChartTaskRect" &&
90
- !$target.hasClass("task-tooltip")) {
100
+ var target_class = $target.attr("class");
101
+ if (target_class != "actorsSwimlaneChartTaskRect" &&
102
+ target_class != "tasksGanttChartTaskRect" &&
103
+ target_class != "tasksBarChartTaskRect" &&
104
+ !$target.hasClass("task-tooltip") &&
105
+ !$target.hasClass("error-info")) {
91
106
  self.$task_tooltip.hide();
92
107
  }
93
108
  });
@@ -34,14 +34,14 @@ pmux_logview.detail.draw_detail_job_chat = function() {
34
34
  var params_html = "";
35
35
  for (params_key in data[0][data_key]) {
36
36
  params_html += '<td class="border">' + params_key + '</td>';
37
- params_html += '<td class="border">' + data[0][data_key][params_key] + '</td>';
37
+ params_html += '<td class="border">' + this.parent.html_escape(data[0][data_key][params_key]) + '</td>';
38
38
  params_html += '</tr><tr>'
39
39
  cnt += 1;
40
40
  }
41
41
  table_html += '<td class="border" rowspan="' + cnt + '">' + data_key + '</td>' + params_html;
42
42
  } else {
43
43
  table_html += '<td class="border" colspan="2">' + data_key + '</td>';
44
- table_html += '<td class="border">' + data[0][data_key] + '</td>';
44
+ table_html += '<td class="border">' + this.parent.html_escape(data[0][data_key]) + '</td>';
45
45
  table_html += '</tr><tr>';
46
46
  }
47
47
  }
@@ -52,7 +52,7 @@ pmux_logview.detail.draw_detail_job_chat = function() {
52
52
  }
53
53
  for (data_key in data[2]) {
54
54
  table_html += '<td class="border" colspan="2">' + data_key + '</td>';
55
- table_html += '<td class="border">' + data[2][data_key] + '</td>';
55
+ table_html += '<td class="border">' + this.parent.html_escape(data[2][data_key]) + '</td>';
56
56
  table_html += '</tr><tr>';
57
57
  }
58
58
  }
@@ -24,7 +24,7 @@ pmux_logview.index = {
24
24
  $dispatcher_log_table: null,
25
25
  $more_button: null,
26
26
  $job_chart_tchart: null,
27
- max_mapper_length: 60
27
+ max_mapper_length: 35
28
28
  };
29
29
 
30
30
  pmux_logview.index.draw_job_chart = function() {
@@ -124,15 +124,24 @@ pmux_logview.index.reload_job_log = function(force) {
124
124
  for (i = 0; i < sorted_jobs.length; i++) {
125
125
  var row_array = []
126
126
  var job_id_html = '';
127
- job_id_html += '<button class="container button-color button-normalize ui-corner-all" onClick="pmux_logview.index.open_detail(\'' + sorted_jobs[i]["job_id"] + '\')">';
128
- job_id_html += ' <span class="icon-space">' + sorted_jobs[i].job_id + '</span>';
127
+ job_id_html += '<button class="detail-button container button-color button-normalize ui-corner-all" data-job-id="' + sorted_jobs[i]["job_id"] + '">';
128
+ if ("error_status" in sorted_jobs[i]) {
129
+ job_id_html += ' <span class="icon-space"><font color="red">' + sorted_jobs[i].job_id + '</font></span>';
130
+ } else {
131
+ job_id_html += ' <span class="icon-space">' + sorted_jobs[i].job_id + '</span>';
132
+ }
129
133
  job_id_html += ' </span><span class="button-icon-adjust ui-icon ui-icon-info"></span>';
130
134
  job_id_html += '</button>';
135
+ if ("error_status" in sorted_jobs[i]) {
136
+ 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) + '">';
137
+ job_id_html += '<div class="error-info ui-state-error"><span class="error-info ui-icon ui-icon-alert"></span></div>';
138
+ job_id_html += '</button>';
139
+ }
131
140
  row_array.push(job_id_html)
132
141
  if (sorted_jobs[i].mapper.length > self.max_mapper_length) {
133
- row_array.push('<span class="text-ellipsis">'+ sorted_jobs[i].mapper.substring(0, self.max_mapper_length) + '...</span>');
142
+ row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper.substring(0, self.max_mapper_length)) + '...</span>');
134
143
  } else {
135
- row_array.push('<span class="text-ellipsis">'+ sorted_jobs[i].mapper + '</span>');
144
+ row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper) + '</span>');
136
145
  }
137
146
  row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].start_time + '</span>');
138
147
  if (sorted_jobs[i].end_time.match(/^\d+%$/)) {
@@ -260,6 +269,11 @@ pmux_logview.index.initialize = function() {
260
269
  bJQueryUI: true,
261
270
  bAutoWidth: true,
262
271
  sPaginationType: "full_numbers",
272
+ fnRowCallback: function(nRow) {
273
+ if (nRow.cells[0]) nRow.cells[0].noWrap = true;
274
+ if (nRow.cells[1]) nRow.cells[1].noWrap = true;
275
+ return nRow
276
+ },
263
277
  fnDrawCallback: function() {
264
278
  self.update_progress_bar();
265
279
  var $this = (this)
@@ -274,6 +288,20 @@ pmux_logview.index.initialize = function() {
274
288
  self.reload_job_log(true);
275
289
  }
276
290
  }
291
+ self.$error_button = $(".error-button").click(function(event) {
292
+ var html = '<table class="border task-tooltip"><thead class="task-tooltip"></thead>';
293
+ html += '<tbody class="task-tooltip"><tr class="task-tooltip">';
294
+ html += '<td class="task-tooltip">status</td>';
295
+ html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-status") +'</td>';
296
+ html += '</tr><tr class="task-tooltip">';
297
+ html += '<td class="task-tooltip">status</td>';
298
+ html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-message") +'</td>';
299
+ html += '</tr></tbody></table>';
300
+ self.parent.open_tooltip(html, event.target, event);
301
+ });
302
+ self.$detail_button = $(".detail-button").click(function(event) {
303
+ self.open_detail($(event.currentTarget).attr("data-job-id"));
304
+ });
277
305
  }
278
306
  });
279
307
  this.$dispatcher_log_table = $("#dispatcher-log-table").dataTable({
@@ -1,5 +1,5 @@
1
1
  module Pmux
2
2
  module LogView
3
- VERSION = "0.2.2"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
data/rpm/pmux-logview CHANGED
@@ -27,7 +27,7 @@ fi
27
27
  prog=pmux-logview
28
28
  exec=${PMUX_LOGVIEW-/usr/local/bin/pmux-logview}
29
29
  config=${CONFIG-/etc/pmux-logview/pmux-logview.conf}
30
- user=${USER-root}
30
+ user=${PMUX_LOGVIEW_USER-root}
31
31
  pidfile=${PIDFILE-/var/run/pmux-logview.pid}
32
32
  lockfile=${LOCKFILE-/var/lock/subsys/pmux-logview}
33
33
  [ -e /etc/sysconfig/${prog} ] && . /etc/sysconfig/${prog}
@@ -5,7 +5,7 @@
5
5
  %define ruby_verid %{_ruby_verid}
6
6
  %endif
7
7
  %define rbname pmux-logview
8
- %define version 0.2.2
8
+ %define version 0.3.0
9
9
  %define release 1
10
10
 
11
11
  Summary: Pmux log viewer
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - hiroyuki kakine
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-03-15 00:00:00 +09:00
18
+ date: 2013-05-28 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency