diff --git a/js/apps/system/aardvark/clusterFrontend/js/views/showClusterView.js b/js/apps/system/aardvark/clusterFrontend/js/views/showClusterView.js index 99f1d47f53..f8f83b06c8 100644 --- a/js/apps/system/aardvark/clusterFrontend/js/views/showClusterView.js +++ b/js/apps/system/aardvark/clusterFrontend/js/views/showClusterView.js @@ -549,16 +549,20 @@ dashboard: function(e) { this.stopUpdating(); + var tar = $(e.currentTarget); var serv = {}; var cur; var coord; + var ip_port = tar.attr("id"); ip_port = ip_port.replace(/\-/g,'.'); ip_port = ip_port.replace(/\_/g,':'); ip_port = ip_port.substr(2); + serv.raw = ip_port; serv.isDBServer = tar.hasClass("dbserver"); + if (serv.isDBServer) { cur = this.dbservers.findWhere({ address: serv.raw @@ -577,6 +581,7 @@ + "://" + cur.get("address"); } + serv.target = encodeURIComponent(cur.get("name")); window.App.serverToShow = serv; window.App.dashboard(); diff --git a/js/apps/system/aardvark/frontend/js/views/dashboardView.js b/js/apps/system/aardvark/frontend/js/views/dashboardView.js index c1d7f75bfd..b25675fcd3 100644 --- a/js/apps/system/aardvark/frontend/js/views/dashboardView.js +++ b/js/apps/system/aardvark/frontend/js/views/dashboardView.js @@ -115,7 +115,7 @@ this.detailGraph = new Dygraph( document.getElementById("lineChartDetail"), - this.history[figure], + this.history[this.server][figure], options ); }, @@ -150,7 +150,7 @@ options.width = dimensions.width; self.graphs[f] = new Dygraph( document.getElementById(options.div), - self.history[f] || [], + self.history[self.server][f] || [], options ); }); @@ -158,11 +158,18 @@ initialize: function () { this.dygraphConfig = this.options.dygraphConfig; - this.server = this.options.serverToShow; this.d3NotInitialised = true; this.events["click .dashboard-sub-bar-menu-sign"] = this.showDetail.bind(this); this.events["mousedown .dygraph-rangesel-zoomhandle"] = this.stopUpdating.bind(this); this.events["mouseup .dygraph-rangesel-zoomhandle"] = this.startUpdating.bind(this); + + this.server = this.options.serverToShow; + + if (! this.server) { + this.server = "-local-"; + } + + this.history[this.server] = {}; }, updateCharts: function () { @@ -184,7 +191,7 @@ var tempColor = ""; Object.keys(map).forEach(function (a) { - var v = self.history[a][1]; + var v = self.history[self.server][a][1]; var p = ""; if (v < 0) { @@ -194,7 +201,7 @@ tempColor = "green"; p = "+"; } - $("#" + a).html(self.history[a][0] + '
' + p + v + '%'); }); }, @@ -217,7 +224,7 @@ updateLineChart: function (figure, isDetailChart) { var g = isDetailChart ? this.detailGraph : this.graphs[figure], opts = { - file: this.history[figure], + file: this.history[this.server][figure], dateWindow: this.updateDateWindow(g, isDetailChart) }; g.updateOptions(opts); @@ -234,8 +241,8 @@ } // need at least an empty history - if (! self.history[f]) { - self.history[f] = []; + if (! self.history[self.server][f]) { + self.history[self.server][f] = []; } // generate values for this key @@ -256,7 +263,7 @@ // if we found at list one value besides times, then use the entry if (valueList.length > 1) { - self.history[f].push(valueList); + self.history[self.server][f].push(valueList); } }); }, @@ -264,14 +271,14 @@ cutOffHistory: function (f, cutoff) { var self = this; - while (self.history[f].length !== 0) { - var v = self.history[f][0][0]; + while (self.history[self.server][f].length !== 0) { + var v = self.history[self.server][f][0][0]; if (v >= cutoff) { break; } - self.history[f].shift(); + self.history[self.server][f].shift(); } }, @@ -287,7 +294,7 @@ } // history must be non-empty - if (! self.history[f]) { + if (! self.history[self.server][f]) { return; } @@ -320,7 +327,7 @@ n1 = 0; } - self.history[a] = [ + self.history[self.server][a] = [ fmtNumber(newData[self.tendencies[a][0]], n1), fmtNumber(newData[self.tendencies[a][1]] * 100, n2) ]; @@ -328,16 +335,16 @@ // update distribution Object.keys(this.barCharts).forEach(function (a) { - self.history[a] = self.mergeBarChartData(self.barCharts[a], newData); + self.history[self.server][a] = self.mergeBarChartData(self.barCharts[a], newData); }); // update physical memory - self.history.physicalMemory = newData.physicalMemory; - self.history.residentSizeCurrent = newData.residentSizeCurrent; - self.history.residentSizePercent = newData.residentSizePercent; + self.history[self.server].physicalMemory = newData.physicalMemory; + self.history[self.server].residentSizeCurrent = newData.residentSizeCurrent; + self.history[self.server].residentSizePercent = newData.residentSizePercent; // generate chart description - self.history.residentSizeChart = + self.history[self.server].residentSizeChart = [ { "key": "", @@ -402,16 +409,20 @@ var url = "statistics/short"; var urlParams = "?start="; - if (this.nextStart) { - urlParams += this.nextStart; + if (self.nextStart) { + urlParams += self.nextStart; } else { - urlParams += (new Date().getTime() - this.defaultTimeFrame) / 1000; + urlParams += (new Date().getTime() - self.defaultTimeFrame) / 1000; } - if (this.server) { - url = this.server.endpoint + "/_admin/aardvark/statistics/cluster"; - urlParams += "&DBserver=" + this.server.target; + if (self.server !== "-local-") { + url = self.server.endpoint + "/_admin/aardvark/statistics/cluster"; + urlParams += "&type=short&DBserver=" + self.server.target; + + if (! self.history.hasOwnProperty(self.server)) { + self.history[self.server] = {}; + } } $.ajax( @@ -434,9 +445,13 @@ var urlParams = "?filter=" + this.dygraphConfig.mapStatToFigure[figure].join(); - if (this.server) { - url = this.server.endpoint + "/_admin/aardvark/statistics/cluster"; - urlParams += "&DBserver=" + this.server.target; + if (self.server !== "-local-") { + url = self.server.endpoint + "/_admin/aardvark/statistics/cluster"; + urlParams += "&type=long&DBserver=" + self.server.target; + + if (! self.history.hasOwnProperty(self.server)) { + self.history[self.server] = {}; + } } $.ajax( @@ -446,7 +461,7 @@ function (d) { var i; - self.history[figure] = []; + self.history[self.server][figure] = []; for (i = 0; i < d.times.length; ++i) { self.mergeDygraphHistory(d, i, true); @@ -460,7 +475,7 @@ var dimensions = this.getCurrentSize('#residentSizeChartContainer'); - var current = self.history.residentSizeCurrent / 1024 / 1024; + var current = self.history[self.server].residentSizeCurrent / 1024 / 1024; var currentA = ""; if (current < 1025) { @@ -470,8 +485,8 @@ currentA = fmtNumber(current / 1024, 2) + " GB"; } - var currentP = fmtNumber(self.history.residentSizePercent * 100, 2); - var data = [fmtNumber(self.history.physicalMemory / 1024 / 1024 / 1024, 0) + " GB"]; + var currentP = fmtNumber(self.history[self.server].residentSizePercent * 100, 2); + var data = [fmtNumber(self.history[self.server].physicalMemory / 1024 / 1024 / 1024, 0) + " GB"]; nv.addGraph(function () { var chart = nv.models.multiBarHorizontalChart() @@ -504,7 +519,7 @@ chart.xAxis.showMaxMin(false); d3.select('#residentSizeChart svg') - .datum(self.history.residentSizeChart) + .datum(self.history[self.server].residentSizeChart) .call(chart); d3.select('#residentSizeChart svg').select('.nv-zeroLine').remove(); @@ -624,7 +639,7 @@ .tickFormat(function (d) {return fmtNumber(((d * 100 * 100) / 100), 0) + "%";}); d3.select(selector) - .datum(self.history[k]) + .datum(self.history[self.server][k]) .call(chart); nv.utils.windowResize(chart.update); diff --git a/js/apps/system/aardvark/statistics.js b/js/apps/system/aardvark/statistics.js index 7be19d04e5..d38dc99364 100644 --- a/js/apps/system/aardvark/statistics.js +++ b/js/apps/system/aardvark/statistics.js @@ -40,20 +40,6 @@ var db = require("org/arangodb").db; var STATISTICS_INTERVALL = require("org/arangodb/statistics").STATISTICS_INTERVALL; var STATISTICS_HISTORY_INTERVALL = require("org/arangodb/statistics").STATISTICS_HISTORY_INTERVALL; -// ----------------------------------------------------------------------------- -// --SECTION-- private variables -// ----------------------------------------------------------------------------- - -//////////////////////////////////////////////////////////////////////////////// -/// @brief cluster id or undefined for standalone -//////////////////////////////////////////////////////////////////////////////// - -var clusterId; - -if (cluster.isCluster()) { - clusterId = ArangoServerState.id(); -} - // ----------------------------------------------------------------------------- // --SECTION-- private functions // ----------------------------------------------------------------------------- @@ -460,6 +446,17 @@ controller.get("short", function (req, res) { start = internal.time() - STATISTICS_INTERVALL * 10; } + var clusterId; + + if (dbServer === undefined) { + if (cluster.isCluster()) { + clusterId = ArangoServerState.id(); + } + } + else { + clusterId = dbServer; + } + var series = computeStatisticsShort(start, clusterId); res.json(series); @@ -488,6 +485,17 @@ controller.get("long", function (req, res) { attrs[s[i]] = true; } + var clusterId; + + if (dbServer === undefined) { + if (cluster.isCluster()) { + clusterId = ArangoServerState.id(); + } + } + else { + clusterId = dbServer; + } + var series = computeStatisticsLong(attrs, clusterId); res.json(series); @@ -512,10 +520,15 @@ controller.get("cluster", function (req, res) { } var DBserver = req.parameters.DBserver; + var type = req.parameters.type; var coord = { coordTransactionID: ArangoClusterInfo.uniqid() }; var options = { coordTransactionID: coord.coordTransactionID, timeout:10 }; - var url = "/_admin/aardvark/statistics/full"; + if (type !== "short" && type !== "long") { + type = short; + } + + var url = "/_admin/aardvark/statistics/" + type; var sep = "?"; if (req.parameters.hasOwnProperty("start")) { diff --git a/js/common/modules/org/arangodb/statistics.js b/js/common/modules/org/arangodb/statistics.js index 3dc1a4e2f4..de9d12e45c 100644 --- a/js/common/modules/org/arangodb/statistics.js +++ b/js/common/modules/org/arangodb/statistics.js @@ -37,20 +37,6 @@ var db = internal.db; // --SECTION-- module "org/arangodb/statistics" // ----------------------------------------------------------------------------- -// ----------------------------------------------------------------------------- -// --SECTION-- private variables -// ----------------------------------------------------------------------------- - -//////////////////////////////////////////////////////////////////////////////// -/// @brief cluster id or undefined for standalone -//////////////////////////////////////////////////////////////////////////////// - -var clusterId; - -if (cluster.isCluster()) { - clusterId = ArangoServerState.id(); -} - // ----------------------------------------------------------------------------- // --SECTION-- private functions // ----------------------------------------------------------------------------- @@ -59,7 +45,7 @@ if (cluster.isCluster()) { /// @brief lastEntry //////////////////////////////////////////////////////////////////////////////// -function lastEntry (collection, start) { +function lastEntry (collection, start, clusterId) { 'use strict'; var filter = ""; @@ -251,7 +237,7 @@ function computePerSeconds (current, prev) { /// @brief computes the 15 minute averages //////////////////////////////////////////////////////////////////////////////// -function compute15Minute (start) { +function compute15Minute (start, clusterId) { 'use strict'; var filter = ""; @@ -395,9 +381,18 @@ exports.historian = function () { var statsRaw = db._statisticsRaw; var statsCol = db._statistics; + var clusterId; + + if (cluster.isCluster()) { + clusterId = ArangoServerState.id(); + } + try { var now = internal.time(); - var prevRaw = lastEntry('_statisticsRaw', now - 2 * exports.STATISTICS_INTERVALL); + var prevRaw = lastEntry( + '_statisticsRaw', + now - 2 * exports.STATISTICS_INTERVALL, + clusterId); // create new raw statistics var raw = {}; @@ -420,7 +415,7 @@ exports.historian = function () { if (perSecs !== null) { if (clusterId !== undefined) { - statsCol.clusterId = clusterId; + perSecs.clusterId = clusterId; } statsCol.save(perSecs); @@ -441,20 +436,33 @@ exports.historianAverage = function () { var stats15m = db._statistics15; + var clusterId; + + if (cluster.isCluster()) { + clusterId = ArangoServerState.id(); + } + try { var now = internal.time(); // check if need to create a new 15 min intervall - var prev15 = lastEntry('_statistics15', now - 2 * exports.STATISTICS_HISTORY_INTERVALL); + var prev15 = lastEntry( + '_statistics15', + now - 2 * exports.STATISTICS_HISTORY_INTERVALL, + clusterId); + var stat15; + var start; if (prev15 === null) { - stat15 = compute15Minute(now - exports.STATISTICS_HISTORY_INTERVALL); + start = now - exports.STATISTICS_HISTORY_INTERVALL; } else { - stat15 = compute15Minute(prev15.time); + start = prev15.time; } + stat15 = compute15Minute(start, clusterId); + if (stat15 !== undefined) { if (clusterId !== undefined) { stat15.clusterId = clusterId;