aboutsummaryrefslogtreecommitdiffstats
path: root/NodeRRD.py
diff options
context:
space:
mode:
authorNils Schneider <nils@nilsschneider.net>2014-02-21 15:06:04 +0100
committerNils Schneider <nils@nilsschneider.net>2014-02-21 15:06:04 +0100
commitd6bd31f8d0c2fdca0c4b23434d4854d93b15fe50 (patch)
tree0f95c29f448356ef58f44831a6da7765ad2cbc3f /NodeRRD.py
parent791947234c9cb1d444170f8e03111981aefdab08 (diff)
parentca2ab676b39ff07a447f01b77c3d7692fa2aba0d (diff)
Merge pull request #20 from FreifunkBremen/RRD-module
RRD module
Diffstat (limited to 'NodeRRD.py')
-rw-r--r--NodeRRD.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/NodeRRD.py b/NodeRRD.py
new file mode 100644
index 0000000..f53cad6
--- /dev/null
+++ b/NodeRRD.py
@@ -0,0 +1,54 @@
+import os
+import subprocess
+from node import Node
+from RRD import RRD, DS, RRA
+
+class NodeRRD(RRD):
+ ds_list = [
+ DS('upstate', 'GAUGE', 120, 0, 1),
+ DS('clients', 'GAUGE', 120, 0, float('NaN')),
+ ]
+ rra_list = [
+ RRA('AVERAGE', 0.5, 1, 120), # 2 hours of 1 minute samples
+ RRA('AVERAGE', 0.5, 5, 1440), # 5 days of 5 minute samples
+ RRA('AVERAGE', 0.5, 60, 720), # 30 days of 1 hour samples
+ RRA('AVERAGE', 0.5, 720, 730), # 1 year of 12 hour samples
+ ]
+
+ def __init__(self, filename, node = None):
+ """
+ Create a new RRD for a given node.
+
+ If the RRD isn't supposed to be updated, the node can be omitted.
+ """
+ self.node = node
+ super().__init__(filename)
+ self.ensureSanity(self.ds_list, self.rra_list, step=60)
+
+ @property
+ def imagename(self):
+ return os.path.basename(self.filename).rsplit('.', 2)[0] + ".png"
+
+ def update(self):
+ super().update({'upstate': 1, 'clients': self.node.clients})
+
+ def graph(self, directory, timeframe):
+ """
+ Create a graph in the given directory. The file will be named
+ basename.png if the RRD file is named basename.rrd
+ """
+ args = ['rrdtool','graph', os.path.join(directory, self.imagename),
+ '-s', '-' + timeframe ,
+ '-w', '800',
+ '-h', '400',
+ '-l', '0',
+ '-y', '1:1',
+ 'DEF:clients=' + self.filename + ':clients:AVERAGE',
+ 'VDEF:maxc=clients,MAXIMUM',
+ 'CDEF:c=0,clients,ADDNAN',
+ 'CDEF:d=clients,UN,maxc,UN,1,maxc,IF,*',
+ 'AREA:c#0F0:up\\l',
+ 'AREA:d#F00:down\\l',
+ 'LINE1:c#00F:clients connected\\l',
+ ]
+ subprocess.check_output(args)