networkdatamonitor.py (7544B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\devtools\script\networkdatamonitor.py 2 import operator 3 import carbonui.const as uiconst 4 from carbon.common.script.util.format import FmtDate, HoursMinsSecsFromSecs, SecsFromBlueTimeDelta 5 from carbonui.control.scrollContainer import ScrollContainer 6 from carbonui.primitives.container import Container 7 from carbonui.control.button import Button 8 from carbonui.primitives.containerAutoSize import ContainerAutoSize 9 from eve.client.script.ui.control.eveLabel import Label 10 from carbonui.control.window import Window 11 from eve.common.lib import appConst as const 12 import log 13 import uthread2 14 from functools import reduce 15 PROPS = [('Packets out', 'packets_out', 0), 16 ('Packets in', 'packets_in', 0), 17 ('Kilobytes out', 'bytes_out', 1), 18 ('Kilobytes in', 'bytes_in', 1)] 19 20 class NetworkDataMonitor(Window): 21 default_caption = 'Network Data Monitor' 22 default_windowID = 'networkdatamonitor' 23 default_minSize = (490, 390) 24 default_height = 640 25 refreshDelaySeconds = 1.0 26 27 def ApplyAttributes(self, attributes): 28 self._ready = False 29 Window.ApplyAttributes(self, attributes) 30 self.Reset() 31 self.settingsContainer = Container(name='settingsContainer', parent=self.sr.main, align=uiconst.TOBOTTOM, top=8, height=16, padding=8) 32 Button(parent=self.settingsContainer, label='Reset', align=uiconst.CENTER, func=self.Reset) 33 dataContainer = ScrollContainer(name='dataContainer', parent=self.sr.main, align=uiconst.TOALL, padding=8) 34 statusHeader = ' ' 35 for tme in self.intvals: 36 statusHeader += '<t><right>%s' % FmtDate(long(tme * 10000), 'ss') 37 38 statusHeader += '<t><right>total' 39 self.statusLabels = [] 40 Label(parent=dataContainer, align=uiconst.TOTOP, text=statusHeader, tabs=[110, 41 150, 42 200, 43 250, 44 300, 45 350, 46 400], state=uiconst.UI_DISABLED, left=2) 47 for i in xrange(11): 48 labelCont = Container(parent=dataContainer, align=uiconst.TOTOP, height=20) 49 statusLabel = Label(parent=labelCont, text='', align=uiconst.CENTERLEFT, tabs=[110, 50 150, 51 200, 52 250, 53 300, 54 350, 55 400], state=uiconst.UI_DISABLED, left=2) 56 self.statusLabels.append(statusLabel) 57 58 self.grpc_event_publisher_details = [] 59 event_publisher_details_container = ContainerAutoSize(parent=dataContainer, align=uiconst.TOTOP) 60 event_publisher_details = Label(parent=event_publisher_details_container, text='') 61 self.grpc_event_publisher_details.append(event_publisher_details) 62 self.grpc_request_broker_details = [] 63 request_broker_details_container = ContainerAutoSize(parent=dataContainer, align=uiconst.TOTOP, padTop=16) 64 request_broker_details = Label(parent=request_broker_details_container, text='') 65 self.grpc_request_broker_details.append(request_broker_details) 66 self.PopulateLabels(initialize=True) 67 uthread2.StartTasklet(self.Refresh) 68 69 def Reset(self, *args): 70 self.intvals = [5000, 71 10000, 72 15000, 73 30000, 74 60000] 75 self.counter = [[], 76 [], 77 [], 78 [], 79 [], 80 []] 81 self.ticker = 0 82 self.packets_outTotal = 0 83 self.packets_inTotal = 0 84 self.bytes_outTotal = 0 85 self.bytes_inTotal = 0 86 self.laststats = {} 87 self.lastresetstats = sm.GetService('machoNet').GetConnectionProperties() 88 89 def Refresh(self): 90 while not self.destroyed: 91 uthread2.Sleep(self.refreshDelaySeconds) 92 self.PopulateLabels() 93 94 def PopulateLabels(self, initialize = False): 95 self.ticker += self.intvals[0] 96 if self.ticker > self.intvals[-1]: 97 self.ticker = self.intvals[0] 98 stats = sm.GetService('machoNet').GetConnectionProperties() 99 if self.laststats == {}: 100 self.laststats = stats 101 if self.lastresetstats != {}: 102 for key in stats.iterkeys(): 103 stats[key] = stats[key] - self.lastresetstats[key] 104 105 for i in xrange(len(self.counter) - 1): 106 self.counter[i].append([ stats[key] - self.laststats[key] for header, key, K in PROPS ]) 107 self.counter[i] = self.counter[i][-(self.intvals[i] / 1000):] 108 109 self.counter[-1].append([ stats[key] - self.laststats[key] for header, key, K in PROPS ]) 110 if not self.display and not initialize: 111 self.laststats = stats 112 return 113 valueIdx = 0 114 for header, key, K in PROPS: 115 statusstr = '%s' % header 116 for intvals in self.counter: 117 value = reduce(operator.add, [ intval[valueIdx] for intval in intvals ], 0) 118 if not value: 119 statusstr += '<t><right>-' 120 else: 121 statusstr += '<t><right>%s' % [value, '%.1f' % (value / 1024.0)][K] 122 123 self.statusLabels[valueIdx].text = statusstr 124 valueIdx += 1 125 126 self.statusLabels[valueIdx].text = 'Outstanding<t><right>%s' % stats['calls_outstanding'] 127 valueIdx += 1 128 self.statusLabels[valueIdx].text = 'Blocking Calls<t><right>%s' % stats['blocking_calls'] 129 valueIdx += 1 130 block_time = stats['blocking_call_times'] 131 if block_time >= 0: 132 secs = SecsFromBlueTimeDelta(block_time) 133 self.statusLabels[valueIdx].text = 'Blocking time<t><right>%sH<t><right>%sM<t><right>%sS' % HoursMinsSecsFromSecs(secs) 134 valueIdx += 1 135 elif not hasattr(self, 'warnedBlockingTimeNegative'): 136 self.warnedBlockingTimeNegative = True 137 log.LogTraceback('Blocking time is negative?') 138 machonet_ping = self.get_machonet_ping_time() 139 self.statusLabels[valueIdx].text = 'Machonet Ping<t><right>%s' % machonet_ping 140 valueIdx += 1 141 grpc_stats = self.get_grpc_stats() 142 self.statusLabels[valueIdx].text = 'Event Publ. Ping<t><right>%s' % grpc_stats['event_publisher_ping'] 143 valueIdx += 1 144 self.statusLabels[valueIdx].text = 'Req. Broker Ping<t><right>%s' % grpc_stats['request_broker_ping'] 145 valueIdx += 1 146 self.grpc_event_publisher_details[0].text = 'Event Publisher: %s' % grpc_stats['event_publisher_details'] 147 self.grpc_request_broker_details[0].text = 'Request Broker: %s' % grpc_stats['request_broker_details'] 148 self.laststats = stats 149 150 def get_machonet_ping_time(self): 151 if sm.services['machoNet'] is not None and sm.services['machoNet'].IsConnected(): 152 stat = sm.services['machoNet'].Ping(1, silent=True) 153 startTime = stat[0][1] 154 endTime = stat[-1][1] 155 took = endTime - startTime 156 return took / const.MSEC 157 else: 158 return -1 159 160 def get_grpc_stats(self): 161 publicGateway = sm.services['publicGatewaySvc'] 162 if publicGateway is None: 163 return 164 result = {'event_publisher_ping': publicGateway.get_event_publisher_rtt(), 165 'event_publisher_details': self.format_details(publicGateway.get_event_publisher_details()), 166 'request_broker_ping': publicGateway.get_request_broker_rtt(), 167 'request_broker_details': self.format_details(publicGateway.get_request_broker_details())} 168 return result 169 170 def format_details(self, details): 171 import pprint 172 return pprint.pformat(details, width=1)