Repository: eagle
Updated Branches:
  refs/heads/master 0d4f109fa -> 2adbbf59f


[EAGLE-858] JPM support task attempt info

In JPM job detail UI, support display attempt info of failure job.

Author: zombieJ <[email protected]>

Closes #771 from zombieJ/EAGLE-858.


Project: http://git-wip-us.apache.org/repos/asf/eagle/repo
Commit: http://git-wip-us.apache.org/repos/asf/eagle/commit/2adbbf59
Tree: http://git-wip-us.apache.org/repos/asf/eagle/tree/2adbbf59
Diff: http://git-wip-us.apache.org/repos/asf/eagle/diff/2adbbf59

Branch: refs/heads/master
Commit: 2adbbf59f23b7088cf60fa4e82540b4017c3693d
Parents: 0d4f109
Author: zombieJ <[email protected]>
Authored: Wed Jan 11 18:34:21 2017 +0800
Committer: zombieJ <[email protected]>
Committed: Wed Jan 11 18:34:21 2017 +0800

----------------------------------------------------------------------
 .../main/webapp/app/apps/jpm/ctrl/detailCtrl.js | 19 ++++++++
 .../app/apps/jpm/partials/job/detail.html       | 50 ++++++++++++++++++++
 .../app/dev/public/js/components/sortTable.js   |  3 +-
 .../app/dev/public/js/components/widget.js      |  8 +++-
 4 files changed, 78 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/eagle/blob/2adbbf59/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/ctrl/detailCtrl.js
----------------------------------------------------------------------
diff --git 
a/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/ctrl/detailCtrl.js 
b/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/ctrl/detailCtrl.js
index be7631f..905f270 100644
--- a/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/ctrl/detailCtrl.js
+++ b/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/ctrl/detailCtrl.js
@@ -123,6 +123,25 @@
                                $scope.endTimestamp = $scope.job.endTime;
                                $scope.isRunning = !$scope.job.currentState || 
($scope.job.currentState || "").toUpperCase() === 'RUNNING';
 
+
+                               // =============================== task attempt 
===============================
+                               if ($scope.job.currentState === 'FAILED') {
+                                       $scope.taskAttemptList = 
JPM.list('TaskAttemptErrorCategoryService', {
+                                               site: $scope.job.tags.site,
+                                               jobId: $scope.job.tags.jobId
+                                       },
+                                               
Time($scope.startTimestamp).subtract(1, 'day'),
+                                               
Time($scope.endTimestamp).add(1, 'day'));
+                                       $scope.taskAttemptCategories = {};
+                                       
$scope.taskAttemptList._promise.then(function () {
+                                               $.each($scope.taskAttemptList, 
function (i, attempt) {
+                                                       
$scope.taskAttemptCategories[attempt.tags.errorCategory] =
+                                                               
($scope.taskAttemptCategories[attempt.tags.errorCategory] || 0) + 1;
+                                               });
+                                       });
+                               }
+
+                               // ================================ dashboards 
================================
                                // Dashboard 1: Allocated MB
                                metric_allocatedMB = JPM.metrics(jobCond, 
"hadoop.job.allocatedmb", startTime, endTime);
 

http://git-wip-us.apache.org/repos/asf/eagle/blob/2adbbf59/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/partials/job/detail.html
----------------------------------------------------------------------
diff --git 
a/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/partials/job/detail.html 
b/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/partials/job/detail.html
index fb8f7b8..359b043 100644
--- 
a/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/partials/job/detail.html
+++ 
b/eagle-jpm/eagle-jpm-web/src/main/webapp/app/apps/jpm/partials/job/detail.html
@@ -170,6 +170,56 @@
        </div>
 </div>
 
