Repository: zeppelin Updated Branches: refs/heads/master 116005659 -> 1a3ae4265
[ZEPPELIN-2122] Add execution time for Spell ### What is this PR for? Add execution time for spell results. See the screenshot section. ### What type of PR is it? [Improvement] ### Todos NONE ### What is the Jira issue? [ZEPPELIN-2122](https://issues.apache.org/jira/browse/ZEPPELIN-2122) ### How should this be tested? 1. Install any spell (e.g the eco spell) 2. Execute and check that the paragraph has valid execution time. ### Screenshots (if appropriate)   ### Questions: * Does the licenses files need update? - NO * Is there breaking changes for older versions? - NO * Does this needs documentation? - NO Author: 1ambda <[email protected]> Closes #2338 from 1ambda/ZEPPEILN-2122/add-execution-time-for-spell and squashes the following commits: 2417428 [1ambda] fix: Set dateStarted in run* func 0996865 [1ambda] fix: Use string instead of moment obj bb895a5 [1ambda] fix: Set dateStarted 9fb388e [1ambda] fix: Use ISO 8601 55f8d23 [1ambda] fix: rollback Job class c2ab88b [1ambda] feat: Persist, display execution time for spell Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/1a3ae426 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/1a3ae426 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/1a3ae426 Branch: refs/heads/master Commit: 1a3ae426579a58267ad06d4cb33afb29ac822725 Parents: 1160056 Author: 1ambda <[email protected]> Authored: Fri May 12 05:39:00 2017 +0900 Committer: Lee moon soo <[email protected]> Committed: Thu May 25 15:54:15 2017 +0900 ---------------------------------------------------------------------- .../java/org/apache/zeppelin/scheduler/Job.java | 8 ++++++ .../apache/zeppelin/socket/NotebookServer.java | 29 ++++++++++++++------ .../notebook/paragraph/paragraph.controller.js | 29 +++++++++++++++++--- .../websocketEvents/websocketMsg.service.js | 11 +++++--- 4 files changed, 60 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java index 549811c..d0025d8 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java @@ -259,10 +259,18 @@ public abstract class Job { return dateStarted; } + public synchronized void setDateStarted(Date startedAt) { + dateStarted = startedAt; + } + public synchronized Date getDateFinished() { return dateFinished; } + public synchronized void setDateFinished(Date finishedAt) { + dateFinished = finishedAt; + } + public abstract void setResult(Object results); public synchronized String getErrorMessage() { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index 87d0009..5588be0 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -19,15 +19,9 @@ package org.apache.zeppelin.socket; import java.io.IOException; import java.net.URISyntaxException; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Queue; -import java.util.Set; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; @@ -1696,6 +1690,23 @@ public class NotebookServer extends WebSocketServlet p.setErrorMessage((String) fromMessage.get("errorMessage")); p.setStatusWithoutNotification(status); + // Spell uses ISO 8601 formatted string generated from moment + String dateStarted = (String) fromMessage.get("dateStarted"); + String dateFinished = (String) fromMessage.get("dateFinished"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); + + try { + p.setDateStarted(df.parse(dateStarted)); + } catch (ParseException e) { + LOG.error("Failed parse dateStarted", e); + } + + try { + p.setDateFinished(df.parse(dateFinished)); + } catch (ParseException e) { + LOG.error("Failed parse dateFinished", e); + } + addNewParagraphIfLastParagraphIsExecuted(note, p); if (!persistNoteWithAuthInfo(conn, note, p)) { return; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index fd21467..e333084 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -254,12 +254,15 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca $scope.propagateSpellResult = function (paragraphId, paragraphTitle, paragraphText, paragraphResults, paragraphStatus, paragraphErrorMessage, - paragraphConfig, paragraphSettingsParam) { + paragraphConfig, paragraphSettingsParam, + paragraphDateStarted, paragraphDateFinished) { websocketMsgSrv.paragraphExecutedBySpell( paragraphId, paragraphTitle, paragraphText, paragraphResults, paragraphStatus, paragraphErrorMessage, - paragraphConfig, paragraphSettingsParam) + paragraphConfig, paragraphSettingsParam, + paragraphDateStarted, paragraphDateFinished + ) } $scope.handleSpellError = function (paragraphText, error, @@ -270,10 +273,15 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca console.error('Failed to execute interpret() in spell\n', error) if (!propagated) { + $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime() + } + + if (!propagated) { $scope.propagateSpellResult( $scope.paragraph.id, $scope.paragraph.title, paragraphText, [], $scope.paragraph.status, errorMessage, - $scope.paragraph.config, $scope.paragraph.settings.params) + $scope.paragraph.config, $scope.paragraph.settings.params, + $scope.paragraph.dateStarted, $scope.paragraph.dateFinished) } } @@ -309,11 +317,16 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca const paragraphText = $scope.spellTransaction.paragraphText if (!propagated) { + $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime() + } + + if (!propagated) { const propagable = SpellResult.createPropagable(resultsMsg) $scope.propagateSpellResult( $scope.paragraph.id, $scope.paragraph.title, paragraphText, propagable, status, '', - $scope.paragraph.config, $scope.paragraph.settings.params) + $scope.paragraph.config, $scope.paragraph.settings.params, + $scope.paragraph.dateStarted, $scope.paragraph.dateFinished) } } @@ -331,6 +344,10 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca // remove leading spaces const textWithoutMagic = splited[1].replace(/^\s+/g, '') + if (!propagated) { + $scope.paragraph.dateStarted = $scope.getFormattedParagraphTime() + } + // handle actual result message in promise heliumService.executeSpell(magic, textWithoutMagic) .then(resultsMsg => { @@ -981,6 +998,10 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca return $scope.currentProgress || 0 } + $scope.getFormattedParagraphTime = () => { + return moment().toISOString() + } + $scope.getExecutionTime = function (pdata) { const end = pdata.dateFinished const start = pdata.dateStarted http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js index 3f7ec6b..3fa56f3 100644 --- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js +++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js @@ -160,9 +160,10 @@ function websocketMsgSrv ($rootScope, websocketEvents) { }, paragraphExecutedBySpell: function (paragraphId, paragraphTitle, - paragraphText, paragraphResultsMsg, - paragraphStatus, paragraphErrorMessage, - paragraphConfig, paragraphParams) { + paragraphText, paragraphResultsMsg, + paragraphStatus, paragraphErrorMessage, + paragraphConfig, paragraphParams, + paragraphDateStarted, paragraphDateFinished) { websocketEvents.sendNewEvent({ op: 'PARAGRAPH_EXECUTED_BY_SPELL', data: { @@ -179,7 +180,9 @@ function websocketMsgSrv ($rootScope, websocketEvents) { status: paragraphStatus, errorMessage: paragraphErrorMessage, config: paragraphConfig, - params: paragraphParams + params: paragraphParams, + dateStarted: paragraphDateStarted, + dateFinished: paragraphDateFinished, } }) },
