Repository: hadoop
Updated Branches:
  refs/heads/HDFS-7240 f76819c7c -> 7ace05b3f


http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.css
----------------------------------------------------------------------
diff --git a/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.css 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.css
new file mode 100644
index 0000000..271ac74
--- /dev/null
+++ b/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.css
@@ -0,0 +1,60 @@
+/**
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF 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 License for the specific language governing permissions and
+ *  limitations under the License.
+*/
+body {
+    padding: 40px;
+    padding-top: 60px;
+}
+.starter-template {
+    padding: 40px 15px;
+    text-align: center;
+}
+
+
+.btn {
+    border: 0 none;
+    font-weight: 700;
+    letter-spacing: 1px;
+    text-transform: uppercase;
+}
+
+.btn:focus, .btn:active:focus, .btn.active:focus {
+    outline: 0 none;
+}
+
+.table-striped > tbody > tr:nth-child(2n+1).selectedtag > td:hover {
+    background-color: #3276b1;
+}
+.table-striped > tbody > tr:nth-child(2n+1).selectedtag > td {
+    background-color: #3276b1;
+}
+.tagPanel tr.selectedtag td {
+    background-color: #3276b1;
+}
+.top-buffer { margin-top:4px; }
+
+
+.sortorder:after {
+    content: '\25b2';   // BLACK UP-POINTING TRIANGLE
+}
+.sortorder.reverse:after {
+    content: '\25bc';   // BLACK DOWN-POINTING TRIANGLE
+}
+
+.wrap-table{
+    word-wrap: break-word;
+    table-layout: fixed;
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.js
----------------------------------------------------------------------
diff --git a/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.js 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.js
new file mode 100644
index 0000000..37cafef
--- /dev/null
+++ b/hadoop-hdsl/framework/src/main/resources/webapps/static/ozone.js
@@ -0,0 +1,355 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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 License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+    "use strict";
+
+    var isIgnoredJmxKeys = function (key) {
+        return key == 'name' || key == 'modelerType' || key == "$$hashKey" ||
+            key.match(/tag.*/);
+    };
+    angular.module('ozone', ['nvd3', 'ngRoute']);
+    angular.module('ozone').config(function ($routeProvider) {
+        $routeProvider
+            .when("/", {
+                templateUrl: "main.html"
+            })
+            .when("/metrics/rpc", {
+                template: "<rpc-metrics></rpc-metrics>"
+            })
+            .when("/config", {
+                template: "<config></config>"
+            })
+    });
+    angular.module('ozone').component('overview', {
+        templateUrl: 'static/templates/overview.html',
+        transclude: true,
+        controller: function ($http) {
+            var ctrl = this;
+            
$http.get("jmx?qry=Hadoop:service=*,name=*,component=ServerRuntime")
+                .then(function (result) {
+                    ctrl.jmx = result.data.beans[0]
+                })
+        }
+    });
+    angular.module('ozone').component('jvmParameters', {
+        templateUrl: 'static/templates/jvm.html',
+        controller: function ($http) {
+            var ctrl = this;
+            $http.get("jmx?qry=java.lang:type=Runtime")
+                .then(function (result) {
+                    ctrl.jmx = result.data.beans[0];
+
+                    //convert array to a map
+                    var systemProperties = {};
+                    for (var idx in ctrl.jmx.SystemProperties) {
+                        var item = ctrl.jmx.SystemProperties[idx];
+                        systemProperties[item.key.replace(/\./g, "_")] = 
item.value;
+                    }
+                    ctrl.jmx.SystemProperties = systemProperties;
+                })
+        }
+    });
+
+    angular.module('ozone').component('rpcMetrics', {
+        template: '<h1>Rpc metrics</h1><tabs>' +
+        '<pane ng-repeat="metric in $ctrl.metrics" ' +
+        'title="{{metric[\'tag.serverName\']}} ({{metric[\'tag.port\']}})">' +
+        '<rpc-metric jmxdata="metric"></rpc-metric></pane>' +
+        '</tabs>',
+        controller: function ($http) {
+            var ctrl = this;
+            $http.get("jmx?qry=Hadoop:service=*,name=RpcActivityForPort*")
+                .then(function (result) {
+                    ctrl.metrics = result.data.beans;
+                })
+        }
+    });
+    angular.module('ozone').component('rpcMetric', {
+        bindings: {
+            jmxdata: '<'
+        },
+        templateUrl: 'static/templates/rpc-metrics.html',
+        controller: function () {
+            var ctrl = this;
+
+
+            ctrl.percentileGraphOptions = {
+                chart: {
+                    type: 'discreteBarChart',
+                    height: 450,
+                    margin: {
+                        top: 20,
+                        right: 20,
+                        bottom: 50,
+                        left: 55
+                    },
+                    x: function (d) {
+                        return d.label;
+                    },
+                    y: function (d) {
+                        return d.value;
+                    },
+                    showValues: true,
+                    valueFormat: function (d) {
+                        return d3.format(',.1f')(d);
+                    },
+                    duration: 500,
+                    xAxis: {
+                        axisLabel: 'Percentage'
+                    },
+                    yAxis: {
+                        axisLabel: 'Latency (ms)',
+                        axisLabelDistance: -10
+                    }
+                }
+            };
+
+            ctrl.$onChanges = function (data) {
+                var groupedMetrics = {}
+
+                var createPercentageMetrics = function (metricName, window) {
+                    groupedMetrics.percentiles = groupedMetrics['percentiles'] 
|| {}
+                    groupedMetrics.percentiles[window] = 
groupedMetrics.percentiles[window] || {};
+                    groupedMetrics.percentiles[window][metricName] = 
groupedMetrics.percentiles[window][metricName] || {
+                            graphdata: [{
+                                key: window,
+                                values: []
+                            }], numOps: 0
+                        };
+
+                };
+                var metrics = ctrl.jmxdata;
+                for (var key in metrics) {
+                    var percentile = 
key.match(/(.*Time)(\d+s)(\d+th)PercentileLatency/);
+                    var percentileNumOps = key.match(/(.*Time)(\d+s)NumOps/);
+                    var successFailures = key.match(/(.*)(Success|Failures)/);
+                    var numAverages = key.match(/(.*Time)(NumOps|AvgTime)/);
+                    if (percentile) {
+                        var metricName = percentile[1];
+                        var window = percentile[2];
+                        var percentage = percentile[3]
+                        createPercentageMetrics(metricName, window);
+
+
+                        
groupedMetrics.percentiles[window][metricName].graphdata[0]
+                            .values.push({
+                            label: percentage,
+                            value: metrics[key]
+                        })
+                    } else if (successFailures) {
+                        var metricName = successFailures[1];
+                        groupedMetrics.successfailures = 
groupedMetrics['successfailures'] || {}
+                        groupedMetrics.successfailures[metricName] = 
groupedMetrics.successfailures[metricName] || {
+                                success: 0,
+                                failures: 0
+                            };
+                        if (successFailures[2] == 'Success') {
+                            groupedMetrics.successfailures[metricName].success 
= metrics[key];
+                        } else {
+                            
groupedMetrics.successfailures[metricName].failures = metrics[key];
+                        }
+
+                    } else if (numAverages) {
+                        var metricName = numAverages[1];
+                        groupedMetrics.numavgs = groupedMetrics['numavgs'] || 
{}
+                        groupedMetrics.numavgs[metricName] = 
groupedMetrics.numavgs[metricName] || {
+                                numOps: 0,
+                                avgTime: 0
+                            };
+                        if (numAverages[2] == 'NumOps') {
+                            groupedMetrics.numavgs[metricName].numOps = 
metrics[key];
+                        } else {
+                            groupedMetrics.numavgs[metricName].avgTime = 
metrics[key];
+                        }
+
+                    } else if (percentileNumOps) {
+                        var metricName = percentileNumOps[1];
+                        var window = percentileNumOps[2];
+                        createPercentageMetrics(metricName, window);
+                        groupedMetrics.percentiles[window][metricName].numOps 
= metrics[key];
+                    } else if (isIgnoredJmxKeys(key)) {
+                        //ignore
+                    } else {
+                        groupedMetrics.others = groupedMetrics.others || [];
+                        groupedMetrics.others.push({
+                            'key': key,
+                            'value': metrics[key]
+                        });
+                    }
+
+                }
+                ctrl.metrics = groupedMetrics;
+            };
+
+        }
+    });
+    angular.module('ozone')
+        .component('tabs', {
+            transclude: true,
+            controller: function ($scope) {
+                var ctrl = this;
+                var panes = this.panes = [];
+                this.select = function (pane) {
+                    angular.forEach(panes, function (pane) {
+                        pane.selected = false;
+                    });
+                    pane.selected = true;
+                };
+                this.addPane = function (pane) {
+                    if (panes.length === 0) {
+                        this.select(pane);
+                    }
+                    panes.push(pane);
+                };
+                this.click = function(pane) {
+                    ctrl.select(pane);
+                }
+            },
+            template: '<div class="nav navtabs"><div class="row"><ul' +
+            ' class="nav nav-pills">' +
+            '<li ng-repeat="pane in $ctrl.panes" 
ng-class="{active:pane.selected}">' +
+            '<a href="" ng-click="$ctrl.click(pane)">{{pane.title}}</a> ' +
+            '</li> </ul></div><br/><div class="tab-content" 
ng-transclude></div> </div>'
+        })
+        .component('pane', {
+            transclude: true,
+            require: {
+                tabsCtrl: '^tabs'
+            },
+            bindings: {
+                title: '@'
+            },
+            controller: function () {
+                this.$onInit = function () {
+                    this.tabsCtrl.addPane(this);
+                };
+            },
+            template: '<div class="tab-pane" ng-if="$ctrl.selected" 
ng-transclude></div>'
+        });
+
+    angular.module('ozone').component('navmenu', {
+        bindings: {
+            metrics: '<'
+        },
+        templateUrl: 'static/templates/menu.html',
+        controller: function ($http) {
+            var ctrl = this;
+            ctrl.docs = false;
+            $http.head("docs/index.html")
+                .then(function (result) {
+                    ctrl.docs = true;
+                },function(){
+                    ctrl.docs = false;
+                });
+        }
+    });
+
+    angular.module('ozone').component('config', {
+        templateUrl: 'static/templates/config.html',
+        controller: function ($scope, $http) {
+            var ctrl = this;
+            ctrl.selectedTags = [];
+
+            $http.get("conf?cmd=getOzoneTags&group=ozone")
+                .then(function (response) {
+                    ctrl.tags = response.data;
+
+                    var excludedTags = ['CBLOCK', 'KSM', 'SCM'];
+                    for (var i = 0; i < excludedTags.length; i++) {
+                        var idx = ctrl.tags.indexOf(excludedTags[i]);
+                        // Remove CBLOCK related properties
+                        if (idx > -1) {
+                            ctrl.tags.splice(idx, 1);
+                        }
+                    }
+                    ctrl.loadAll();
+                });
+
+
+
+            ctrl.loadAll = function () {
+                console.log("Displaying all configs");
+                $http.get("conf?cmd=getPropertyByTag&tags=" + ctrl.tags + 
"&group=ozone").then(function (response) {
+                    ctrl.configs = response.data;
+                    console.log(ctrl.configs)
+                    for (var idx in ctrl.configs) {
+                        var tags = []
+                        var parsedTags = ctrl.configs[idx].tag.split(",");
+                        for (var t in parsedTags) {
+                            tags.push(parsedTags[t].trim())
+                        }
+                        ctrl.configs[idx].tag = tags;
+
+                    };
+                    ctrl.sortBy('name');
+                });
+            };
+
+            ctrl.tagFilter = function (value, index, array) {
+                if (!ctrl.selectedTags) {
+                    return true;
+                }
+                var selected = true;
+                for (var idx in ctrl.selectedTags) {
+                    selected = selected && 
(value.tag.indexOf(ctrl.selectedTags[idx]) > -1);
+                }
+                return selected;
+            };
+            ctrl.configFilter = function (config) {
+                return false;
+            };
+            ctrl.selected = function (tag) {
+                return ctrl.selectedTags.includes(tag);
+            };
+
+            ctrl.allSelected = function () {
+                return ctrl.selectedTags.indexOf('SCM') == -1
+                    && ctrl.selectedTags.indexOf('KSM') == -1
+            };
+
+            ctrl.switchto = function (tag) {
+                var tags = ctrl.selectedTags.filter(function (item) {
+                    return item != 'KSM' && item != 'SCM';
+                });
+                if (tag) {
+                    tags.push(tag);
+                }
+                ctrl.selectedTags = tags;
+            };
+
+            ctrl.select = function (tag) {
+                var tagIdx = ctrl.selectedTags.indexOf(tag);
+                if (tagIdx > -1) {
+                    ctrl.selectedTags = ctrl.selectedTags.filter(function 
(item) {
+                        return item != tag;
+                    });
+                } else {
+                    ctrl.selectedTags.push(tag);
+                }
+                console.log("Tags selected:" + ctrl.selectedTags);
+            };
+
+            ctrl.sortBy = function (propertyName) {
+                ctrl.reverse = (ctrl.propertyName === propertyName) ? 
!ctrl.reverse : false;
+                ctrl.propertyName = propertyName;
+            };
+
+        }
+    });
+
+})();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/config.html
----------------------------------------------------------------------
diff --git 
a/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/config.html 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/config.html
new file mode 100644
index 0000000..7ca0713
--- /dev/null
+++ 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/config.html
@@ -0,0 +1,91 @@
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF 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 License for the specific language governing permissions and
+    limitations under the License.
+  -->
+
+<div class="row top-buffer">
+  <div class="col-md-2">
+    <input type="text" class="form-control" placeholder="Search Properties"
+           name="search" ng-model="search.$">
+  </div>
+  <div class="col-md-10">
+    <div class="btn-group btn-group-justified">
+      <a class="btn"
+         ng-class="$ctrl.allSelected() ? 'btn-primary' :'btn-secondary'"
+         ng-click="$ctrl.switchto('')">All
+      </a>
+      <a class="btn"
+         ng-class="$ctrl.selected('KSM') ? 'btn-primary' :'btn-secondary'"
+         ng-click="$ctrl.switchto('KSM')">KSM</a>
+      <a class="btn"
+         ng-class="$ctrl.selected('SCM') ? 'btn-primary' :'btn-secondary'"
+         ng-click="$ctrl.switchto('SCM')">SCM</a>
+    </div>
+  </div>
+</div>
+<div class="row">
+  <div class="col-md-2">
+
+    <table class="table table-striped table-condensed tagPanel">
+      <colgroup>
+        <col class="col-md-12">
+      </colgroup>
+      <thead>
+      <tr>
+        <th>Tag</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr ng-click="$ctrl.select(tag)"
+          ng-class="$ctrl.selected(tag) ? 'selectedtag':''"
+          ng-repeat="tag in $ctrl.tags">
+        <td>{{tag}}</td>
+      </tr>
+      </tbody>
+    </table>
+  </div>
+  <div class="col-md-10">
+    <table class="table table-striped table-condensed table-hover wrap-table">
+      <thead>
+      <tr>
+        <th class="col-md-3" >
+          <a href="#" ng-click="$ctrl.sortBy('name')">Property</a>
+          <span class="sortorder" ng-show="propertyName === 'name'"
+                ng-class="{reverse: reverse}">
+
+              </span>
+        </th>
+        <th class="col-md-2" style="word-wrap: break-word;">
+          <a ng-click="$ctrl.sortBy('value')">Value</a>
+          <span class="sortorder" ng-show="propertyName === 'value'"
+                ng-class="{reverse: reverse}"></span>
+        </th>
+        <th class="col-md-7">
+          <a href="#" ng-click="$ctrl.sortBy('description')">Description</a>
+          <span class="sortorder" ng-show="propertyName === 'description'"
+                ng-class="{reverse: reverse}"></span>
+        </th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr ng-repeat="config in $ctrl.configs | filter:$ctrl.tagFilter | 
filter:search | orderBy:propertyName:reverse">
+        <td style="word-wrap: break-word;">{{config.name}}</td>
+        <td style="word-wrap: break-word;">{{config.value}}</td>
+        <td style="word-wrap: break-word;">{{config.description}}</td>
+      </tr>
+      </tbody>
+    </table>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/jvm.html
----------------------------------------------------------------------
diff --git 
a/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/jvm.html 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/jvm.html
new file mode 100644
index 0000000..c1f7d16
--- /dev/null
+++ b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/jvm.html
@@ -0,0 +1,26 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF 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 License for the specific language governing permissions and
+   limitations under the License.
+-->
+<table class="table table-bordered table-striped">
+    <tr>
+        <th>JVM:</th>
+        <td>{{$ctrl.jmx.SystemProperties.java_vm_name}} 
{{$ctrl.jmx.SystemProperties.java_vm_version}}</td>
+    </tr>
+    <tr>
+        <th>Input arguments:</th>
+        <td>{{$ctrl.jmx.InputArguments}}</td>
+    </tr>
+</table>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/menu.html
----------------------------------------------------------------------
diff --git 
a/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/menu.html 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/menu.html
new file mode 100644
index 0000000..95f1b48
--- /dev/null
+++ 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/menu.html
@@ -0,0 +1,60 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF 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 License for the specific language governing permissions and
+   limitations under the License.
+-->
+<div id="navbar" class="collapse navbar-collapse">
+    <ul class="nav navbar-nav" id="ui-tabs">
+        <li>
+            <a class="dropdown-toggle"
+               id="metricsMenu"
+               data-toggle="dropdown"
+               aria-haspopup="true"
+               aria-expanded="true">
+                Metrics
+                <span class="caret"></span>
+            </a>
+            <ul
+                class="dropdown-menu"
+                aria-labelledby="metricsMenu">
+                <li ng-repeat="(name, url) in $ctrl.metrics">
+                    <a ng-href="{{url}}">{{name}}<span
+                        aria-hidden="true"></span></a></li>
+            </ul>
+        </li>
+        <li><a href="#!/config">Configuration</a></li>
+        <li ng-show="$ctrl.docs"><a href="/docs">Documentation</a></li>
+        <li>
+            <a class="dropdown-toggle"
+               id="toolsMenu"
+               data-toggle="dropdown"
+               aria-haspopup="true"
+               aria-expanded="true"
+               >
+                Common tools
+                <span class="caret"></span>
+            </a>
+            <ul class="dropdown-menu" aria-labelledby="toolsMenu">
+                <li><a href="jmx">JMX <span
+                        aria-hidden="true"></span></a></li>
+                <li><a href="conf">Config <span
+                        aria-hidden="true"></a></li>
+                <li><a href="stacks">Stacks <span
+                        aria-hidden="true"></a></li>
+                <li><a href="logLevel">Log levels <span
+                        aria-hidden="true"></a></li>
+            </ul>
+        </li>
+    </ul>
+</div><!--/.nav-collapse -->

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/overview.html
----------------------------------------------------------------------
diff --git 
a/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/overview.html
 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/overview.html
