Repository: ambari Updated Branches: refs/heads/trunk f41fccfc8 -> 1e510f590
AMBARI-14999. Multi-host option for Templated Dashboards. (Prajwal Rao via yusaku) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1e510f59 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1e510f59 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1e510f59 Branch: refs/heads/trunk Commit: 1e510f590f9caa9ef7fb4e71e9badd54cb36b5c0 Parents: f41fccf Author: Yusaku Sako <[email protected]> Authored: Tue Feb 16 12:15:43 2016 -0800 Committer: Yusaku Sako <[email protected]> Committed: Tue Feb 16 12:15:43 2016 -0800 ---------------------------------------------------------------------- ambari-metrics/ambari-metrics-grafana/README.md | 22 ++++++++- .../ambari-metrics/datasource.js | 49 +++++++++++++++---- .../screenshots/21-multi-templating.png | Bin 0 -> 92034 bytes 3 files changed, 60 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/1e510f59/ambari-metrics/ambari-metrics-grafana/README.md ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-grafana/README.md b/ambari-metrics/ambari-metrics-grafana/README.md index 7eb84a7..af2b5cb 100644 --- a/ambari-metrics/ambari-metrics-grafana/README.md +++ b/ambari-metrics/ambari-metrics-grafana/README.md @@ -33,10 +33,12 @@ Use **ambari-metrics** to visualize metrics exposed via AMS in Grafana. - [Save Dashboard](#savedash) - [Time Ranges](#timerange) - [Edit Panel/Graph](#editpanel) + - [Templated Dashboards](#templating) + - [Multi Host Templated Dashboards](#multi-templating) ---------- - + ---------- <a name="installg"></a> @@ -257,7 +259,23 @@ http://GRAFANA_HOST:3000 > 10. When you now add a graph, and select your component and metric, the > plotted graph will show you metrics for the selected hostname from the > dropdown. > 11. The legend on the graph will also now update with the selected host. -**Templalted dashboards do support multiple metrics in a single graph.** +**Templated dashboards do support multiple metrics in a single graph.**  + +--- + +<a name="multi-templating"></a> +### Multi Host Templated Dashboards. + +**Templated dashboards now have the ability to filter graphs based on a single host or multiple hosts.** + +> 1. Once you've created your templated dashboard, you can edit it gain by clicking on the "cog" on the top, select "Templating". +> 2. Click on "Edit" for your templating variable. +> 3. To be able to select Multiiple Hosts, set multi-value selection to "enable" and leave multi-format set to "glob". +> 4. To have an option for All hosts, select All Value, and set it to "*" and All format to "wildcard". +> 5. Hit Update and close the templating variables options and you should be now able to select multiple hosts from the dropdown (or "all" hosts at once.) + + + http://git-wip-us.apache.org/repos/asf/ambari/blob/1e510f59/ambari-metrics/ambari-metrics-grafana/ambari-metrics/datasource.js ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-grafana/ambari-metrics/datasource.js b/ambari-metrics/ambari-metrics-grafana/ambari-metrics/datasource.js index e89ad0e..ca7ea65 100644 --- a/ambari-metrics/ambari-metrics-grafana/ambari-metrics/datasource.js +++ b/ambari-metrics/ambari-metrics-grafana/ambari-metrics/datasource.js @@ -38,6 +38,7 @@ define([ } var allMetrics = []; var appIds = []; + //We get a list of components and their associated metrics. AmbariMetricsDatasource.prototype.initMetricAppidMapping = function () { backendSrv.get(this.url + '/ws/v1/timeline/metrics/metadata') .then(function (items) { @@ -73,7 +74,7 @@ define([ } options.url = this.url + options.url; - options.inspect = {type: 'discovery'}; + options.inspect = {type: 'ambarimetrics'}; return backendSrv.datasourceRequest(options); }; @@ -82,6 +83,7 @@ define([ * AMS Datasource Query */ AmbariMetricsDatasource.prototype.query = function (options) { + var emptyData = function (metric) { return { data: { @@ -99,6 +101,7 @@ define([ } var series = []; var metricData = res.metrics[0].metrics; + // Added hostname to legend for templated dashboards. var hostLegend = res.metrics[0].hostname ? ' on ' + res.metrics[0].hostname : ''; var timeSeries = {}; if (target.hosts === undefined || target.hosts.trim() === "") { @@ -122,7 +125,6 @@ define([ }; }; - var getHostAppIdData = function(target) { var precision = target.shouldAddPrecision ? '&precision=' + target.precision : ''; var rate = target.shouldComputeRate ? '._rate._' : '._'; @@ -132,14 +134,16 @@ define([ getMetricsData(target) ); }; + //Check if it's a templated dashboard. + var templatedHost = (_.isEmpty(templateSrv.variables)) ? "" : templateSrv.variables[0].options.filter(function(host) + { return host.selected; }).map(function(hostName) { return hostName.value; }); var getServiceAppIdData = function(target) { - var templatedHost = (_.isEmpty(templateSrv.variables)) ? "" : templateSrv.variables[0].options.filter(function(host) - { return host.selected; }).map(function(hostName) { return hostName.value; }); + var tHost = (_.isEmpty(templateSrv.variables)) ? templatedHost : target.templatedHost; var precision = target.shouldAddPrecision ? '&precision=' + target.precision : ''; var rate = target.shouldComputeRate ? '._rate._' : '._'; return backendSrv.get(self.url + '/ws/v1/timeline/metrics?metricNames=' + target.metric + rate - + target.aggregator + '&hostname=' + templatedHost + '&appId=' + target.app + '&startTime=' + from + + + target.aggregator + '&hostname=' + tHost + '&appId=' + target.app + '&startTime=' + from + '&endTime=' + to + precision).then( getMetricsData(target) ); @@ -148,15 +152,43 @@ define([ // Time Ranges var from = Math.floor(options.range.from.valueOf() / 1000); var to = Math.floor(options.range.to.valueOf() / 1000); - var metricsPromises = _.map(options.targets, function(target) { + + var metricsPromises = []; + if (!_.isEmpty(templateSrv.variables)) { + if (!_.isEmpty(_.find(templatedHost, function (o) { return o === "*"; }))) { + var allHost = templateSrv.variables[0].options.filter(function(all) { + return all.text !== "All"; }).map(function(hostName) { return hostName.value; }); + _.forEach(allHost, function(processHost) { + metricsPromises.push(_.map(options.targets, function(target) { + target.templatedHost = processHost; + console.debug('target app=' + target.app + ',' + + 'target metric=' + target.metric + ' on host=' + target.templatedHost); + return getServiceAppIdData(target); + })); + }); + } else { + _.forEach(templatedHost, function(processHost) { + metricsPromises.push(_.map(options.targets, function(target) { + target.templatedHost = processHost; + console.debug('target app=' + target.app + ',' + + 'target metric=' + target.metric + ' on host=' + target.templatedHost); + return getServiceAppIdData(target); + })); + }); + } + + metricsPromises = _.flatten(metricsPromises); + } else { + metricsPromises = _.map(options.targets, function(target) { console.debug('target app=' + target.app + ',' + - 'target metric=' + target.metric + ' on host=' + target.hosts); + 'target metric=' + target.metric + ' on host=' + target.tempHost); if (!!target.hosts) { return getHostAppIdData(target); } else { return getServiceAppIdData(target); } }); + } return $q.all(metricsPromises).then(function(metricsDataArray) { var data = _.map(metricsDataArray, function(metricsData) { @@ -288,8 +320,7 @@ define([ ]); return aggregatorsPromise; }; - return AmbariMetricsDatasource; }); } -); \ No newline at end of file +); http://git-wip-us.apache.org/repos/asf/ambari/blob/1e510f59/ambari-metrics/ambari-metrics-grafana/screenshots/21-multi-templating.png ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-grafana/screenshots/21-multi-templating.png b/ambari-metrics/ambari-metrics-grafana/screenshots/21-multi-templating.png new file mode 100644 index 0000000..9855302 Binary files /dev/null and b/ambari-metrics/ambari-metrics-grafana/screenshots/21-multi-templating.png differ
