You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ja...@apache.org on 2015/04/17 21:39:59 UTC

ambari git commit: AMBARI-10557. Integrate widgets comprising of a specific host component metrics. (jaimin)

Repository: ambari
Updated Branches:
  refs/heads/trunk 12d608141 -> e7643d5eb


AMBARI-10557. Integrate widgets comprising of a specific host component metrics. (jaimin)


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

Branch: refs/heads/trunk
Commit: e7643d5eb34621c5fb1256aac8625b970c43dc8e
Parents: 12d6081
Author: Jaimin Jetly <ja...@hortonworks.com>
Authored: Fri Apr 17 12:39:44 2015 -0700
Committer: Jaimin Jetly <ja...@hortonworks.com>
Committed: Fri Apr 17 12:39:44 2015 -0700

----------------------------------------------------------------------
 .../common-services/HDFS/2.1.0.2.0/metrics.json |  2 +-
 .../common-services/HDFS/2.1.0.2.0/widgets.json |  8 +--
 ambari-web/app/mixins/common/widget_mixin.js    | 71 +++++++++++++++++---
 ambari-web/app/utils/ajax/ajax.js               |  7 +-
 .../views/common/widget/graph_widget_view.js    | 64 +++++++++++-------
 .../test/mixins/common/widget_mixin_test.js     | 31 ++++++---
 6 files changed, 134 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metrics.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metrics.json b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metrics.json
