From ca6d90969df604bfaf59d39cf084b5252e54fb09 Mon Sep 17 00:00:00 2001 From: sfaulds Date: Wed, 2 Nov 2016 09:26:23 +1100 Subject: [PATCH] metric loggin throttling --- addon.xml | 2 +- changelog.txt | 6 ++++++ resources/lib/ga_client.py | 16 +++++++++++++++- resources/lib/objects/_common.py | 2 +- resources/lib/utils.py | 15 --------------- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/addon.xml b/addon.xml index e8ffd37a..71fcf025 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ diff --git a/changelog.txt b/changelog.txt index 28c2be74..c6b947e5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +version 2.3.4 +- add throttling for error event logging + +version 2.3.3 +- minor fix to exception handling + version 2.3.1 - minor fixes diff --git a/resources/lib/ga_client.py b/resources/lib/ga_client.py index d4b476d6..8a886fc9 100644 --- a/resources/lib/ga_client.py +++ b/resources/lib/ga_client.py @@ -8,6 +8,7 @@ import md5 import xbmc import platform import xbmcgui +import time from utils import window, settings, language as lang log = logging.getLogger("EMBY."+__name__) @@ -15,6 +16,8 @@ log = logging.getLogger("EMBY."+__name__) # for info on the metrics that can be sent to Google Analytics # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events +logEventHistory = {} + class GoogleAnalytics(): testing = False @@ -128,7 +131,18 @@ class GoogleAnalytics(): self.sendData(data) - def sendEventData(self, eventCategory, eventAction, eventLabel=None): + def sendEventData(self, eventCategory, eventAction, eventLabel=None, throttle=False): + + # if throttling is enabled then only log the same event every 5 min + if(throttle): + throttleKey = eventCategory + "-" + eventAction + "-" + str(eventLabel) + lastLogged = logEventHistory.get(throttleKey) + if(lastLogged != None): + timeSinceLastLog = time.time() - lastLogged + if(timeSinceLastLog < 300): + log.info("SKIPPING_LOG_EVENT : " + str(timeSinceLastLog) + " " + throttleKey) + return + logEventHistory[throttleKey] = time.time() data = self.getBaseData() data['t'] = 'event' # action type diff --git a/resources/lib/objects/_common.py b/resources/lib/objects/_common.py index f683343e..484b602d 100644 --- a/resources/lib/objects/_common.py +++ b/resources/lib/objects/_common.py @@ -30,7 +30,7 @@ def catch_except(errors=(Exception, ), default_value=False): return func(*args, **kwargs) except errors as error: errStrings = ga.formatException() - ga.sendEventData("Exception", errStrings[0], errStrings[1]) + ga.sendEventData("Exception", errStrings[0], errStrings[1], True) log.exception(error) log.error("function: %s \n args: %s \n kwargs: %s", func.__name__, args, kwargs) diff --git a/resources/lib/utils.py b/resources/lib/utils.py index d1ac9859..420c4a7f 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -307,21 +307,6 @@ def indent(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i -def catch_except(errors=(Exception, ), default_value=False): - # Will wrap method with try/except and print parameters for easier debugging - def decorator(func): - def wrapper(*args, **kwargs): - try: - return func(*args, **kwargs) - except errors as error: - log.exception(error) - log.error("function: %s \n args: %s \n kwargs: %s", - func.__name__, args, kwargs) - return default_value - - return wrapper - return decorator - def profiling(sortby="cumulative"): # Will print results to Kodi log def decorator(func):