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 <[email protected]> Authored: Mon Aug 5 14:49:59 2013 -0700 Committer: Srimanth Gunturi <[email protected]> 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(),
