This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository mum. See http://git.chorem.org/mum.git commit 0c0b88c12859ac5e09201dc9927ae07399cc428b Author: Alexis Guilbaud <guilbaud@codelutin.com> Date: Tue May 5 18:00:59 2015 +0200 dict values are archived, stats are counted and can be view on charts --- app/modules/storage_modules/shelve_db.py | 45 +++++++++++++--------- static/js/controllers/statsCtrl.js | 66 +++++++++++++++++++++++--------- views/stats.html | 27 +++---------- 3 files changed, 78 insertions(+), 60 deletions(-) diff --git a/app/modules/storage_modules/shelve_db.py b/app/modules/storage_modules/shelve_db.py index aadd744..164600a 100644 --- a/app/modules/storage_modules/shelve_db.py +++ b/app/modules/storage_modules/shelve_db.py @@ -835,14 +835,6 @@ class shelve_db: # creating the monitoring structure for this module if not exists self.db['hosts'][addr_host]["monitoring"][mod_name] = {} self.db['hosts'][addr_host]['stats'][mod_name] = {} - self.db['hosts'][addr_host]['stats'][mod_name]['nb_check'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['delta'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['mean'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['M2'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['lin_reg'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['min'] = maxint - self.db['hosts'][addr_host]['stats'][mod_name]['max'] = 0 - self.db['hosts'][addr_host]['stats'][mod_name]['total'] = 0 self.db['hosts'][addr_host]['archive'][mod_name] = {} if isinstance(val, type({})): # if dictionary @@ -936,19 +928,34 @@ class shelve_db: val = 1 else: val = 0 - if not isinstance(val, type({})): - stats['nb_check'] += 1 - stats['total'] += val - if stats['min'] > val: - stats['min'] = val - if stats['max'] < val: - stats['max'] = val + if isinstance(val, type({})): + tab_iter = val.keys() + else: + tab_iter = [''] + val = {'': val} + for key in tab_iter: + if key not in stats: + stats[key] = {} + stats[key]['nb_check'] = 0 + stats[key]['delta'] = 0 + stats[key]['mean'] = 0 + stats[key]['M2'] = 0 + stats[key]['lin_reg'] = 0 + stats[key]['min'] = maxint + stats[key]['max'] = 0 + stats[key]['total'] = 0 + stats[key]['nb_check'] += 1 + stats[key]['total'] += val[key] + if stats[key]['min'] > val[key]: + stats[key]['min'] = val[key] + if stats[key]['max'] < val[key]: + stats[key]['max'] = val[key] # Compute linear regression - stats['lin_reg'] += val * stats['nb_check'] + stats[key]['lin_reg'] += val[key] * stats[key]['nb_check'] # Compute variance - stats['delta'] = val - stats['mean'] - stats['mean'] += stats['delta'] / stats['nb_check'] - stats['M2'] += stats['delta'] * (val - stats['mean']) + stats[key]['delta'] = val[key] - stats[key]['mean'] + stats[key]['mean'] += stats[key]['delta'] / stats[key]['nb_check'] + stats[key]['M2'] += stats[key]['delta'] * (val[key] - stats[key]['mean']) return stats @staticmethod diff --git a/static/js/controllers/statsCtrl.js b/static/js/controllers/statsCtrl.js index 2bc98f1..5219ecf 100644 --- a/static/js/controllers/statsCtrl.js +++ b/static/js/controllers/statsCtrl.js @@ -4,10 +4,12 @@ mumApp.controller('statsCtrl', function($scope, $rootScope, $timeout, DataHosts) $scope.host_list.push(DataHosts.Items[i]['addr']) } $scope.mod_list = []; + $scope.subpart_list = []; //selection $scope.selected_host = ''; $scope.selected_mod = ''; + $scope.selected_subpart = ''; $scope.selected_period = ''; //data @@ -38,47 +40,73 @@ mumApp.controller('statsCtrl', function($scope, $rootScope, $timeout, DataHosts) } }); + $scope.update_subpart_list = function(){ + $scope.subpart_list = []; + for(subpart in $scope.stats[$scope.selected_mod]){ + $scope.subpart_list.push(subpart); + } + $scope.selected_subpart = ''; + if($scope.subpart_list.length == 1 && $scope.subpart_list[0] == ''){ + $scope.update_stats(); + } + }; + $scope.update_stats = function(){ $scope.selected_period = ''; update_mean(); update_standard_derivation(); update_slope_of_linear_regression(); - } + }; $scope.refresh_chart_data = function(){ $scope.config.title = $scope.selected_host; - $scope.data.series = [$scope.selected_mod]; $scope.data.data = []; - for(var i = 0; i<$scope.archive[$scope.selected_mod][$scope.selected_period].length; i++){ - $scope.data.data.push({'x': i, - 'y': [$scope.archive[$scope.selected_mod][$scope.selected_period][i].value], - 'tooltip': $scope.archive[$scope.selected_mod][$scope.selected_period][i].value + " @ " + - $scope.archive[$scope.selected_mod][$scope.selected_period][i].date.split('.')[0] - } - ) + if(typeof($scope.archive[$scope.selected_mod][$scope.selected_period][0].value) == "object"){ + $scope.data.series = [$scope.selected_mod + ' on ' + $scope.selected_subpart]; + for(var i = 0; i<$scope.archive[$scope.selected_mod][$scope.selected_period].length; i++){ + if($scope.archive[$scope.selected_mod][$scope.selected_period][i].value.hasOwnProperty($scope.selected_subpart)){ + $scope.data.data.push({'x': i, + 'y': [$scope.archive[$scope.selected_mod][$scope.selected_period][i].value[$scope.selected_subpart]], + 'tooltip': $scope.archive[$scope.selected_mod][$scope.selected_period][i].value[$scope.selected_subpart] + " @ " + + $scope.archive[$scope.selected_mod][$scope.selected_period][i].date.split('.')[0] + } + ) + } + } + } + else{ + $scope.data.series = [$scope.selected_mod]; + for(var i = 0; i<$scope.archive[$scope.selected_mod][$scope.selected_period].length; i++){ + $scope.data.data.push({'x': i, + 'y': [$scope.archive[$scope.selected_mod][$scope.selected_period][i].value], + 'tooltip': $scope.archive[$scope.selected_mod][$scope.selected_period][i].value + " @ " + + $scope.archive[$scope.selected_mod][$scope.selected_period][i].date.split('.')[0] + } + ) + } } }; $scope.value_is_NaN = function(value){ return value !== value; - } + }; var update_mean = function(){ - $scope.mean_value = $scope.stats[$scope.selected_mod].total / $scope.stats[$scope.selected_mod].nb_check; - } + $scope.mean_value = $scope.stats[$scope.selected_mod][$scope.selected_subpart].total / $scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check; + }; var update_standard_derivation = function(){ - var variance = $scope.stats[$scope.selected_mod].M2 / Math.max(1, $scope.stats[$scope.selected_mod].nb_check + 1); + var variance = $scope.stats[$scope.selected_mod][$scope.selected_subpart].M2 / Math.max(1, $scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check + 1); $scope.standard_derivation = Math.sqrt(variance); - } + }; var update_slope_of_linear_regression = function(){ - var mX = ($scope.stats[$scope.selected_mod].nb_check + 1) / 2; - var mY = $scope.stats[$scope.selected_mod].total / $scope.stats[$scope.selected_mod].nb_check; - var mX2 = ($scope.stats[$scope.selected_mod].nb_check + 1) * (2 * $scope.stats[$scope.selected_mod].nb_check + 1) / 6; - var mXY = $scope.stats[$scope.selected_mod].lin_reg / $scope.stats[$scope.selected_mod].nb_check; + var mX = ($scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check + 1) / 2; + var mY = $scope.stats[$scope.selected_mod][$scope.selected_subpart].total / $scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check; + var mX2 = ($scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check + 1) * (2 * $scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check + 1) / 6; + var mXY = $scope.stats[$scope.selected_mod][$scope.selected_subpart].lin_reg / $scope.stats[$scope.selected_mod][$scope.selected_subpart].nb_check; $scope.slope_lr = (mXY - mX * mY) / (mX2 - mX * mX); - } + }; $scope.config = { title: '', diff --git a/views/stats.html b/views/stats.html index 3dd01bb..d816bb1 100644 --- a/views/stats.html +++ b/views/stats.html @@ -16,6 +16,11 @@ <select ng-model="selected_mod" ng-options="mod for mod in mod_list" ng-show="selected_host != ''" + ng-change="update_subpart_list()"> + </select> + <select ng-model="selected_subpart" + ng-options="subpart for subpart in subpart_list" + ng-show="selected_mod != ''" ng-change="update_stats()"> </select> <select ng-model="selected_period" @@ -50,26 +55,4 @@ data-ac-config="config" class="chart"> </div> - <!--<div class="row placeholders"> - <div class="col-xs-6 col-sm-3 placeholder"> - <img src="data/index.svg" class="img-responsive" alt="Generic placeholder thumbnail"> - <h4>Label</h4> - <span class="text-muted">Something else</span> - </div> - <div class="col-xs-6 col-sm-3 placeholder"> - <img src="data/index.svg" class="img-responsive" alt="Generic placeholder thumbnail"> - <h4>Label</h4> - <span class="text-muted">Something else</span> - </div> - <div class="col-xs-6 col-sm-3 placeholder"> - <img src="data/index.svg" class="img-responsive" alt="Generic placeholder thumbnail"> - <h4>Label</h4> - <span class="text-muted">Something else</span> - </div> - <div class="col-xs-6 col-sm-3 placeholder"> - <img src="data/index.svg" class="img-responsive" alt="Generic placeholder thumbnail"> - <h4>Label</h4> - <span class="text-muted">Something else</span> - </div> - </div>--> </div> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.