new file mode 100644
index 0000000..30e2d26
--- /dev/null
+++ 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/overview.html
@@ -0,0 +1,39 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF 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 License for the specific language governing permissions and
+   limitations under the License.
+-->
+<h1>Overview</h1>
+<table class="table table-bordered table-striped">
+    <tbody>
+    <tr>
+        <th>Started:</th>
+        <td>{{$ctrl.jmx.StartedTimeInMillis | date : 'medium'}}</td>
+    </tr>
+    <tr>
+        <th>Version:</th>
+        <td>{{$ctrl.jmx.Version}}</td>
+    </tr>
+    <tr>
+        <th>Compiled:</th>
+        <td>{{$ctrl.jmx.CompileInfo}}</td>
+    </tr>
+    </tbody>
+</table>
+
+<h2>JVM parameters</h2>
+
+<jvm-parameters></jvm-parameters>
+
+<div ng-transclude></div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/7ace05b3/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
----------------------------------------------------------------------
diff --git 
a/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
new file mode 100644
index 0000000..facb152
--- /dev/null
+++ 
b/hadoop-hdsl/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
@@ -0,0 +1,87 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF 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 License for the specific language governing permissions and
+   limitations under the License.
+-->
+<div ng-hide="$ctrl.metrics.percentiles" class="alert alert-info">
+    Please set <b>rpc.metrics.quantile.enable</b> to <b>true</b> and define the
+    intervals in seconds with setting <b>rpc.metrics.percentiles.intervals</b>
+    (eg. set to <b>60,300</b>) in your hdfs-site.xml
+    to display Hadoop RPC related graphs.
+</div>
+<div ng-repeat="(window,windowed) in $ctrl.metrics.percentiles">
+    <h2>{{window}} window</h2>
+    <p>Quantiles based on a fixed {{window}} window. Calculated once at every
+        {{window}}</p>
+
+    <div class="row">
+        <div class="col-md-6 col-lg-4"
+             ng-repeat="(metric,percentiles) in windowed">
+            <h3>{{metric}}</h3>
+            <p>{{percentiles.numOps}} sample</p>
+            <nvd3 options="$ctrl.percentileGraphOptions"
+                  data="percentiles.graphdata"></nvd3>
+        </div>
+    </div>
+
+</div>
+<div class="row">
+    <div ng-show="$ctrl.metrics.numavgs" class="col-md-6">
+        <h2>Number of ops / Averages</h2>
+
+        <table class="table table-bordered table-striped">
+            <thead>
+            <tr>
+                <th>Metric name</th>
+                <th>Number of ops</th>
+                <th>Average time (ms)</th>
+            </tr>
+            </thead>
+            <tr ng-repeat="(key,metric) in $ctrl.metrics.numavgs">
+                <td>{{key}}</td>
+                <td>{{metric.numOps | number}}</td>
+                <td>{{metric.avgTime | number:2}}</td>
+            </tr>
+        </table>
+    </div>
+    <div ng-show="$ctrl.metrics.successfailures" class="col-md-6">
+        <h2>Success / Failures</h2>
+
+        <table class="table table-bordered table-striped">
+            <thead>
+            <tr>
+                <th>Metric name</th>
+                <th>Success</th>
+                <th>Failures</th>
+            </tr>
+            </thead>
+
+            <tr ng-repeat="(key,metric) in $ctrl.metrics.successfailures">
+                <td>{{key}}</td>
+                <td>{{metric.success}}</td>
+                <td>{{metric.failures}}</td>
+            </tr>
+        </table>
+    </div>
+</div>
+<div ng-show="$ctrl.metrics.others">
+    <h2>Other JMX Metrics</h2>
+
+    <table class="table">
+        <tr ng-repeat="metric in $ctrl.metrics.others">
+            <td>{{metric.key}}</td>
+            <td>{{metric.value}}</td>
+        </tr>
+    </table>
+</div>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to