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 
50  __slots_ = 'bins', 'nbins', 'number_of_flows'
51  def __init__(self, el=None):
52  '''! The initializer.
53  @param self The object pointer.
54  @param el The element.
55  '''
56  self.binsbins = []
57  if el is not None:
58  #self.nbins = int(el.get('nBins'))
59  for bin in el.findall('bin'):
60  self.binsbins.append( (float(bin.get("start")), float(bin.get("width")), int(bin.get("count"))) )
61 
62 
63 class Flow(object):
64 
87  __slots_ = ['flowId', 'delayMean', 'packetLossRatio', 'rxBitrate', 'txBitrate',
88  'fiveTuple', 'packetSizeMean', 'probe_stats_unsorted',
89  'hopCount', 'flowInterruptionsHistogram', 'rx_duration']
90  def __init__(self, flow_el):
91  '''! The initializer.
92  @param self The object pointer.
93  @param flow_el The element.
94  '''
95  self.flowIdflowId = int(flow_el.get('flowId'))
96  rxPackets = float(flow_el.get('rxPackets'))
97  txPackets = float(flow_el.get('txPackets'))
98 
99  tx_duration = (parse_time_ns (flow_el.get('timeLastTxPacket')) - parse_time_ns(flow_el.get('timeFirstTxPacket')))*1e-9
100  rx_duration = (parse_time_ns (flow_el.get('timeLastRxPacket')) - parse_time_ns(flow_el.get('timeFirstRxPacket')))*1e-9
101  self.rx_durationrx_duration = rx_duration
102  self.probe_stats_unsortedprobe_stats_unsorted = []
103  if rxPackets:
104  self.hopCounthopCount = float(flow_el.get('timesForwarded')) / rxPackets + 1
105  else:
106  self.hopCounthopCount = -1000
107  if rxPackets:
108  self.delayMeandelayMean = float(flow_el.get('delaySum')[:-2]) / rxPackets * 1e-9
109  self.packetSizeMeanpacketSizeMean = float(flow_el.get('rxBytes')) / rxPackets
110  else:
111  self.delayMeandelayMean = None
112  self.packetSizeMeanpacketSizeMean = None
113  if rx_duration > 0:
114  self.rxBitraterxBitrate = float(flow_el.get('rxBytes'))*8 / rx_duration
115  else:
116  self.rxBitraterxBitrate = None
117  if tx_duration > 0:
118  self.txBitratetxBitrate = float(flow_el.get('txBytes'))*8 / tx_duration
119  else:
120  self.txBitratetxBitrate = None
121  lost = float(flow_el.get('lostPackets'))
122  #print "rxBytes: %s; txPackets: %s; rxPackets: %s; lostPackets: %s" % (flow_el.get('rxBytes'), txPackets, rxPackets, lost)
123  if rxPackets == 0:
124  self.packetLossRatiopacketLossRatio = None
125  else:
126  self.packetLossRatiopacketLossRatio = (lost / (rxPackets + lost))
127 
128  interrupt_hist_elem = flow_el.find("flowInterruptionsHistogram")
129  if interrupt_hist_elem is None:
130  self.flowInterruptionsHistogramflowInterruptionsHistogram = None
131  else:
132  self.flowInterruptionsHistogramflowInterruptionsHistogram = Histogram(interrupt_hist_elem)
133 
134 
136 
143  __slots_ = ['probeId', 'packets', 'bytes', 'delayFromFirstProbe']
144 
145 
147 
150  def __init__(self, simulation_el):
151  '''! The initializer.
152  @param self The object pointer.
153  @param simulation_el The element.
154  '''
155  self.flowsflows = []
156  FlowClassifier_el, = simulation_el.findall("Ipv4FlowClassifier")
157  flow_map = {}
158  for flow_el in simulation_el.findall("FlowStats/Flow"):
159  flow = Flow(flow_el)
160  flow_map[flow.flowId] = flow
161  self.flowsflows.append(flow)
162  for flow_cls in FlowClassifier_el.findall("Flow"):
163  flowId = int(flow_cls.get('flowId'))
164  flow_map[flowId].fiveTuple = FiveTuple(flow_cls)
165 
166  for probe_elem in simulation_el.findall("FlowProbes/FlowProbe"):
167  probeId = int(probe_elem.get('index'))
168  for stats in probe_elem.findall("FlowStats"):
169  flowId = int(stats.get('flowId'))
170  s = ProbeFlowStats()
171  s.packets = int(stats.get('packets'))
172  s.bytes = float(stats.get('bytes'))
173  s.probeId = probeId
174  if s.packets > 0:
175  s.delayFromFirstProbe = parse_time_ns(stats.get('delayFromFirstProbeSum')) / float(s.packets)
176  else:
177  s.delayFromFirstProbe = 0
178  flow_map[flowId].probe_stats_unsorted.append(s)
179 
180 
181 def main(argv):
182  file_obj = open(argv[1])
183  print("Reading XML file ", end=" ")
184 
185  sys.stdout.flush()
186  level = 0
187  sim_list = []
188  for event, elem in ElementTree.iterparse(file_obj, events=("start", "end")):
189  if event == "start":
190  level += 1
191  if event == "end":
192  level -= 1
193  if level == 0 and elem.tag == 'FlowMonitor':
194  sim = Simulation(elem)
195  sim_list.append(sim)
196  elem.clear() # won't need this any more
197  sys.stdout.write(".")
198  sys.stdout.flush()
199  print(" done.")
200 
201 
202  for sim in sim_list:
203  for flow in sim.flows:
204  t = flow.fiveTuple
205  proto = {6: 'TCP', 17: 'UDP'} [t.protocol]
206  print("FlowID: %i (%s %s/%s --> %s/%i)" % \
207  (flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort))
208  if flow.txBitrate is None:
209  print("\tTX bitrate: None")
210  else:
211  print("\tTX bitrate: %.2f kbit/s" % (flow.txBitrate*1e-3,))
212  if flow.rxBitrate is None:
213  print("\tRX bitrate: None")
214  else:
215  print("\tRX bitrate: %.2f kbit/s" % (flow.rxBitrate*1e-3,))
216  if flow.delayMean is None:
217  print("\tMean Delay: None")
218  else:
219  print("\tMean Delay: %.2f ms" % (flow.delayMean*1e3,))
220  if flow.packetLossRatio is None:
221  print("\tPacket Loss Ratio: None")
222  else:
223  print("\tPacket Loss Ratio: %.2f %%" % (flow.packetLossRatio*100))
224 
225 
226 if __name__ == '__main__':
227  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.