Remove cache, read directly and constantly from MMAP -- the update threads only fire every 10s anyway; so even a hammering snmp client won't interact with VPP more than once-per-10s
This commit is contained in:
@ -7,23 +7,6 @@ import pyagentx
|
|||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
vppstat_lastread = 0
|
|
||||||
vppstat_ifstat = {
|
|
||||||
'ifNames': [],
|
|
||||||
'ifHCInOctets': [],
|
|
||||||
'ifHCInUcastPkts': [],
|
|
||||||
'ifHCInMulticastPkts': [],
|
|
||||||
'ifHCInBroadcastPkts': [],
|
|
||||||
'ifHCOutOctets': [],
|
|
||||||
'ifHCOutUcastPkts': [],
|
|
||||||
'ifHCOutMulticastPkts': [],
|
|
||||||
'ifHCOutBroadcastPkts': [],
|
|
||||||
'ifHighSpeed': []
|
|
||||||
}
|
|
||||||
|
|
||||||
vppstat_lock = threading.Lock()
|
|
||||||
|
|
||||||
|
|
||||||
class NullHandler(logging.Handler):
|
class NullHandler(logging.Handler):
|
||||||
def emit(self, record):
|
def emit(self, record):
|
||||||
pass
|
pass
|
||||||
@ -32,245 +15,149 @@ class NullHandler(logging.Handler):
|
|||||||
logger = logging.getLogger('pyagentx.vpp')
|
logger = logging.getLogger('pyagentx.vpp')
|
||||||
logger.addHandler(NullHandler())
|
logger.addHandler(NullHandler())
|
||||||
|
|
||||||
|
|
||||||
def vppstat_update():
|
|
||||||
global vppstat_lastread, vppstat_lock, vppstat_ifstat, logger
|
|
||||||
|
|
||||||
vppstat_lock.acquire()
|
|
||||||
try:
|
|
||||||
if time.time() - vppstat_lastread < 9.0:
|
|
||||||
logger.debug("Skipping, cache still fresh")
|
|
||||||
vppstat_lock.release()
|
|
||||||
return
|
|
||||||
|
|
||||||
logger.info("Fetching interface data from VPP")
|
|
||||||
vppstat = VPPStats(socketname='/run/vpp/stats.sock', timeout=2)
|
|
||||||
vppstat.connect()
|
|
||||||
vppstat_ifstat['ifNames'].clear()
|
|
||||||
vppstat_ifstat['ifHCInOctets'].clear()
|
|
||||||
vppstat_ifstat['ifHCInUcastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHCInMulticastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHCInBroadcastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHCOutOctets'].clear()
|
|
||||||
vppstat_ifstat['ifHCOutUcastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHCOutMulticastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHCOutBroadcastPkts'].clear()
|
|
||||||
vppstat_ifstat['ifHighSpeed'].clear()
|
|
||||||
|
|
||||||
vppstat_ifstat['ifNames'] = vppstat['/if/names']
|
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
|
||||||
vppstat_ifstat['ifHCInOctets'].append(
|
|
||||||
vppstat['/if/rx'][:, i].sum_octets())
|
|
||||||
vppstat_ifstat['ifHCInUcastPkts'].append(
|
|
||||||
vppstat['/if/rx'][:, i].sum_packets())
|
|
||||||
vppstat_ifstat['ifHCInMulticastPkts'].append(
|
|
||||||
vppstat['/if/rx-multicast'][:, i].sum_packets())
|
|
||||||
vppstat_ifstat['ifHCInBroadcastPkts'].append(
|
|
||||||
vppstat['/if/rx-broadcast'][:, i].sum_packets())
|
|
||||||
|
|
||||||
vppstat_ifstat['ifHCOutOctets'].append(
|
|
||||||
vppstat['/if/tx'][:, i].sum_octets())
|
|
||||||
vppstat_ifstat['ifHCOutUcastPkts'].append(
|
|
||||||
vppstat['/if/tx'][:, i].sum_packets())
|
|
||||||
vppstat_ifstat['ifHCOutMulticastPkts'].append(
|
|
||||||
vppstat['/if/tx-multicast'][:, i].sum_packets())
|
|
||||||
vppstat_ifstat['ifHCOutBroadcastPkts'].append(
|
|
||||||
vppstat['/if/tx-broadcast'][:, i].sum_packets())
|
|
||||||
|
|
||||||
# TODO(pim) retrieve from vpp_papi
|
|
||||||
# IF-MIB::ifHighSpeed.2 = Gauge32: 1000
|
|
||||||
vppstat_ifstat['ifHighSpeed'].append(1000)
|
|
||||||
|
|
||||||
|
|
||||||
# TODO(pim) retrieve from linux namespace if present
|
|
||||||
# IF-MIB::ifAlias.2 = STRING: Infra: nikhef-core-1.nl.switch.coloclue.net e1/34
|
|
||||||
|
|
||||||
# Initializing these to defaults:
|
|
||||||
# IF-MIB::ifPromiscuousMode.2 = INTEGER: false(2)
|
|
||||||
# IF-MIB::ifConnectorPresent.2 = INTEGER: true(1)
|
|
||||||
# IF-MIB::ifCounterDiscontinuityTime.2 = Timeticks: (0) 0:00:00.00
|
|
||||||
|
|
||||||
logger.info("Fetched data for %u interfaces" %
|
|
||||||
len(vppstat_ifstat['ifNames']))
|
|
||||||
vppstat_lastread = time.time()
|
|
||||||
vppstat.disconnect()
|
|
||||||
except Exception as e:
|
|
||||||
logger.error("Error occured, releasing lock: ", e)
|
|
||||||
vppstat_lock.release()
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ifName(pyagentx.Updater):
|
class ifName(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_OCTETSTRING(str(i + 1), vppstat['/if/names'][i])
|
||||||
self.set_OCTETSTRING(str(i + 1), vppstat_ifstat['ifNames'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifAlias(pyagentx.Updater):
|
class ifAlias(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_OCTETSTRING(str(i + 1), vppstat['/if/names'][i])
|
||||||
self.set_OCTETSTRING(str(i + 1), vppstat_ifstat['ifNames'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifInMulticastPkts(pyagentx.Updater):
|
class ifInMulticastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER32(str(i + 1), vppstat['/if/rx-multicast'][:, i].sum_packets())
|
||||||
self.set_COUNTER32(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCInMulticastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifInBroadcastPkts(pyagentx.Updater):
|
class ifInBroadcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER32(str(i + 1), vppstat['/if/rx-broadcast'][:, i].sum_packets())
|
||||||
self.set_COUNTER32(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCInBroadcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifOutMulticastPkts(pyagentx.Updater):
|
class ifOutMulticastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER32(str(i + 1), vppstat['/if/tx-multicast'][:, i].sum_packets())
|
||||||
self.set_COUNTER32(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCOutMulticastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifOutBroadcastPkts(pyagentx.Updater):
|
class ifOutBroadcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER32(str(i + 1), vppstat['/if/tx-broadcast'][:, i].sum_packets())
|
||||||
self.set_COUNTER32(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCOutBroadcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCInOctets(pyagentx.Updater):
|
class ifHCInOctets(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/rx'][:, i].sum_octets())
|
||||||
self.set_COUNTER64(str(i + 1), vppstat_ifstat['ifHCInOctets'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCInUcastPkts(pyagentx.Updater):
|
class ifHCInUcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/rx'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCInUcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCInMulticastPkts(pyagentx.Updater):
|
class ifHCInMulticastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/rx-multicast'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCInMulticastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCInBroadcastPkts(pyagentx.Updater):
|
class ifHCInBroadcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/rx-broadcast'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCInBroadcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCOutOctets(pyagentx.Updater):
|
class ifHCOutOctets(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/tx'][:, i].sum_octets())
|
||||||
self.set_COUNTER64(str(i + 1), vppstat_ifstat['ifHCOutOctets'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCOutUcastPkts(pyagentx.Updater):
|
class ifHCOutUcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/tx'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCOutUcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCOutMulticastPkts(pyagentx.Updater):
|
class ifHCOutMulticastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/tx-multicast'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCOutMulticastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHCOutBroadcastPkts(pyagentx.Updater):
|
class ifHCOutBroadcastPkts(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_COUNTER64(str(i + 1), vppstat['/if/tx-broadcast'][:, i].sum_packets())
|
||||||
self.set_COUNTER64(str(i + 1),
|
|
||||||
vppstat_ifstat['ifHCOutBroadcastPkts'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifHighSpeed(pyagentx.Updater):
|
class ifHighSpeed(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
self.set_GAUGE32(str(i + 1), 1000)
|
||||||
self.set_GAUGE32(str(i + 1), vppstat_ifstat['ifHighSpeed'][i])
|
|
||||||
|
|
||||||
|
|
||||||
class ifPromiscuousMode(pyagentx.Updater):
|
class ifPromiscuousMode(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
|
||||||
# Hardcode to false(2)
|
# Hardcode to false(2)
|
||||||
self.set_INTEGER(str(i + 1), 2)
|
self.set_INTEGER(str(i + 1), 2)
|
||||||
|
|
||||||
|
|
||||||
class ifConnectorPresent(pyagentx.Updater):
|
class ifConnectorPresent(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
|
||||||
# Hardcode to true(1)
|
# Hardcode to true(1)
|
||||||
self.set_INTEGER(str(i + 1), 1)
|
self.set_INTEGER(str(i + 1), 1)
|
||||||
|
|
||||||
|
|
||||||
class ifCounterDiscontinuityTime(pyagentx.Updater):
|
class ifCounterDiscontinuityTime(pyagentx.Updater):
|
||||||
def update(self):
|
def update(self):
|
||||||
global vppstat_ifstat
|
global vppstat
|
||||||
|
|
||||||
vppstat_update()
|
for i in range(len(vppstat['/if/names'])):
|
||||||
for i in range(len(vppstat_ifstat['ifNames'])):
|
|
||||||
# Hardcode to Timeticks: (0) 0:00:00.00
|
# Hardcode to Timeticks: (0) 0:00:00.00
|
||||||
self.set_TIMETICKS(str(i + 1), 0)
|
self.set_TIMETICKS(str(i + 1), 0)
|
||||||
|
|
||||||
@ -301,8 +188,13 @@ class MyAgent(pyagentx.Agent):
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
global vppstat
|
||||||
|
|
||||||
pyagentx.setup_logging()
|
pyagentx.setup_logging()
|
||||||
|
|
||||||
|
vppstat = VPPStats(socketname='/run/vpp/stats.sock', timeout=2)
|
||||||
|
vppstat.connect()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
a = MyAgent()
|
a = MyAgent()
|
||||||
a.start()
|
a.start()
|
||||||
@ -312,6 +204,7 @@ def main():
|
|||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
a.stop()
|
a.stop()
|
||||||
|
|
||||||
|
vppstat.disconnect()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
Reference in New Issue
Block a user