NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)