diff options
Diffstat (limited to 'sugar_network/node')
-rw-r--r-- | sugar_network/node/routes.py | 12 | ||||
-rw-r--r-- | sugar_network/node/stats_node.py | 20 |
2 files changed, 20 insertions, 12 deletions
diff --git a/sugar_network/node/routes.py b/sugar_network/node/routes.py index 7b36b12..1182f28 100644 --- a/sugar_network/node/routes.py +++ b/sugar_network/node/routes.py @@ -35,7 +35,7 @@ from sugar_network.toolkit.bundle import Bundle from sugar_network.toolkit import pylru, http, coroutine, exception, enforce -_MAX_STAT_RECORDS = 128 +_MAX_STAT_RECORDS = 100 _AUTH_POOL_SIZE = 1024 _logger = logging.getLogger('node.routes') @@ -88,16 +88,16 @@ class NodeRoutes(model.VolumeRoutes, model.FrontRoutes): 'start': int, 'end': int, 'records': int, 'source': list}, mime_type='application/json') def stats(self, start, end, records, source): - if not source or records <= 0 or start > end: - return {} - enforce(self._stats is not None, 'Node stats is disabled') + if not source: + return {} if records > _MAX_STAT_RECORDS: _logger.debug('Decrease %d stats records number to %d', records, _MAX_STAT_RECORDS) records = _MAX_STAT_RECORDS - resolution = (end - start) / records + elif records <= 0: + records = _MAX_STAT_RECORDS / 10 stats = {} for i in source: @@ -105,7 +105,7 @@ class NodeRoutes(model.VolumeRoutes, model.FrontRoutes): db_name, ds_name = i.split('.', 1) stats.setdefault(db_name, []).append(ds_name) - return self._stats.report(stats, start, end, resolution) + return self._stats.report(stats, start, end, records) @route('POST', ['user'], mime_type='application/json') def register(self, request): diff --git a/sugar_network/node/stats_node.py b/sugar_network/node/stats_node.py index 0cba0b8..61a4a28 100644 --- a/sugar_network/node/stats_node.py +++ b/sugar_network/node/stats_node.py @@ -40,8 +40,6 @@ stats_node_rras = Option( ], type_cast=Option.list_cast, type_repr=Option.list_repr) -_MAX_FRAME = 64 - _logger = logging.getLogger('node.stats_node') @@ -71,17 +69,27 @@ class Sniffer(object): if values is not None: self._rrd[resource].put(values, timestamp=timestamp) - def report(self, dbs, start, end, resolution): + def report(self, dbs, start, end, records): result = {} - for rdb in self._rrd: - if rdb.name not in dbs: - continue + + rdbs = [self._rrd[i] for i in dbs if i in self._rrd] + if not rdbs: + return result + + if not start: + start = min([i.first for i in rdbs]) + if not end: + end = max([i.last for i in rdbs]) + resolution = max(1, (end - start) / records) + + for rdb in rdbs: info = result[rdb.name] = [] for ts, ds_values in rdb.get(start, end, resolution): values = {} for name in dbs[rdb.name]: values[name] = ds_values.get(name) info.append((ts, values)) + return result |