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(),