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]
