infoGatheringSvc.py (5279B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\client\script\sys\infoGatheringSvc.py 2 import copy 3 import sys 4 from functools import partial 5 import blue 6 import log 7 import uthread 8 from carbon.common.lib.const import INFOSERVICE_OFFLINE, INFOTYPE_OFFLINE 9 from carbon.common.script.sys.service import Service 10 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING 11 from carbon.common.script.util import igsUtil 12 13 class InformationGatheringSvc(Service): 14 __guid__ = 'svc.infoGatheringSvc' 15 serviceName = 'svc.infoGatheringSvc' 16 __exportedcalls__ = {'LogInfoEvent': [], 17 'GetEventIGSHandle': []} 18 __dependencies__ = ['machoNet'] 19 20 def __init__(self): 21 Service.__init__(self) 22 self.isEnabled = None 23 self.serverEvents = set() 24 self.serverOncePerRunEvents = set() 25 self.infoTypeParameters = set() 26 self.logTypeAggregates = {} 27 self.isEnabled = 0 28 self.loggedEvents = {} 29 self.loggedEventsEmpty = {} 30 self.aggregateDict = {} 31 self.clientWorkerInterval = 0 32 33 def Run(self, memStream = None): 34 stateAndConfig = sm.RemoteSvc('infoGatheringMgr').GetStateAndConfig() 35 self.isEnabled = stateAndConfig.isEnabled 36 self.serverEvents = stateAndConfig.infoTypes 37 self.clientWorkerInterval = stateAndConfig.clientWorkerInterval 38 self.serverOncePerRunEvents = stateAndConfig.infoTypesOncePerRun 39 self.logTypeAggregates = stateAndConfig.infoTypeAggregates 40 self.infoTypeParameters = stateAndConfig.infoTypeParameters 41 self.loggedEvents = {} 42 if self.isEnabled and self.clientWorkerInterval > 0: 43 self.SendInfoWorkerThread = uthread.new(self.SendInfoWorker) 44 self.state = SERVICE_RUNNING 45 46 def GetEventIGSHandle(self, eventTypeID, **keywords): 47 return partial(self.LogInfoEvent, eventTypeID=eventTypeID, **keywords) 48 49 def LogInfoEvent(self, eventTypeID, itemID = None, itemID2 = None, int_1 = None, int_2 = None, int_3 = None, char_1 = None, char_2 = None, char_3 = None, float_1 = None, float_2 = None, float_3 = None): 50 try: 51 if eventTypeID in self.serverEvents: 52 if eventTypeID in self.serverOncePerRunEvents: 53 self.serverOncePerRunEvents.remove(eventTypeID) 54 self.serverEvents.remove(eventTypeID) 55 if eventTypeID not in self.loggedEvents: 56 if eventTypeID in self.logTypeAggregates: 57 self.aggregateDict[eventTypeID] = {} 58 self.loggedEvents[eventTypeID] = [] 59 if eventTypeID in self.logTypeAggregates: 60 if itemID2 is not None: 61 itemID2 = long(itemID2) 62 ln = [blue.os.GetWallclockTime(), 63 long(itemID), 64 itemID2, 65 int_1, 66 int_2, 67 int_3, 68 char_1, 69 char_2, 70 char_3, 71 float_1, 72 float_2, 73 float_3] 74 valueIx = self.infoTypeParameters[eventTypeID].difference(self.logTypeAggregates[eventTypeID]) 75 igsUtil.AggregateEvent(eventTypeID, ln, self.loggedEvents, self.aggregateDict[eventTypeID], self.logTypeAggregates[eventTypeID], valueIx) 76 else: 77 self.loggedEvents[eventTypeID].append([blue.os.GetWallclockTime(), 78 itemID, 79 itemID2, 80 int_1, 81 int_2, 82 int_3, 83 char_1, 84 char_2, 85 char_3, 86 float_1, 87 float_2, 88 float_3]) 89 except Exception: 90 log.LogException('Error logging IGS information') 91 sys.exc_clear() 92 93 def SendInfoWorker(self): 94 while self.isEnabled: 95 try: 96 self.SendInfo() 97 except Exception: 98 log.LogException('Error while shipping data to server...') 99 sys.exc_clear() 100 101 blue.pyos.synchro.SleepWallclock(self.clientWorkerInterval) 102 103 def SendInfo(self): 104 eventsToSend = copy.deepcopy(self.loggedEvents) 105 self.loggedEvents = {} 106 if len(eventsToSend): 107 self.LogInfo('Information Gatherer is shipping collected data over the wire... Interval = %d milliseconds.' % self.clientWorkerInterval) 108 ret = sm.RemoteSvc('infoGatheringMgr').LogInfoEventsFromClient(eventsToSend) 109 for eventTypeID, status in ret.iteritems(): 110 if status == INFOSERVICE_OFFLINE: 111 self.isEnabled = 0 112 break 113 elif status == INFOTYPE_OFFLINE: 114 self.serverEvents.remove(eventTypeID) 115 self.infoTypeParameters.remove(eventTypeID) 116 if eventTypeID in self.serverOncePerRunEvents: 117 self.serverOncePerRunEvents.remove(eventTypeID) 118 if eventTypeID in self.logTypeAggregates: 119 self.logTypeAggregates.remove(eventTypeID)