A Discrete-Event Network Simulator
API
flowmon-parse-results.py
Go to the documentation of this file.
1from __future__ import division
2import sys
3import os
4try:
5 from xml.etree import cElementTree as ElementTree
6except ImportError:
7 from xml.etree import ElementTree
8
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.sourceAddress = el.get('sourceAddress')
38 self.destinationAddress = el.get('destinationAddress')
39 self.sourcePort = int(el.get('sourcePort'))
40 self.destinationPort = int(el.get('destinationPort'))
41 self.protocol = 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.bins = []
57 if el is not None:
58 #self.nbins = int(el.get('nBins'))
59 for bin in el.findall('bin'):
60 self.bins.append( (float(bin.get("start")), float(bin.get("width")), int(bin.get("count"))) )
61
62
63class 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.flowId = 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_duration = rx_duration
103 if rxPackets:
104 self.hopCount = float(flow_el.get('timesForwarded')) / rxPackets + 1
105 else:
106 self.hopCount = -1000
107 if rxPackets:
108 self.delayMean = float(flow_el.get('delaySum')[:-2]) / rxPackets * 1e-9
109 self.packetSizeMean = float(flow_el.get('rxBytes')) / rxPackets
110 else:
111 self.delayMean = None
112 self.packetSizeMean = None
113 if rx_duration > 0:
114 self.rxBitrate = float(flow_el.get('rxBytes'))*8 / rx_duration
115 else:
116 self.rxBitrate = None
117 if tx_duration > 0:
118 self.txBitrate = float(flow_el.get('txBytes'))*8 / tx_duration
119 else:
120 self.txBitrate = 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.packetLossRatio = None
125 else:
126 self.packetLossRatio = (lost / (rxPackets + lost))
127
128 interrupt_hist_elem = flow_el.find("flowInterruptionsHistogram")
129 if interrupt_hist_elem is None:
131 else:
132 self.flowInterruptionsHistogram = 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.flows = []
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.flows.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
181def 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
226if __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.