NodeRRD: add many more DS, rrd.py: generate neighbor counts

rewrite
Jan-Philipp Litza 2014-02-22 13:35:34 +01:00
parent 43e70191f1
commit 7075d8481c
3 changed files with 40 additions and 2 deletions

View File

@ -7,6 +7,19 @@ class NodeRRD(RRD):
ds_list = [ ds_list = [
DS('upstate', 'GAUGE', 120, 0, 1), DS('upstate', 'GAUGE', 120, 0, 1),
DS('clients', 'GAUGE', 120, 0, float('NaN')), DS('clients', 'GAUGE', 120, 0, float('NaN')),
DS('neighbors', 'GAUGE', 120, 0, float('NaN')),
DS('vpn_neighbors', 'GAUGE', 120, 0, float('NaN')),
DS('loadavg', 'GAUGE', 120, 0, float('NaN')),
DS('rx_bytes', 'DERIVE', 120, 0, float('NaN')),
DS('rx_packets', 'DERIVE', 120, 0, float('NaN')),
DS('tx_bytes', 'DERIVE', 120, 0, float('NaN')),
DS('tx_packets', 'DERIVE', 120, 0, float('NaN')),
DS('mgmt_rx_bytes', 'DERIVE', 120, 0, float('NaN')),
DS('mgmt_rx_packets', 'DERIVE', 120, 0, float('NaN')),
DS('mgmt_tx_bytes', 'DERIVE', 120, 0, float('NaN')),
DS('mgmt_tx_packets', 'DERIVE', 120, 0, float('NaN')),
DS('forward_bytes', 'DERIVE', 120, 0, float('NaN')),
DS('forward_packets', 'DERIVE', 120, 0, float('NaN')),
] ]
rra_list = [ rra_list = [
RRA('AVERAGE', 0.5, 1, 120), # 2 hours of 1 minute samples RRA('AVERAGE', 0.5, 1, 120), # 2 hours of 1 minute samples
@ -30,7 +43,23 @@ class NodeRRD(RRD):
return os.path.basename(self.filename).rsplit('.', 2)[0] + ".png" return os.path.basename(self.filename).rsplit('.', 2)[0] + ".png"
def update(self): def update(self):
super().update({'upstate': 1, 'clients': self.node.clients}) values = {
'upstate': 1,
'clients': float(self.node.clients),
'neighbors': float(self.node.neighbors),
'vpn_neighbors': float(self.node.vpn_neighbors),
'loadavg': float(self.node.statistics['loadavg']),
}
for item in ('rx', 'tx', 'mgmt_rx', 'mgmt_tx', 'forward'):
try:
values['%s_bytes' % item] = int(self.node.statistics['traffic'][item]['bytes'])
except TypeError:
pass
try:
values['%s_packets' % item] = int(self.node.statistics['traffic'][item]['packets'])
except TypeError:
pass
super().update(values)
def graph(self, directory, timeframe): def graph(self, directory, timeframe):
""" """

View File

@ -12,6 +12,7 @@ class NoneDict:
__bool__ = lambda self: False __bool__ = lambda self: False
__getitem__ = lambda self, k: NoneDict() __getitem__ = lambda self, k: NoneDict()
__json__ = lambda self: None __json__ = lambda self: None
__float__ = lambda self: float('NaN')
def __setitem__(self, key, value): def __setitem__(self, key, value):
raise RuntimeError("NoneDict is readonly") raise RuntimeError("NoneDict is readonly")

10
rrd.py
View File

@ -33,7 +33,9 @@ class rrd:
if node.flags['online']: if node.flags['online']:
if not node.flags['client']: if not node.flags['client']:
nodes[node.id] = node nodes[node.id] = node
node.clients = 0; node.clients = 0
node.neighbors = 0
node.vpn_neighbors = 0
if 'legacy' in node.flags and node.flags['legacy']: if 'legacy' in node.flags and node.flags['legacy']:
clientCount -= 1 clientCount -= 1
else: else:
@ -45,6 +47,12 @@ class rrd:
nodes[source].clients += 1 nodes[source].clients += 1
elif target in nodes and not source in nodes: elif target in nodes and not source in nodes:
nodes[target].clients += 1 nodes[target].clients += 1
elif source in nodes and target in nodes:
nodes[source].neighbors += 1
nodes[target].neighbors += 1
if link.type == 'vpn':
nodes[target].vpn_neighbors += 1
nodes[source].vpn_neighbors += 1
self.globalDb.update(len(nodes), clientCount) self.globalDb.update(len(nodes), clientCount)
for node in nodes.values(): for node in nodes.values():