index 07f36bb..53575de 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metrics.json
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metrics.json
@@ -622,7 +622,7 @@
             },
             "metrics/dfs/FSNamesystem/UnderReplicatedBlocks": {
               "metric": "dfs.FSNamesystem.UnderReplicatedBlocks",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/rpcdetailed/sendHeartbeat_avg_time": {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
index 8332d25..622ee03 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
@@ -209,16 +209,16 @@
           "is_visible": true,
           "metrics": [
             {
-              "name": "Hadoop:service=DataNode,name=DataNode.CorruptBlocks",
+              "name": "Hadoop:service=NameNode,name=FSNamesystem.CorruptBlocks",
               "metric_path": "metrics/dfs/FSNamesystem/CorruptBlocks",
               "service_name": "HDFS",
-              "component_name": "DATANODE"
+              "component_name": "NAMENODE"
             }
           ],
           "values": [
             {
               "name": "Corrupted Blocks",
-              "value": "${Hadoop:service=DataNode,name=DataNode.CorruptBlocks}"
+              "value": "${Hadoop:service=NameNode,name=FSNamesystem.CorruptBlocks}"
             }
           ],
           "properties": {
@@ -234,7 +234,7 @@
               "name": "Hadoop:service=NameNode,name=FSNamesystem.UnderReplicatedBlocks",
               "metric_path": "metrics/dfs/FSNamesystem/UnderReplicatedBlocks",
               "service_name": "HDFS",
-              "component_name": "DATANODE"
+              "component_name": "NAMENODE"
             }
           ],
           "values": [

http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-web/app/mixins/common/widget_mixin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/widget_mixin.js b/ambari-web/app/mixins/common/widget_mixin.js
index a9a6d59..35b11b1 100644
--- a/ambari-web/app/mixins/common/widget_mixin.js
+++ b/ambari-web/app/mixins/common/widget_mixin.js
@@ -36,7 +36,7 @@ App.WidgetMixin = Ember.Mixin.create({
    * @type {RegExp}
    * @const
    */
-  VALUE_NAME_REGEX: /[\w\.\:\=\[\]]+/g,
+  VALUE_NAME_REGEX: /[\w\.\,\:\=\[\]]+/g,
 
   /**
    * common metrics container
@@ -73,7 +73,7 @@ App.WidgetMixin = Ember.Mixin.create({
       request = requestData[i];
       requestCounter++;
       if (request.host_component_criteria) {
-        this.getHostComponentMetrics(request).complete(function () {
+        this.getHostComponentMetrics(request).always(function () {
           requestCounter--;
           if (requestCounter === 0) self.onMetricsLoaded();
         });
@@ -92,11 +92,11 @@ App.WidgetMixin = Ember.Mixin.create({
    */
   getRequestData: function (metrics) {
     var requestsData = {};
-
     if (metrics) {
       metrics.forEach(function (metric, index) {
         var key;
         if (metric.host_component_criteria) {
+          this.tweakHostComponentCriteria(metric);
           key = metric.service_name + '_' + metric.component_name + '_' + metric.host_component_criteria;
         } else {
           key = metric.service_name + '_' + metric.component_name;
@@ -116,6 +116,25 @@ App.WidgetMixin = Ember.Mixin.create({
   },
 
   /**
+   * Tweak necessary host component criteria
+   * NameNode HA host component criteria is applicable only in HA mode
+   */
+  tweakHostComponentCriteria: function (metric) {
+    switch (metric.component_name) {
+      case 'NAMENODE':
+        if (metric.host_component_criteria === 'host_components/metrics/dfs/FSNamesystem/HAState=active') {
+          //if (metric.host_component_criteria)
+          var hdfs = App.HDFSService.find().objectAt(0);
+          var activeNNHostName = !hdfs.get('snameNode') && hdfs.get('activeNameNode');
+          if (!activeNNHostName) {
+            metric.host_component_criteria = 'host_components/HostRoles/component_name=NAMENODE';
+          }
+        }
+        break;
+    }
+  },
+
+  /**
    * make GET call to server in order to fetch service-component metrics
    * @param {object} request
    * @returns {$.ajax}
@@ -134,21 +153,53 @@ App.WidgetMixin = Ember.Mixin.create({
   },
 
   /**
-   * make GET call to server in order to fetch host-component metrics
+   * make GET call to server in order to fetch service-component metrics
    * @param {object} request
-   * @returns {$.ajax}
+   * @returns {$.Deferred}
    */
   getHostComponentMetrics: function (request) {
+    var dfd;
+    var self = this;
+    dfd = $.Deferred();
+    this.getHostComponentName(request).done(function (data) {
+      if (data) {
+        request.host_name = data.host_components[0].HostRoles.host_name;
+        App.ajax.send({
+          name: 'widgets.hostComponent.metrics.get',
+          sender: self,
+          data: {
+            componentName: request.component_name,
+            hostName: request.host_name,
+            metricPaths: request.metric_paths.join(',')
+          }
+        }).done(function(metricData) {
+          self.getMetricsSuccessCallback(metricData);
+          dfd.resolve();
+        }).fail(function(data){
+          dfd.reject();
+        });
+      }
+    }).fail(function(data){
+      dfd.reject();
+    });
+    return dfd.promise();
+  },
+
+  /**
+   * make GET call to server in order to fetch host-component names
+   * @param {object} request
+   * @returns {$.ajax}
+   */
+  getHostComponentName: function (request) {
     return App.ajax.send({
-      name: 'widgets.hostComponent.metrics.get',
+      name: 'widgets.hostComponent.get.hostName',
       sender: this,
       data: {
         serviceName: request.service_name,
         componentName: request.component_name,
         metricPaths: request.metric_paths.join(','),
-        hostComponentCriteria: 'host_components/HostRoles/' + request.host_component_criteria
-      },
-      success: 'getMetricsSuccessCallback'
+        hostComponentCriteria: request.host_component_criteria
+      }
     });
   },
 
@@ -175,7 +226,7 @@ App.WidgetMixin = Ember.Mixin.create({
     var self = this;
     this.set('isLoaded', true);
     this.drawWidget();
-    setTimeout(function() {
+    setTimeout(function () {
       self.loadMetrics();
     }, App.contentUpdateInterval);
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index d6c735b..1657196 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2473,8 +2473,13 @@ var urls = {
     mock: '/data/metrics/{serviceName}/Append_num_ops_&_Delete_num_ops.json'
   },
 
+  'widgets.hostComponent.get.hostName': {
+    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?{hostComponentCriteria}',
+    mock: '/data/metrics/{serviceName}/Append_num_ops.json'
+  },
+
   'widgets.hostComponent.metrics.get': {
-    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?{hostComponentCriteria}&fields={metricPaths}',
+    real: '/clusters/{clusterName}/hosts/{hostName}/host_components/{componentName}?fields={metricPaths}',
     mock: '/data/metrics/{serviceName}/Append_num_ops.json'
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-web/app/views/common/widget/graph_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/widget/graph_widget_view.js b/ambari-web/app/views/common/widget/graph_widget_view.js
index 8baa8cc..9e81eee 100644
--- a/ambari-web/app/views/common/widget/graph_widget_view.js
+++ b/ambari-web/app/views/common/widget/graph_widget_view.js
@@ -56,20 +56,20 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
   calculateValues: function () {
     var metrics = this.get('metrics');
     var seriesData = [];
-     if (this.get('content.values')) {
-       this.get('content.values').forEach(function (value) {
-         var expression = this.extractExpressions(value)[0];
-         var computedExpressions;
-
-         if (expression) {
-           computedExpressions = this.computeExpression(expression, metrics);
-           seriesData.push({
-             name: value.name,
-             data: computedExpressions[value.value.match(this.get('EXPRESSION_REGEX'))[0]]
-           });
-         }
-       }, this);
-     }
+    if (this.get('content.values')) {
+      this.get('content.values').forEach(function (value) {
+        var expression = this.extractExpressions(value)[0];
+        var computedExpressions;
+
+        if (expression) {
+          computedExpressions = this.computeExpression(expression, metrics);
+          seriesData.push({
+            name: value.name,
+            data: computedExpressions[value.value.match(this.get('EXPRESSION_REGEX'))[0]]
+          });
+        }
+      }, this);
+    }
     return seriesData;
   },
 
@@ -137,17 +137,31 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
    * @returns {$.ajax}
    */
   getHostComponentMetrics: function (request) {
-    return App.ajax.send({
-      name: 'widgets.hostComponent.metrics.get',
-      sender: this,
-      data: {
-        serviceName: request.service_name,
-        componentName: request.component_name,
-        metricPaths: this.addTimeProperties(request.metric_paths).join(','),
-        hostComponentCriteria: 'host_components/HostRoles/' + request.host_component_criteria
-      },
-      success: 'getMetricsSuccessCallback'
+    var dfd;
+    var self = this;
+    dfd = $.Deferred();
+    this.getHostComponentName(request).done(function (data) {
+      if (data) {
+        request.host_name = data.host_components[0].HostRoles.host_name;
+        App.ajax.send({
+          name: 'widgets.hostComponent.metrics.get',
+          sender: self,
+          data: {
+            componentName: request.component_name,
+            hostName: request.host_name,
+            metricPaths: self.addTimeProperties(request.metric_paths).join(',')
+          }
+        }).done(function(metricData) {
+          self.getMetricsSuccessCallback(metricData);
+          dfd.resolve();
+        }).fail(function(data){
+          dfd.reject();
+        });
+      }
+    }).fail(function(data){
+      dfd.reject();
     });
+    return dfd.promise();
   },
 
   /**
@@ -197,7 +211,7 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
     transformToSeries: function (seriesData) {
       var seriesArray = [];
 
-      seriesData.forEach(function(_series){
+      seriesData.forEach(function (_series) {
         seriesArray.push(this.transformData(_series.data, _series.name));
       }, this);
       return seriesArray;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e7643d5e/ambari-web/test/mixins/common/widget_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widget_mixin_test.js b/ambari-web/test/mixins/common/widget_mixin_test.js
index 9ef82a4..f29eb66 100644
--- a/ambari-web/test/mixins/common/widget_mixin_test.js
+++ b/ambari-web/test/mixins/common/widget_mixin_test.js
@@ -25,7 +25,7 @@ describe('App.WidgetMixin', function() {
     var mixinObject = mixinClass.create();
     beforeEach(function () {
       this.mock = sinon.stub(mixinObject, 'getRequestData');
-      sinon.stub(mixinObject, 'getHostComponentMetrics').returns({complete: function(callback){
+      sinon.stub(mixinObject, 'getHostComponentMetrics').returns({always: function(callback){
         callback();
       }});
       sinon.stub(mixinObject, 'getServiceComponentMetrics').returns({complete: function(callback){
@@ -208,14 +208,31 @@ describe('App.WidgetMixin', function() {
   describe("#getHostComponentMetrics()", function () {
     var mixinObject = mixinClass.create();
     before(function () {
-      sinon.stub(App.ajax, 'send');
+      sinon.stub(App.ajax, 'send').returns({done: function(callback){
+        callback();
+        return this;
+      },fail: function(callback){
+        callback();
+        return this;
+      }});
+      sinon.stub(mixinObject, 'getHostComponentName').returns({done: function(callback){
+        var data = {host_components: [{HostRoles:{host_name:"c6401"}}]};
+        callback(data);
+        return this;
+      },fail: function(callback){
+        callback();
+        return this;
+      }});
+
+      sinon.stub(mixinObject, 'getMetricsSuccessCallback')
     });
     after(function () {
       App.ajax.send.restore();
+      mixinObject.getHostComponentName.restore();
+      mixinObject.getMetricsSuccessCallback.restore();
     });
     it("", function () {
       var request = {
-        service_name: 'S1',
         component_name: 'C1',
         metric_paths: ['w1', 'w2'],
         host_component_criteria: 'c1'
@@ -225,12 +242,10 @@ describe('App.WidgetMixin', function() {
         name: 'widgets.hostComponent.metrics.get',
         sender: mixinObject,
         data: {
-          serviceName: 'S1',
           componentName: 'C1',
-          metricPaths: 'w1,w2',
-          hostComponentCriteria: 'host_components/HostRoles/c1'
-        },
-        success: 'getMetricsSuccessCallback'
+          hostName: "c6401",
+          metricPaths: 'w1,w2'
+        }
       })
     });
   });