A Discrete-Event Network Simulator
API
flowmon-parse-results.py
Go to the documentation of this file.
1 from __future__ import division
2 import sys
3 import os
4 try:
5  from xml.etree import cElementTree as ElementTree
6 except ImportError:
7  from xml.etree import ElementTree
8 
9 def parse_time_ns(tm):
10  if tm.endswith('ns'):
11  return float(tm[:-2])
12  raise ValueError(tm)
13 
14 
15 
16 
18 
31  __slots_ = ['sourceAddress', 'destinationAddress', 'protocol', 'sourcePort', 'destinationPort']
32  def __init__(self, el):
33  '''! The initializer.
34  @param self The object pointer.
35  @param el The element.
36  '''
37  self.sourceAddresssourceAddress = el.get('sourceAddress')
38  self.destinationAddressdestinationAddress = el.get('destinationAddress')
39  self.sourcePortsourcePort = int(el.get('sourcePort'))
40  self.destinationPortdestinationPort = int(el.get('destinationPort'))
41  self.protocolprotocol = int(el.get('protocol'))
42 
43 
45 
54  __slots_ = 'bins', 'nbins', 'number_of_flows'
55  def __init__(self, el=None):
56  '''! The initializer.
57  @param self The object pointer.
58  @param el The element.
59  '''
60  self.binsbins = []
61  if el is not None:
62  #self.nbins = int(el.get('nBins'))
63  for bin in el.findall('bin'):
64  self.binsbins.append( (float(bin.get("start")), float(bin.get("width")), int(bin.get("count"))) )
65 
66 
67 class Flow(object):
68 
93  __slots_ = ['flowId', 'delayMean', 'packetLossRatio', 'rxBitrate', 'txBitrate',
94  'fiveTuple', 'packetSizeMean', 'probe_stats_unsorted',
95  'hopCount', 'flowInterruptionsHistogram', 'rx_duration']
96  def __init__(self, flow_el):
97  '''! The initializer.
98  @param self The object pointer.
99  @param flow_el The element.
100  '''
101  self.flowIdflowId = int(flow_el.get('flowId'))
102  rxPackets = float(flow_el.get('rxPackets'))
103  txPackets = float(flow_el.get('txPackets'))
104 
105  tx_duration = (parse_time_ns (flow_el.get('timeLastTxPacket')) - parse_time_ns(flow_el.get('timeFirstTxPacket')))*1e-9
106  rx_duration = (parse_time_ns (flow_el.get('timeLastRxPacket')) - parse_time_ns(flow_el.get('timeFirstRxPacket')))*1e-9
107  self.rx_durationrx_duration = rx_duration
108  self.probe_stats_unsortedprobe_stats_unsorted = []
109  if rxPackets:
110  self.hopCounthopCount = float(flow_el.get('timesForwarded')) / rxPackets + 1
111  else:
112  self.hopCounthopCount = -1000
113  if rxPackets:
114  self.delayMeandelayMean = float(flow_el.get('delaySum')[:-2]) / rxPackets * 1e-9
115  self.packetSizeMeanpacketSizeMean = float(flow_el.get('rxBytes')) / rxPackets
116  else:
117  self.delayMeandelayMean = None
118  self.packetSizeMeanpacketSizeMean = None
119  if rx_duration > 0:
120  self.rxBitraterxBitrate = float(flow_el.get('rxBytes'))*8 / rx_duration
121  else:
122  self.rxBitraterxBitrate = None
123  if tx_duration > 0:
124  self.txBitratetxBitrate = float(flow_el.get('txBytes'))*8 / tx_duration
125  else:
126  self.txBitratetxBitrate = None
127  lost = float(flow_el.get('lostPackets'))
128  #print "rxBytes: %s; txPackets: %s; rxPackets: %s; lostPackets: %s" % (flow_el.get('rxBytes'), txPackets, rxPackets, lost)
129  if rxPackets == 0:
130  self.packetLossRatiopacketLossRatio = None
131  else:
132  self.packetLossRatiopacketLossRatio = (lost / (rxPackets + lost))
133 
134  interrupt_hist_elem = flow_el.find("flowInterruptionsHistogram")
135  if interrupt_hist_elem is None:
136  self.flowInterruptionsHistogramflowInterruptionsHistogram = None
137  else:
138  self.flowInterruptionsHistogramflowInterruptionsHistogram = Histogram(interrupt_hist_elem)
139 
140 
142 
153  __slots_ = ['probeId', 'packets', 'bytes', 'delayFromFirstProbe']
154 
155 
157 
160  def __init__(self, simulation_el):
161  '''! The initializer.
162  @param self The object pointer.
163  @param simulation_el The element.
164  '''
165  self.flowsflows = []
166  FlowClassifier_el, = simulation_el.findall("Ipv4FlowClassifier")
167  flow_map = {}
168  for flow_el in simulation_el.findall("FlowStats/Flow"):
169  flow = Flow(flow_el)
170  flow_map[flow.flowId] = flow
171  self.flowsflows.append(flow)
172  for flow_cls in FlowClassifier_el.findall("Flow"):
173  flowId = int(flow_cls.get('flowId'))
174  flow_map[flowId].fiveTuple = FiveTuple(flow_cls)
175 
176  for probe_elem in simulation_el.findall("FlowProbes/FlowProbe"):
177  probeId = int(probe_elem.get('index'))
178  for stats in probe_elem.findall("FlowStats"):
179  flowId = int(stats.get('flowId'))
180  s = ProbeFlowStats()
181  s.packets = int(stats.get('packets'))
182  s.bytes = float(stats.get('bytes'))
183  s.probeId = probeId
184  if s.packets > 0:
185  s.delayFromFirstProbe = parse_time_ns(stats.get('delayFromFirstProbeSum')) / float(s.packets)
186  else:
187  s.delayFromFirstProbe = 0
188  flow_map[flowId].probe_stats_unsorted.append(s)
189 
190 
191 def main(argv):
192  file_obj = open(argv[1])
193  print("Reading XML file ", end=" ")
194 
195  sys.stdout.flush()
196  level = 0
197  sim_list = []
198  for event, elem in ElementTree.iterparse(file_obj, events=("start", "end")):
199  if event == "start":
200  level += 1
201  if event == "end":
202  level -= 1
203  if level == 0 and elem.tag == 'FlowMonitor':
204  sim = Simulation(elem)
205  sim_list.append(sim)
206  elem.clear() # won't need this any more
207  sys.stdout.write(".")
208  sys.stdout.flush()
209  print(" done.")
210 
211 
212  for sim in sim_list:
213  for flow in sim.flows:
214  t = flow.fiveTuple
215  proto = {6: 'TCP', 17: 'UDP'} [t.protocol]
216  print("FlowID: %i (%s %s/%s --> %s/%i)" % \
217  (flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort))
218  if flow.txBitrate is None:
219  print("\tTX bitrate: None")
220  else:
221  print("\tTX bitrate: %.2f kbit/s" % (flow.txBitrate*1e-3,))
222  if flow.rxBitrate is None:
223  print("\tRX bitrate: None")
224  else:
225  print("\tRX bitrate: %.2f kbit/s" % (flow.rxBitrate*1e-3,))
226  if flow.delayMean is None:
227  print("\tMean Delay: None")
228  else:
229  print("\tMean Delay: %.2f ms" % (flow.delayMean*1e3,))
230  if flow.packetLossRatio is None:
231  print("\tPacket Loss Ratio: None")
232  else:
233  print("\tPacket Loss Ratio: %.2f %%" % (flow.packetLossRatio*100))
234 
235 
236 if __name__ == '__main__':
237  main(sys.argv)
def __init__(self, el)
The initializer.
sourceAddress
class variablessource address
def __init__(self, flow_el)
The initializer.
flowId
class variablesdelay ID
probe_stats_unsorted
unsirted probe stats
def __init__(self, el=None)
The initializer.
bins
class variableshistogram bins
flows
class variableslist of flows
def __init__(self, simulation_el)
The initializer.