diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-10-31 20:31:25 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-10-31 20:31:25 (GMT) |
commit | db503a6b784bfcba83968e7c26fb8d7f5673189e (patch) | |
tree | 78481e4af2346f43c020fc22a9cd6c24d4c3c05a /sugar_network/toolkit/rrd.py | |
parent | 82dba01df6c4cb85b4bff1fd6005a0e8b1139831 (diff) |
Get access to node stats via API
Diffstat (limited to 'sugar_network/toolkit/rrd.py')
-rw-r--r-- | sugar_network/toolkit/rrd.py | 84 |
1 files changed, 39 insertions, 45 deletions
diff --git a/sugar_network/toolkit/rrd.py b/sugar_network/toolkit/rrd.py index 5fe9f44..6937e92 100644 --- a/sugar_network/toolkit/rrd.py +++ b/sugar_network/toolkit/rrd.py @@ -17,7 +17,7 @@ $Repo: git://git.sugarlabs.org/alsroot/codelets.git$ $File: src/rrd.py$ -$Date: 2012-08-09$ +$Date: 2012-10-31$ """ @@ -42,11 +42,11 @@ _logger = logging.getLogger('sugar_stats') class Rrd(object): - def __init__(self, root, step, rras): + def __init__(self, root, step, rras=None): self._root = root self._step = step # rrdtool knows nothing about `unicode` - self._rras = [i.encode('utf8') for i in rras] + self._rras = [i.encode('utf8') for i in rras or []] self._dbsets = {} if not exists(self._root): @@ -56,7 +56,14 @@ class Rrd(object): match = _DB_FILENAME_RE.match(filename) if match is not None: name, revision = match.groups() - self._dbset(name).load(filename, int(revision or 0)) + self.get(name).load(filename, int(revision or 0)) + + def __iter__(self): + for i in self._dbsets.values(): + yield i + + def __getitem__(self, name): + return self.get(name) @property def root(self): @@ -66,20 +73,7 @@ class Rrd(object): def step(self): return self._step - @property - def dbs(self): - for name, dbset in self._dbsets.items(): - db = dbset.db - if db is not None: - yield name, db.first, db.last_update - - def put(self, name, values, timestamp=None): - self._dbset(name).put(values, timestamp) - - def get(self, name, start=None, end=None): - return self._dbset(name).get(start, end) - - def _dbset(self, name): + def get(self, name): db = self._dbsets.get(name) if db is None: db = self._dbsets[name] = \ @@ -87,20 +81,11 @@ class Rrd(object): return db -class ReadOnlyRrd(Rrd): - - def __init__(self, root): - Rrd.__init__(self, root, 1, []) - - def put(self, name, values, timestamp=None): - raise RuntimeError('Write access is denied') - - class _DbSet(object): def __init__(self, root, name, step, rras): self._root = root - self._name = name + self.name = name self._step = step self._rras = rras self._revisions = [] @@ -108,9 +93,14 @@ class _DbSet(object): self.__db = None @property - def db(self): + def first(self): if self._revisions: - return self._revisions[-1] + return self._revisions[0].first + + @property + def last(self): + if self._revisions: + return self._revisions[-1].last def load(self, filename, revision): _logger.debug('Load %s database from %s with revision %s', @@ -132,9 +122,9 @@ class _DbSet(object): if db is None: return - if timestamp <= db.last_update: + if timestamp <= db.last: _logger.warning('Database %s updated at %s, %s in the past', - db.path, db.last_update, timestamp) + db.path, db.last, timestamp) return value = [str(timestamp)] @@ -145,26 +135,29 @@ class _DbSet(object): db.put(':'.join(value)) - def get(self, start=None, end=None): + def get(self, start=None, end=None, resolution=None): if not self._revisions: return + if not resolution: + resolution = self._step + if start is None: start = self._revisions[0].first if end is None: - end = self._revisions[-1].last_update + end = self._revisions[-1].last revisions = [] for db in reversed(self._revisions): revisions.append(db) - if db.last_update <= start: + if db.last <= start: break - start = start / self._step * self._step - self._step - end = end / self._step * self._step - self._step + start = start - start % self._step - self._step + end = end - end % self._step - self._step for db in reversed(revisions): - db_end = min(end, db.last_update - self._step) + db_end = min(end, db.last - self._step) while start <= db_end: until = max(start, min(start + _FETCH_PAGE, db_end)) @@ -172,7 +165,8 @@ class _DbSet(object): str(db.path), 'AVERAGE', '--start', str(start), - '--end', str(until)) + '--end', str(until), + '--resolution', str(resolution)) for raw_row in rows: row_start += row_step row = {} @@ -188,22 +182,22 @@ class _DbSet(object): if self.__db is None and self._field_names: if self._revisions: db = self._revisions[-1] - if db.last_update >= timestamp: + if db.last >= timestamp: _logger.warning( 'Database %s updated at %s, %s in the past', - db.path, db.last_update, timestamp) + db.path, db.last, timestamp) return None if db.step != self._step or db.rras != self._rras or \ db.field_names != self._field_names: db = self._create_db(self._field_names, db.revision + 1, - db.last_update) + db.last) else: db = self._create_db(self._field_names, 0, timestamp) self.__db = db return self.__db def _create_db(self, field_names, revision, timestamp): - filename = self._name + filename = self.name if revision: filename += '-%s' % revision filename += '.rrd' @@ -235,7 +229,7 @@ class _Db(object): info = rrdtool.info(self.path) self.step = info['step'] - self.last_update = info['last_update'] + self.last = info['last_update'] fields = {} rras = {} @@ -265,7 +259,7 @@ class _Db(object): def put(self, value): rrdtool.update(self.path, str(value)) - self.last_update = rrdtool.info(self.path)['last_update'] + self.last = rrdtool.info(self.path)['last_update'] @property def first(self): |