summaryrefslogtreecommitdiffstats
path: root/glances/outputs/static/js/stats_controller.js
diff options
context:
space:
mode:
Diffstat (limited to 'glances/outputs/static/js/stats_controller.js')
-rw-r--r--glances/outputs/static/js/stats_controller.js294
1 files changed, 294 insertions, 0 deletions
diff --git a/glances/outputs/static/js/stats_controller.js b/glances/outputs/static/js/stats_controller.js
new file mode 100644
index 00000000..026209f1
--- /dev/null
+++ b/glances/outputs/static/js/stats_controller.js
@@ -0,0 +1,294 @@
+glancesApp.controller('statsController', function($scope, $http, $interval, $q, $routeParams, $filter) {
+
+ $scope.limitSuffix = ['critical', 'careful', 'warning'];
+ $scope.refreshTime = 3;
+ $scope.pluginLimits = [];
+ $scope.sorter = {
+ column: "cpu_percent",
+ auto: true,
+ isReverseColumn: function(column) {
+ return !(column == 'username' || column == 'name');
+ },
+ getColumnLabel: function(column) {
+ if (_.isEqual(column, ['io_read', 'io_write'])) {
+ return 'io_counters';
+ } else {
+ return column;
+ }
+ }
+ };
+ $scope.help_screen = false;
+ $scope.show = {
+ 'diskio' : true,
+ 'network' : true,
+ 'fs' : true,
+ 'sensors' : true,
+ 'sidebar' : true,
+ 'alert' : true,
+ 'short_process_name': true,
+ 'per_cpu': false,
+ 'warning_alerts':true,
+ 'warning_critical_alerts':true,
+ 'process_stats':true,
+ 'top_extended_stats':true,
+ 'docker_stats':true,
+ 'network_io_combination':false,
+ 'network_io_cumulative':false,
+ 'filesystem_freespace':false,
+ 'network_by_bytes':true
+ };
+
+ $scope.init_refresh_time = function() {
+ if ($routeParams != undefined && $routeParams.refresh_time != undefined) {
+ var new_refresh_time = parseInt($routeParams.refresh_time)
+ if (new_refresh_time >= 1) {
+ $scope.refreshTime = new_refresh_time
+ }
+ }
+ }
+
+ $scope.init_limits = function() {
+ $http.get('/api/2/all/limits').success(function(response, status, headers, config) {
+ $scope.pluginLimits = response
+ }).error(function(response, status, headers, config) {
+ console.log('error : ' + response+ status + headers + config);
+ });
+ }
+
+ $scope.init_help = function() {
+ $http.get('/api/2/help').success(function(response, status, headers, config) {
+ $scope.help = response
+ });
+ }
+
+ $scope.show_hide = function(bloc) {
+ if(bloc == 'help') {
+ $scope.help_screen = !$scope.help_screen
+ } else {
+ $scope.show[bloc] = !$scope.show[bloc]
+ }
+ }
+
+ var canceler = undefined;
+
+ /**
+ * Refresh all the data of the view
+ */
+ $scope.refreshData = function() {
+ canceler = $q.defer();
+ $http.get('/api/2/all', {timeout: canceler.promise}).success(function(response, status, headers, config) {
+
+ function timemillis(array) {
+ var sum = 0.0
+ for (var i = 0; i < array.length; i++) {
+ sum += array[i] * 1000.0;
+ }
+ return sum;
+ }
+ function timedelta(input) {
+ var sum = timemillis(input);
+ var d = new Date(sum);
+
+ return {
+ hours: d.getUTCHours(), // TODO : multiple days ( * (d.getDay() * 24)))
+ minutes: d.getUTCMinutes(),
+ seconds: d.getUTCSeconds(),
+ milliseconds: parseInt("" + d.getUTCMilliseconds() / 10)
+ };
+ };
+
+ function durationBetweenTwoDates(startDate, endDate) {
+ var duration = endDate - startDate;
+ var seconds = parseInt((duration/1000)%60)
+ , minutes = parseInt((duration/(1000*60))%60)
+ , hours = parseInt((duration/(1000*60*60))%24);
+
+ return _.padLeft(hours,2,'0') + ":" + _.padLeft(minutes,2,'0') + ":" + _.padLeft(seconds,2,'0');
+ }
+
+ for (var i = 0; i < response['processlist'].length; i++) {
+ var process = response['processlist'][i]
+ process.memvirt = process.memory_info[1]
+ process.memres = process.memory_info[0]
+ process.timeplus = timedelta(process.cpu_times)
+ process.timemillis = timemillis(process.cpu_times)
+
+ process.io_read = '?';
+ process.io_write = '?';
+
+ if (process.io_counters) {
+ process.io_read = (process.io_counters[0] - process.io_counters[2]) / process.time_since_update;
+
+ if (process.io_read != 0) {
+ process.io_read = $filter('bytes')(process.io_read);
+ }
+
+ process.io_write = (process.io_counters[1] - process.io_counters[3]) / process.time_since_update;
+
+ if (process.io_write != 0) {
+ process.io_write = $filter('bytes')(process.io_write);
+ }
+ }
+ }
+ for (var i = 0; i < response['alert'].length; i++) {
+ var alert = response['alert'][i];
+ alert.begin = alert[0] * 1000;
+ alert.end = alert[1] * 1000;
+ alert.ongoing = alert[1] == -1;
+
+ if (!alert.ongoing) {
+ alert.duration = durationBetweenTwoDates(alert.begin, alert.end);
+ }
+ }
+
+ $scope.is_bsd = response['system'].os_name === 'FreeBSD';
+ $scope.is_linux = response['system'].os_name === 'Linux';
+ $scope.is_mac = response['system'].os_name === 'Darwin';
+ $scope.is_windows = response['system'].os_name === 'Windows';
+
+ $scope.result = response;
+ canceler.resolve()
+ }).error(function(d, status, headers, config) {
+ console.log('error status:' + status + " - headers = " + headers);
+ canceler.resolve()
+ });
+ }
+
+ $scope.isNice = function(nice) {
+ if(nice !== undefined && (($scope.is_windows && nice != 32) || (!$scope.is_windows && nice != 0))) {
+ return true;
+ }
+
+ return false;
+ }
+
+ $scope.getAlert = function(pluginName, limitNamePrefix, current, maximum, log) {
+ current = current || 0;
+ maximum = maximum || 100;
+ log = log || false;
+ log_str = log ? '_log' : '';
+
+ var value = (current * 100) / maximum;
+
+ if ($scope.pluginLimits != undefined && $scope.pluginLimits[pluginName] != undefined) {
+ for (var i = 0; i < $scope.limitSuffix.length; i++) {
+ var limitName = limitNamePrefix + $scope.limitSuffix[i]
+ var limit = $scope.pluginLimits[pluginName][limitName]
+
+ if (value >= limit) {
+ var pos = limitName.lastIndexOf("_")
+ var className = limitName.substring(pos + 1)
+
+ return className + log_str;
+ }
+ }
+ }
+
+ return "ok" + log_str;
+ }
+
+ $scope.getAlertLog = function(pluginName, limitNamePrefix, current, maximum) {
+ return $scope.getAlert(pluginName, limitNamePrefix, current, maximum, true);
+ }
+
+ $scope.init_refresh_time();
+ $scope.init_limits();
+ $scope.init_help();
+
+ var stop;
+ $scope.configure_refresh = function () {
+ if (!angular.isDefined(stop)) {
+ //$scope.refreshData();
+ stop = $interval(function() {
+ $scope.refreshData();
+ }, $scope.refreshTime * 1000); // in milliseconds
+ }
+ }
+
+ $scope.$watch(
+ function() { return $scope.refreshTime; },
+ function(newValue, oldValue) {
+ $scope.stop_refresh();
+ $scope.configure_refresh();
+ }
+ );
+
+ $scope.stop_refresh = function() {
+ if (angular.isDefined(stop)) {
+ $interval.cancel(stop);
+ stop = undefined;
+ }
+ };
+
+ $scope.$on('$destroy', function() {
+ // Make sure that the interval is destroyed too
+ $scope.stop_refresh();
+ });
+
+ $scope.onKeyDown = function($event) {
+ if ($event.keyCode == keycodes.a) { // a Sort processes automatically
+ $scope.sorter.column = "cpu_percent";
+ $scope.sorter.auto = true;
+ } else if ($event.keyCode == keycodes.c) {//c Sort processes by CPU%
+ $scope.sorter.column = "cpu_percent";
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.m) {//m Sort processes by MEM%
+ $scope.sorter.column = "memory_percent";
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.p) {//p Sort processes by name
+ $scope.sorter.column = "name";
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.i) {//i Sort processes by I/O rate
+ $scope.sorter.column = ['io_read', 'io_write'];
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.t) {//t Sort processes by CPU times
+ $scope.sorter.column = "timemillis";
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.u) {//t Sort processes by user
+ $scope.sorter.column = "username";
+ $scope.sorter.auto = false;
+ } else if ($event.keyCode == keycodes.d) {//d Show/hide disk I/O stats
+ $scope.show_hide('diskio')
+ } else if ($event.keyCode == keycodes.f) {//f Show/hide filesystem stats
+ $scope.show_hide('fs')
+ } else if ($event.keyCode == keycodes.n) {//n sort_by Show/hide network stats
+ $scope.show_hide('network')
+ } else if ($event.keyCode == keycodes.s) {//s Show/hide sensors stats
+ $scope.show_hide('sensors')
+ } else if ($event.keyCode == keycodes.TWO && $event.shiftKey) {//2 Show/hide left sidebar
+ $scope.show_hide('sidebar')
+ } else if ($event.keyCode == keycodes.z) {//z Enable/disable processes stats
+ $scope.show_hide('process_stats')
+ } else if ($event.keyCode == keycodes.e) {//e Enable/disable top extended stats
+ $scope.show_hide('top_extended_stats')
+ } else if ($event.keyCode == keycodes.SLASH) {// SLASH Enable/disable short processes name
+ $scope.show_hide('short_process_name')
+ } else if ($event.keyCode == keycodes.D && $event.shiftKey) {//D Enable/disable Docker stats
+ $scope.show_hide('docker_stats')
+ } else if ($event.keyCode == keycodes.b) {//b Bytes or bits for network I/O
+ $scope.show_hide('network_by_bytes')
+ } else if ($event.keyCode == keycodes.l) {//l Show/hide alert logs
+ $scope.show_hide('alert')
+ } else if ($event.keyCode == keycodes.w) {//w Delete warning alerts
+ $scope.show_hide('warning_alerts')
+ } else if ($event.keyCode == keycodes.x) {//x Delete warning and critical alerts
+ $scope.show_hide('warning_critical_alerts')
+ } else if ($event.keyCode == keycodes.ONE && $event.shiftKey) {//1 Global CPU or per-CPU stats
+ $scope.show_hide('per_cpu')
+ } else if ($event.keyCode == keycodes.h) {//h Show/hide this help screen
+ $scope.show_hide('help')
+ } else if ($event.keyCode == keycodes.T && $event.shiftKey) {//T View network I/O as combination
+ $scope.show_hide('network_io_combination')
+ } else if ($event.keyCode == keycodes.u) {//u View cumulative network I/O
+ $scope.show_hide('network_io_cumulative')
+ } else if ($event.keyCode == keycodes.F && $event.shiftKey) {//F Show filesystem free space
+ $scope.show_hide('filesystem_freespace')
+ } else if ($event.keyCode == keycodes.g) {//g Generate graphs for current history
+ // not available
+ } else if ($event.keyCode == keycodes.r) {//r Reset history
+ // not available
+ } else if ($event.keyCode == keycodes.q) {//q Quit (Esc and Ctrl-C also work)
+ // not available
+ }
+ }
+});