You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2013/08/05 23:58:16 UTC

git commit: AMBARI-2811. UI graphs should handle possibility of data being a single 0. (srimanth)

Updated Branches:
  refs/heads/trunk 651d870c9 -> e7590a8aa


AMBARI-2811. UI graphs should handle possibility of data being a single 0. (srimanth)


Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/e7590a8a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/e7590a8a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/e7590a8a

Branch: refs/heads/trunk
Commit: e7590a8aa345bbc9d246eb8603f2b1e325836542
Parents: 651d870
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Mon Aug 5 14:49:59 2013 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Mon Aug 5 14:50:03 2013 -0700

----------------------------------------------------------------------
 ambari-web/app/messages.js                      | 15 ++--
 ambari-web/app/models/service/yarn.js           | 27 ++++++-
 ambari-web/app/utils/ajax.js                    | 13 +++-
 ambari-web/app/utils/object_utils.js            | 21 ++++++
 .../app/views/common/chart/linear_time.js       | 10 ++-
 .../info/metrics/yarn/allocated_container.js    |  8 +--
 .../views/main/service/info/metrics/yarn/nms.js |  2 +-
 .../views/main/service/info/metrics/yarn/qmr.js | 75 ++++++++++++--------
 .../app/views/main/service/info/summary.js      | 12 ++--
 9 files changed, 130 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index e363ff0..8a0fbb3 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -909,25 +909,24 @@ Em.I18n.translations = {
 
   'services.service.info.metrics.yarn.gc': 'Garbage Collection',
   'services.service.info.metrics.yarn.gc.displayNames.gcTimeMillis':'Time',
-  'services.service.info.metrics.yarn.allocated.memory': 'Allocated Memory',
+  'services.service.info.metrics.yarn.allocated.memory': 'Cluster Memory',
   'services.service.info.metrics.yarn.allocated.memory.displayNames.allocated': 'Allocated',
   'services.service.info.metrics.yarn.allocated.memory.displayNames.available': 'Available',
   'services.service.info.metrics.yarn.allocated.memory.displayNames.pending': 'Pending',
-  'services.service.info.metrics.yarn.allocated.container': 'Allocated Container',
+  'services.service.info.metrics.yarn.allocated.container': 'Containers',
   'services.service.info.metrics.yarn.allocated.container.displayNames.allocated': 'Allocated',
   'services.service.info.metrics.yarn.allocated.container.displayNames.reserved': 'Reserved',
   'services.service.info.metrics.yarn.allocated.container.displayNames.pending': 'Pending',
-  'services.service.info.metrics.yarn.nodemanager.statuses':'Nodemanager statuses',
+  'services.service.info.metrics.yarn.nodemanager.statuses':'NodeManagers',
   'services.service.info.metrics.yarn.nodemanager.statuses.displayNames.active':'Active Nodemanagers',
   'services.service.info.metrics.yarn.nodemanager.statuses.displayNames.decommissioned':'Decommissioned Nodemanagers',
   'services.service.info.metrics.yarn.nodemanager.statuses.displayNames.lost':'Lost Nodemanagers',
   'services.service.info.metrics.yarn.nodemanager.statuses.displayNames.rebooted':'Rebooted Nodemanagers',
   'services.service.info.metrics.yarn.nodemanager.statuses.displayNames.unhealthy':'Unhealthy Nodemanagers',
-  'services.service.info.metrics.yarn.queueMemoryResource':'Queue memory resource',
-  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.allocated':'Allocated',
-  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.available':'Available',
-  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.allocated.default':'Allocated default',
-  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.available.default':'Available default',
+  'services.service.info.metrics.yarn.queueMemoryResource':'Queue Memory',
+  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.allocated':'Allocated ({0})',
+  'services.service.info.metrics.yarn.queueMemoryResource.displayNames.available':'Available ({0})',
+  'services.service.info.metrics.yarn.queueMemoryResource.displayName':'Queue Memory ({0})',
 
   'services.service.info.menu.summary':'Summary',
   'services.service.info.menu.configs':'Configs',

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/models/service/yarn.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service/yarn.js b/ambari-web/app/models/service/yarn.js
index b094a9b..1eab2bb 100644
--- a/ambari-web/app/models/service/yarn.js
+++ b/ambari-web/app/models/service/yarn.js
@@ -52,7 +52,32 @@ App.YARNService = App.Service.extend({
   queuesCount: function() {
     var queue = JSON.parse(this.get('queue'));
     return objectUtils.recursiveKeysCount(queue);
-  }.property('queue')
+  }.property('queue'),
+  /** 
+   * Provides a flat array of queue names.
+   * Example: root, root/default
+   */
+  queueNames: function () {
+    var queueString = this.get('queue');
+    var queueNames = [];
+    if (queueString != null) {
+      var queues = JSON.parse(queueString);
+      var addQueues = function (queuesObj, path){
+        var names = [];
+        for ( var subQueue in queuesObj) {
+          if (queuesObj[subQueue] instanceof Object) {
+            var qFN = path=='' ? subQueue : path+'/'+subQueue;
+            names.push(qFN);
+            var subNames = addQueues(queuesObj[subQueue], qFN);
+            names = names.concat(subNames);
+          }
+        }
+        return names;
+      }
+      queueNames = addQueues(queues, '');
+    }
+    return queueNames;
+  }.property('queue'),
 });
 
 App.YARNService.FIXTURES = [];

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/utils/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js
index 2dda903..f6d2f37 100644
--- a/ambari-web/app/utils/ajax.js
+++ b/ambari-web/app/utils/ajax.js
@@ -442,8 +442,19 @@ var urls = {
     'testInProduction': true
   },
   'service.metrics.yarn.queue.memory.resource': {
-    'real': '/clusters/{clusterName}/hosts/{resourceManager}/host_components/RESOURCEMANAGER?fields=metrics/yarn/Queue/root/AllocatedMB[{fromSeconds},{toSeconds},{stepSeconds}],metrics/yarn/Queue/root/AvailableMB[{fromSeconds},{toSeconds},{stepSeconds}],metrics/yarn/Queue/root/default/AllocatedMB[{fromSeconds},{toSeconds},{stepSeconds}],metrics/yarn/Queue/root/default/AvailableMB[{fromSeconds},{toSeconds},{stepSeconds}]',
+    'real': '/clusters/{clusterName}/hosts/{resourceManager}/host_components/RESOURCEMANAGER?fields=',
     'mock': '',
+    'format': function (data, opt) {
+      var field1 = 'metrics/yarn/Queue/{queueName}/AllocatedMB[{fromSeconds},{toSeconds},{stepSeconds}]';
+      var field2 = 'metrics/yarn/Queue/{queueName}/AvailableMB[{fromSeconds},{toSeconds},{stepSeconds}]';
+      if (opt.url != null && data.queueNames != null) {
+        data.queueNames.forEach(function (q) {
+          data.queueName = q;
+          opt.url += (formatUrl(field1, data) + ",");
+          opt.url += (formatUrl(field2, data) + ",");
+        });
+      }
+    },
     'testInProduction': true
   },
   'dashboard.cluster_metrics.cpu': {

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/utils/object_utils.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/object_utils.js b/ambari-web/app/utils/object_utils.js
index e2bf63b..f204db9 100644
--- a/ambari-web/app/utils/object_utils.js
+++ b/ambari-web/app/utils/object_utils.js
@@ -58,6 +58,27 @@ module.exports = {
       return str;
     }
     return r(obj, 0);
+  },
+  
+  /**
+   * Gets value of property path.
+   * 
+   * @param propertyPath
+   *          Format is 'a.b.c'
+   * @return Returns <code>undefined</code> when path does not exist.
+   */
+  getProperty: function (object, propertyPath) {
+    var props = propertyPath.split('.');
+    for ( var c = 0; c < props.length - 1 && object; c++) {
+      object = object[props[c]];
+      if (object === null) {
+        break;
+      }
+    }
+    if (object != null) {
+      return object[props[props.length - 1]];
+    }
+    return undefined;
   }
 
 };

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/views/common/chart/linear_time.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/chart/linear_time.js b/ambari-web/app/views/common/chart/linear_time.js
index 63f8795..44f5ffb 100644
--- a/ambari-web/app/views/common/chart/linear_time.js
+++ b/ambari-web/app/views/common/chart/linear_time.js
@@ -241,11 +241,19 @@ App.ChartLinearTimeView = Ember.View.extend({
    */
   transformData: function (seriesData, displayName) {
     var seriesArray = [];
-    if (seriesData) {
+    if (seriesData != null) {
       // Is it a string?
       if ("string" == typeof seriesData) {
         seriesData = JSON.parse(seriesData);
       }
+      // Is it a number?
+      if ("number" == typeof seriesData) {
+        // Same number applies to all time.
+        var number = seriesData;
+        seriesData = [];
+        seriesData.push([number, new Date().getTime()-(60*60)]);
+        seriesData.push([number, new Date().getTime()]);
+      }
       // We have valid data
       var series = {};
       series.name = displayName;

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/views/main/service/info/metrics/yarn/allocated_container.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/info/metrics/yarn/allocated_container.js b/ambari-web/app/views/main/service/info/metrics/yarn/allocated_container.js
index 16bf089..e3110b8 100644
--- a/ambari-web/app/views/main/service/info/metrics/yarn/allocated_container.js
+++ b/ambari-web/app/views/main/service/info/metrics/yarn/allocated_container.js
@@ -34,10 +34,10 @@ App.ChartServiceMetricsYARN_AllocatedContainer = App.ChartLinearTimeView.extend(
 
   transformToSeries: function (jsonData) {
     var seriesArray = [];
-    if (jsonData && jsonData.metrics && jsonData.metrics.yarn.Queue.root) {
-      for (var name in jsonData.metrics.yarn.Queue.root) {
+    if (jsonData && jsonData.metrics && jsonData.metrics.yarn.Queue) {
+      for (var name in jsonData.metrics.yarn.Queue) {
         var displayName;
-        var seriesData = jsonData.metrics.yarn.Queue.root[name];
+        var seriesData = jsonData.metrics.yarn.Queue[name];
         switch (name) {
           case "ReservedContainers":
             displayName = Em.I18n.t('services.service.info.metrics.yarn.allocated.container.displayNames.reserved');
@@ -51,7 +51,7 @@ App.ChartServiceMetricsYARN_AllocatedContainer = App.ChartLinearTimeView.extend(
           default:
             break;
         }
-        if (seriesData) {
+        if (seriesData != null) {
           seriesArray.push(this.transformData(seriesData, displayName));
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/views/main/service/info/metrics/yarn/nms.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/info/metrics/yarn/nms.js b/ambari-web/app/views/main/service/info/metrics/yarn/nms.js
index a2129be..14cc2a8 100644
--- a/ambari-web/app/views/main/service/info/metrics/yarn/nms.js
+++ b/ambari-web/app/views/main/service/info/metrics/yarn/nms.js
@@ -57,7 +57,7 @@ App.ChartServiceMetricsYARN_NMS = App.ChartLinearTimeView.extend({
           default:
             break;
         }
-        if (seriesData) {
+        if (seriesData != null) {
           seriesArray.push(this.transformData(seriesData, displayName));
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/views/main/service/info/metrics/yarn/qmr.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/info/metrics/yarn/qmr.js b/ambari-web/app/views/main/service/info/metrics/yarn/qmr.js
index 39a7166..d82635a 100644
--- a/ambari-web/app/views/main/service/info/metrics/yarn/qmr.js
+++ b/ambari-web/app/views/main/service/info/metrics/yarn/qmr.js
@@ -5,9 +5,9 @@
  * licenses this file to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,12 +16,13 @@
  */
 
 var App = require('app');
+var objUtils = require('utils/object_utils');
 
 /**
  * @class
- *
+ * 
  * This is a view for showing cluster CPU metrics
- *
+ * 
  * @extends App.ChartLinearTimeView
  * @extends Ember.Object
  * @extends Ember.View
@@ -31,40 +32,52 @@ App.ChartServiceMetricsYARN_QMR = App.ChartLinearTimeView.extend({
   title: Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource'),
   renderer: 'line',
   ajaxIndex: 'service.metrics.yarn.queue.memory.resource',
+  yAxisFormatter: App.ChartLinearTimeView.PercentageFormatter,
+
+  getDataForAjaxRequest: function () {
+    var data = this._super();
+    var svc = App.YARNService.find().objectAt(0);
+    var queueNames = [];
+    if (svc != null) {
+      queueNames = svc.get('queueNames');
+    }
+    data.queueNames = queueNames;
+    return data;
+  },
 
   transformToSeries: function (jsonData) {
+    var self = this;
     var seriesArray = [];
-    if (jsonData && jsonData.metrics && jsonData.metrics.yarn.Queue.root) {
-      for (var name in jsonData.metrics.yarn.Queue.root) {
+    var MB = Math.pow(2, 20);
+    var svc = App.YARNService.find().objectAt(0);
+    var queueNames = [];
+    if (svc != null) {
+      queueNames = svc.get('queueNames');
+    }
+    if (jsonData && jsonData.metrics && jsonData.metrics.yarn.Queue) {
+      queueNames.forEach(function (qName) {
+        var qPath = qName.replace('/', '.');
         var displayName;
-        var seriesData = jsonData.metrics.yarn.Queue.root[name];
-        switch (name) {
-          case "AllocatedMB":
-            displayName = Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource.displayNames.allocated');
-            break;
-          case "AvailableMB":
-            displayName = Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource.displayNames.available');
-            break;
-          default:
-            for (var name in jsonData.metrics.yarn.Queue.root.default) {
-              seriesData = jsonData.metrics.yarn.Queue.root.default[name];
-              switch (name) {
-                case "AllocatedMB":
-                  displayName = Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource.displayNames.allocated.default');
-                  break;
-                case "AvailableMB":
-                  displayName = Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource.displayNames.available.default');
-                  break;
-                default:
-                  break;
-              }
+        var allocatedData = objUtils.getProperty(jsonData.metrics.yarn.Queue, qPath + '.AllocatedMB');
+        var availableData = objUtils.getProperty(jsonData.metrics.yarn.Queue, qPath + '.AvailableMB');
+        displayName = Em.I18n.t('services.service.info.metrics.yarn.queueMemoryResource.displayName').format(qName);
+        var seriesData = null;
+        if (allocatedData != null && availableData != null) {
+          if (typeof allocatedData == "number" && typeof availableData == "number") {
+            seriesData = (allocatedData * 100) / availableData;
+          } else if (allocatedData.length == availableData.length) {
+            seriesData = [];
+            for ( var c = 0; c < allocated.length; c++) {
+              seriesData.push([ (allocatedData[c][0] * 100) / availableData[c][0] ], allocatedData[c][1]);
             }
-            break;
+          } else {
+            console.log("Skipping data series for Queue " + qName);
+          }
         }
-        if (seriesData) {
-          seriesArray.push(this.transformData(seriesData, displayName));
+        if (seriesData != null) {
+          seriesArray.push(self.transformData(seriesData, displayName));
         }
-      }
+      });
     }
     return seriesArray;
   }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e7590a8a/ambari-web/app/views/main/service/info/summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/info/summary.js b/ambari-web/app/views/main/service/info/summary.js
index 4c7beae..741b2e1 100644
--- a/ambari-web/app/views/main/service/info/summary.js
+++ b/ambari-web/app/views/main/service/info/summary.js
@@ -334,14 +334,14 @@ App.MainServiceInfoSummaryView = Em.View.extend({
             App.ChartServiceMetricsYARN_TasksRunningWaiting.extend(),
             App.ChartServiceMetricsYARN_MapSlots.extend(),
             App.ChartServiceMetricsYARN_ReduceSlots.extend()]*/
-            [[App.ChartServiceMetricsYARN_RPC.extend(),
+            [[App.ChartServiceMetricsYARN_AllocatedMemory.extend(),
+              App.ChartServiceMetricsYARN_QMR.extend(),
+              App.ChartServiceMetricsYARN_AllocatedContainer.extend(),
+              App.ChartServiceMetricsYARN_NMS.extend()],
+            [App.ChartServiceMetricsYARN_RPC.extend(),
             App.ChartServiceMetricsYARN_GC.extend(),
             App.ChartServiceMetricsYARN_JVMHeap.extend(),
-            App.ChartServiceMetricsYARN_JVMThreads.extend()],
-            [App.ChartServiceMetricsYARN_AllocatedMemory.extend(),
-             App.ChartServiceMetricsYARN_AllocatedContainer.extend(),
-             App.ChartServiceMetricsYARN_NMS.extend(),
-             App.ChartServiceMetricsYARN_QMR.extend()]];
+            App.ChartServiceMetricsYARN_JVMThreads.extend()]];
           break;
         case 'mapreduce':
           graphs = [ [App.ChartServiceMetricsMapReduce_JobsStatus.extend(),