azkaban-uncached

Put PigStats into a table

11/18/2013 6:19:21 PM

Details

diff --git a/src/java/azkaban/webapp/servlet/ExecutorServlet.java b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
index 151b59e..7355adf 100644
--- a/src/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -45,6 +45,7 @@ import azkaban.user.User;
 import azkaban.user.Permission.Type;
 import azkaban.utils.FileIOUtils.JobMetaData;
 import azkaban.utils.FileIOUtils.LogData;
+import azkaban.utils.LogSummary;
 import azkaban.webapp.AzkabanWebServer;
 import azkaban.webapp.session.Session;
 
@@ -502,9 +503,6 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
 			return;
 		}
 		
-		int offset = this.getIntParam(req, "offset");
-		int length = this.getIntParam(req, "length");
-		
 		String jobId = this.getParam(req, "jobId");
 		resp.setCharacterEncoding("utf-8");
 
@@ -516,17 +514,10 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
 			}
 			
 			int attempt = this.getIntParam(req, "attempt", node.getAttempt());
-			LogData data = executorManager.getExecutionJobLog(exFlow, jobId, offset, length, attempt);
-			if (data == null) {
-				ret.put("length", 0);
-				ret.put("offset", offset);
-				ret.put("data", "");
-			}
-			else {
-				ret.put("length", data.getLength());
-				ret.put("offset", data.getOffset());
-				ret.put("data", data.getData());
-			}
+			LogData data = executorManager.getExecutionJobLog(exFlow, jobId, 0, Integer.MAX_VALUE, attempt);
+			LogSummary summary = new LogSummary(data);
+			ret.put("statTableHeaders", summary.getStatTableHeaders());
+			ret.put("statTableData", summary.getStatTableData());
 		} catch (ExecutorManagerException e) {
 			throw new ServletException(e);
 		}
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
index 349a1e3..24f99ce 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
@@ -76,9 +76,12 @@
 
 			<div id="jobSummaryView" class="summaryView">
 				<div class="summaryHeader"><div class="summaryButtonRow"><div id="updateSummaryBtn" class="btn7">Refresh</div></div></div>
-				<div class="summaryViewer">
-					<pre id="summarySection" class="summary"></pre>
-				</div>
+				<table>
+					<thead id="summaryHeader">
+					</thead>
+					<tbody id="summaryBody">
+					</tbody>
+				</table>
 			</div>
 #end
 
diff --git a/src/web/js/azkaban.jobsummary.view.js b/src/web/js/azkaban.jobsummary.view.js
index 79caaad..a67636f 100644
--- a/src/web/js/azkaban.jobsummary.view.js
+++ b/src/web/js/azkaban.jobsummary.view.js
@@ -25,67 +25,56 @@ azkaban.JobSummaryView = Backbone.View.extend({
 		"click #updateSummaryBtn" : "handleUpdate"
 	},
 	initialize: function(settings) {
-		this.model.set({"offset": 0});
 		this.handleUpdate();
 	},
 	handleUpdate: function(evt) {
 		var requestURL = contextURL + "/executor"; 
 		var model = this.model;
-		var finished = false;
+		var self = this;
 
-		var date = new Date();
-		var startTime = date.getTime();
-		
-		while(!finished) {
-			var offset = this.model.get("offset");
-			$.ajax({
-				url: requestURL,
-				type: "get",
-				async: false,
-				dataType: "json",
-				data: {"execid": execId, "jobId": jobId, "ajax":"fetchExecJobSummary", "offset": offset, "length": 50000, "attempt": attempt},
-				error: function(data) {
-					console.log(data);
-					finished = true;
-				},
-				success: function(data) {
-					console.log("fetchSummary");
-					if (data.error) {
-						console.log(data.error);
-						finished = true;
-					}
-					else if (data.length == 0) {
-						finished = true;
-					}
-					else {
-						var date = new Date();
-						var endTime = date.getTime();
-						if ((endTime - startTime) > 10000) {
-							finished = true;
-							showDialog("Alert","The summary is taking a long time to finish loading. Azkaban has stopped loading them. Please click Refresh to restart the load.");
-						} 
-	
-						var re = /(https?:\/\/(([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?))/g;
-						var summary = $("#summarySection").text();
-						if (!summary) {
-							summary = data.data;
-						}
-						else {
-							summary += data.data;
-						}
-	
-						var newOffset = data.offset + data.length;
-	
-						$("#summarySection").text(summary);
-						summary = $("#summarySection").html();
-						summary = summary.replace(re, "<a href=\"$1\" title=\"\">$1</a>");
-						$("#summarySection").html(summary);
-	
-						model.set({"offset": newOffset, "summary": summary});
-						$(".summaryViewer").scrollTop(9999);
-					}
+		$.ajax({
+			url: requestURL,
+			dataType: "json",
+			data: {"execid": execId, "jobId": jobId, "ajax":"fetchExecJobSummary", "attempt": attempt},
+			error: function(data) {
+				console.log(data);
+			},
+			success: function(data) {
+				console.log("fetchSummary");
+				if (data.error) {
+					console.log(data.error);
 				}
-			});
+				else {
+					self.renderStatTable(data.statTableHeaders, data.statTableData);
+				}
+			}
+		});
+	},
+	renderStatTable: function(headers, data) {
+		if (headers) {
+			// Add table headers
+			var summaryHeader = $("#summaryHeader");
+			var tr = document.createElement("tr");
+			var i;
+			for (i = 0; i < headers.length; i++) {
+				var th = document.createElement("th");
+				$(th).text(headers[i]);
+				$(tr).append(th);
+			}
+			summaryHeader.append(tr);
+			
+			// Add table body
+			var summaryBody = $("#summaryBody");
+			for (i = 0; i < data.length; i++) {
+				tr = document.createElement("tr");
+				var row = data[i];
+				for (var j = 0; j < headers.length; j++) {
+					var td = document.createElement("td");
+					$(td).text(row[j]);
+					$(tr).append(td);
+				}
+				summaryBody.append(tr);
+			}
 		}
 	}
 });