SENSSOFT-69 #implemented basic sampling method to consolidate high frequency logs.
Project: http://git-wip-us.apache.org/repos/asf/incubator-senssoft-userale-pyqt5/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-senssoft-userale-pyqt5/commit/ac477eef Tree: http://git-wip-us.apache.org/repos/asf/incubator-senssoft-userale-pyqt5/tree/ac477eef Diff: http://git-wip-us.apache.org/repos/asf/incubator-senssoft-userale-pyqt5/diff/ac477eef Branch: refs/heads/master Commit: ac477eef6abc626f43bf3ac2960ab37027c95117 Parents: d4c210c Author: mooshu1x2 <mbe...@draper.com> Authored: Fri Sep 16 16:37:25 2016 -0400 Committer: mooshu1x2 <mbe...@draper.com> Committed: Fri Sep 16 16:37:25 2016 -0400 ---------------------------------------------------------------------- userale/ale.py | 52 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-senssoft-userale-pyqt5/blob/ac477eef/userale/ale.py ---------------------------------------------------------------------- diff --git a/userale/ale.py b/userale/ale.py index e3b4c08..6aac603 100644 --- a/userale/ale.py +++ b/userale/ale.py @@ -16,6 +16,7 @@ from userale.version import __version__ from userale.format import JsonFormatter from PyQt5.QtCore import QObject, QEvent, QTimer +from collections import Counter import datetime, time import logging import uuid @@ -33,7 +34,7 @@ class Ale (QObject): toolversion=None, keylog=False, interval=5000, - resolution=1000, + resolution=100, shutoff=[]): """ :param output: [str] The file or url path to which logs will be sent @@ -111,23 +112,17 @@ class Ale (QObject): # Sample rate self.hfreq = [QEvent.MouseMove, QEvent.DragMove, QEvent.Scroll] - self.watcher = False # Sample Timer - # self.timer = QTimer () - # self.timer.timeout.connect (self.sample) - # self.timer.start(self.resolution) + self.timer = QTimer () + self.timer.timeout.connect (self.aggregate) + self.timer.start (self.resolution) # Cleanup Timer - # self.timer2 = QTimer () # self.timer2.timeout.connect (self.sample2) # self.timer2.start (0) - # connect (self, SIGNAL(aboutToQuit ()), self, SLOT(self.sample2())); - - # connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit())); - # Batch transmission of logs self.intervalID = self.startTimer (self.interval) @@ -161,23 +156,50 @@ class Ale (QObject): # Either an event actually ocurred on window or is an effect of event propagation. pass + # Filter data to higher or lower priority list if data is not None: - self.logs.append (data) + if t in self.hfreq and t in self.map: # data is in watched list and is a high frequency log + temp = (name, event, object) + self.hlogs.append (temp) + else: + self.logs.append (data) - return super(Ale, self).eventFilter (object, event) + return super (Ale, self).eventFilter (object, event) def timerEvent (self, event): ''' :param object: [list] List of events :return: [void] Emit events to file + + Routinely dump data to file or send over the network ''' - self.logger.info (_(self.logs)) - self.logs = [] # Reset logs + if len(self.logs) > 0: + #print ("dumping {} logs".format (len (self.logs))) + self.logger.info (_(self.logs)) + self.logs = [] # Reset logs + def aggregate (self): + ''' + Sample high frequency logs at self.resolution. High frequency logs are consolidated down to a single log event + to be emitted later + ''' + if len (self.hlogs) > 0: + #print ("agging {} logs".format (len (self.hlogs))) + agg_events = Counter (self.hlogs) + # Iterate over collapsed collection to generate a single log per event + # Location information is lost due to consolidation. + # @todo develop hashing funciton or new counter to generate avg x and avg y location + for event, counter in agg_events.items (): + aggdata = self.__create_msg (event[0], event[1], event[2], details={"count" : counter}) + self.logs.append (aggdata) + self.hlogs = [] + def getSender (self, object): ''' :param object: [QObject] The object being watched. :return: [QObject] The QObject + + Fetch the QObject who triggered the event ''' sender = None @@ -322,7 +344,7 @@ class Ale (QObject): """ data = { - "target": self.getSelector (object) , + "target": self.getSelector (object), "path": self.getPath (object), "clientTime": self.getClientTime (), "location": self.getLocation (event),