azkaban-uncached
Changes
src/java/azkaban/utils/LogSummary.java 48(+48 -0)
src/web/js/azkaban.jobsummary.view.js 53(+50 -3)
Details
src/java/azkaban/utils/LogSummary.java 48(+48 -0)
diff --git a/src/java/azkaban/utils/LogSummary.java b/src/java/azkaban/utils/LogSummary.java
index 181442f..9d67e53 100644
--- a/src/java/azkaban/utils/LogSummary.java
+++ b/src/java/azkaban/utils/LogSummary.java
@@ -3,9 +3,16 @@ package azkaban.utils;
import azkaban.utils.FileIOUtils.LogData;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class LogSummary {
+ private String command = null;
+ private List<String> classpath = new ArrayList<String>();
+ private List<String> params = new ArrayList<String>();
+
private String[] statTableHeaders = null;
private List<String[]> statTableData = new ArrayList<String[]>();
@@ -22,10 +29,39 @@ public class LogSummary {
data = data.replaceAll(".*? - ", "");
String[] lines = data.split("\n");
+ parseCommand(lines);
parseJobSummary(lines);
parseJobStats(lines);
}
+ private void parseCommand(String[] lines) {
+ int commandStartIndex = -1;
+ for (int i = 0; i < lines.length; i++) {
+ if (lines[i].startsWith("Command: ")) {
+ commandStartIndex = i;
+ break;
+ }
+ }
+
+ if (commandStartIndex != -1) {
+ command = lines[commandStartIndex].substring(9);
+
+ // Parse classpath
+ Pattern p = Pattern.compile("(?:-cp|-classpath)\\s+(\\S+)");
+ Matcher m = p.matcher(command);
+ if (m.find()) {
+ classpath = Arrays.asList(m.group(1).split(":"));
+ }
+
+ // Parse Pig params
+ p = Pattern.compile("-param\\s+(\\S+)");
+ m = p.matcher(command);
+ while (m.find()) {
+ params.add(m.group(1));
+ }
+ }
+ }
+
private void parseJobSummary(String[] lines) {
int jobSummaryStartIndex = -1;
for (int i = 0; i < lines.length; i++) {
@@ -85,4 +121,16 @@ public class LogSummary {
public List<String[]> getSummaryTableData() {
return summaryTableData;
}
+
+ public String getCommand() {
+ return command;
+ }
+
+ public List<String> getClasspath() {
+ return classpath;
+ }
+
+ public List<String> getParams() {
+ return params;
+ }
}
diff --git a/src/java/azkaban/webapp/servlet/ExecutorServlet.java b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
index bfceaf7..75950af 100644
--- a/src/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -517,6 +517,9 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
LogData data = executorManager.getExecutionJobLog(exFlow, jobId, 0, Integer.MAX_VALUE, attempt);
LogSummary summary = new LogSummary(data);
+ ret.put("command", summary.getCommand());
+ ret.put("classpath", summary.getClasspath());
+ ret.put("params", summary.getParams());
ret.put("summaryTableHeaders", summary.getSummaryTableHeaders());
ret.put("summaryTableData", summary.getSummaryTableData());
ret.put("statTableHeaders", summary.getStatTableHeaders());
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
index ce11145..b5a2a29 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
@@ -76,6 +76,10 @@
<div id="jobSummaryView" class="summaryView">
<br/>
+ <table id="commandTable">
+ </table>
+
+ <br/>
<p>Job Summary
<table>
<thead id="summaryHeader">
@@ -86,7 +90,6 @@
</p>
<br/>
-
<p>Job Stats
<table>
<thead id="statsHeader">
src/web/js/azkaban.jobsummary.view.js 53(+50 -3)
diff --git a/src/web/js/azkaban.jobsummary.view.js b/src/web/js/azkaban.jobsummary.view.js
index 99a832e..9959502 100644
--- a/src/web/js/azkaban.jobsummary.view.js
+++ b/src/web/js/azkaban.jobsummary.view.js
@@ -45,13 +45,60 @@ azkaban.JobSummaryView = Backbone.View.extend({
console.log(data.error);
}
else {
- self.renderTable(data.summaryTableHeaders, data.summaryTableData, "summary");
- self.renderTable(data.statTableHeaders, data.statTableData, "stats");
+ self.renderCommandTable(data.command, data.classpath, data.params);
+ self.renderJobTable(data.summaryTableHeaders, data.summaryTableData, "summary");
+ self.renderJobTable(data.statTableHeaders, data.statTableData, "stats");
}
}
});
},
- renderTable: function(headers, data, prefix) {
+ renderCommandTable: function(command, classpath, params) {
+ if (command) {
+ var commandTable = $("#commandTable");
+ var i;
+
+ // Add row for command
+ var tr = document.createElement("tr");
+ var td = document.createElement("td");
+ $(td).append("<b>Command</b>");
+ $(tr).append(td);
+ td = document.createElement("td");
+ $(td).text(command);
+ $(tr).append(td);
+ commandTable.append(tr);
+
+ // Add row for classpath
+ if (classpath && classpath.length > 0) {
+ tr = document.createElement("tr");
+ td = document.createElement("td");
+ $(td).append("<b>Classpath</b>");
+ $(tr).append(td);
+ td = document.createElement("td");
+ $(td).append(classpath[0]);
+ for (i = 1; i < classpath.length; i++) {
+ $(td).append("<br/>" + classpath[i]);
+ }
+ $(tr).append(td);
+ commandTable.append(tr);
+ }
+
+ // Add row for params
+ if (params && params.length > 0) {
+ tr = document.createElement("tr");
+ td = document.createElement("td");
+ $(td).append("<b>Params</b>");
+ $(tr).append(td);
+ td = document.createElement("td");
+ $(td).append(params[0]);
+ for (i = 1; i < params.length; i++) {
+ $(td).append("<br/>" + params[i]);
+ }
+ $(tr).append(td);
+ commandTable.append(tr);
+ }
+ }
+ },
+ renderJobTable: function(headers, data, prefix) {
if (headers) {
// Add table headers
var header = $("#" + prefix + "Header");