+<!-- Task attempt -->
+<div class="box box-primary collapsed-box" ng-if="job.currentState === 
'FAILED'">
+       <div class="box-header with-border">
+               <h3 class="box-title">
+                       Error Task Attempts
+
+                       <small>
+                               (<span ng-repeat="(category, count) in 
taskAttemptCategories track by $index" class="text-primary">
+                                       <span ng-if="$index !== 0">, </span>
+                                       {{category}}: {{count}}
+                               </span>)
+                       </small>
+
+                       <span ng-show="!taskAttemptList._done" class="fa 
fa-refresh fa-spin no-animate"></span>
+               </h3>
+               <div class="box-tools pull-right">
+                       <button type="button" class="btn btn-box-tool" 
data-widget="collapse">
+                               <i class="fa fa-plus"></i>
+                       </button>
+               </div>
+       </div>
+       <div class="box-body">
+               <div sort-table="taskAttemptList" is-sorting="isSorting" 
class="table-responsive" max-size="7" ng-show="taskAttemptList._done">
+                       <table class="table table-bordered">
+                               <thead>
+                               <tr>
+                                       <th sortpath="startTime">Start Time</th>
+                                       <th sortpath="endTime">End Time</th>
+                                       <th sortpath="tags.hostname">Host</th>
+                                       <th sortpath="tags.taskType">Type</th>
+                                       <th 
sortpath="tags.taskType">Attempt</th>
+                                       <th sortpath="tags.errorCategory">Error 
Category</th>
+                               </tr>
+                               </thead>
+                               <tbody>
+                               <tr ng-repeat="item in jobList">
+                                       <td>{{Time.format(item.startTime)}}</td>
+                                       <td>{{Time.format(item.endTime)}}</td>
+                                       <td>{{item.tags.hostname || "-"}}</td>
+                                       <td>{{item.tags.taskType || "-"}}</td>
+                                       <td>{{item.tags.taskAttemptId || 
"-"}}</td>
+                                       <td>{{item.tags.errorCategory || 
"-"}}</td>
+                               </tr>
+                               </tbody>
+                       </table>
+               </div>
+       </div>
+</div>
+
+<!-- Dashboard -->
 <div class="box box-primary">
        <div class="box-header with-border">
                <h3 class="box-title">

http://git-wip-us.apache.org/repos/asf/eagle/blob/2adbbf59/eagle-server/src/main/webapp/app/dev/public/js/components/sortTable.js
----------------------------------------------------------------------
diff --git 
a/eagle-server/src/main/webapp/app/dev/public/js/components/sortTable.js 
b/eagle-server/src/main/webapp/app/dev/public/js/components/sortTable.js
index a1e91df..7a312c9 100644
--- a/eagle-server/src/main/webapp/app/dev/public/js/components/sortTable.js
+++ b/eagle-server/src/main/webapp/app/dev/public/js/components/sortTable.js
@@ -37,6 +37,7 @@
                         * @param {string?} $attrs.scope                        
Will bind parent variable of current scope
                         * @param {string?} $attrs.sortpath                     
Default sort path
                         * @param {[]?} $attrs.searchPathList           Filter 
search path list
+                        * @param {string?} $attrs.maxSize                      
Set max display size of page
                         */
                        controller: function($scope, $element, $attrs) {
                                var sortmatch;
@@ -49,7 +50,7 @@
                                // Initialization
                                $scope.pageNumber = 1;
                                $scope.pageSize = 10;
-                               $scope.maxSize = 10;
+                               $scope.maxSize = $attrs.maxSize || 10;
                                $scope.search = "";
                                $scope.orderKey = "";
                                $scope.orderAsc = true;

http://git-wip-us.apache.org/repos/asf/eagle/blob/2adbbf59/eagle-server/src/main/webapp/app/dev/public/js/components/widget.js
----------------------------------------------------------------------
diff --git 
a/eagle-server/src/main/webapp/app/dev/public/js/components/widget.js 
b/eagle-server/src/main/webapp/app/dev/public/js/components/widget.js
index bc59b3c..cbb4e2b 100644
--- a/eagle-server/src/main/webapp/app/dev/public/js/components/widget.js
+++ b/eagle-server/src/main/webapp/app/dev/public/js/components/widget.js
@@ -29,13 +29,19 @@
                        controller: function($scope, $element, $attrs) {
                        },
                        compile: function ($element) {
-                               $element.contents().remove();
+                               var $content = $element.contents().remove();
 
                                return {
                                        post: function preLink($scope, 
$element) {
                                                var widget = $scope.widget;
                                                $scope.site = Site.current();
 
+                                               // If not set widget, skip 
dynamic render. (AdminLTE use `data-widget` as attr key)
+                                               if (!widget) {
+                                                       
$element.append($content);
+                                                       return;
+                                               }
+
                                                if(widget.renderFunc) {
                                                        // Prevent auto compile 
if return false
                                                        
if(widget.renderFunc($element, $scope, $compile) !== false) {

Reply via email to