From 6b5b955d430908f4640826204e10aae545cf7fd6 Mon Sep 17 00:00:00 2001
From: shaun <shaun@bluebit.com.au>
Date: Sat, 12 Nov 2016 11:45:24 +1100
Subject: [PATCH] add full trace for file and line numbers

---
 resources/lib/ga_client.py | 57 +++++++++++++++++++++++++++++---------
 1 file changed, 44 insertions(+), 13 deletions(-)

diff --git a/resources/lib/ga_client.py b/resources/lib/ga_client.py
index 631b1d9f..6a0665b8 100644
--- a/resources/lib/ga_client.py
+++ b/resources/lib/ga_client.py
@@ -36,7 +36,7 @@ def log_error(errors=(Exception, )):
 # main GA class
 class GoogleAnalytics():
 
-    testing = False
+    testing = True
     
     def __init__(self):
     
@@ -85,33 +85,64 @@ class GoogleAnalytics():
             return "Other"
         
     def formatException(self):
+
+        stack = traceback.extract_stack()
         exc_type, exc_obj, exc_tb = sys.exc_info()
-		
+        tb = traceback.extract_tb(exc_tb)
+        full_tb = stack[:-1] + tb
+        #log.error(str(full_tb))
+
+		# get last stack frame
         latestStackFrame = None
-        allStackFrames = traceback.extract_tb(exc_tb)
-        if(len(allStackFrames) > 0):
-            latestStackFrame = allStackFrames[-1]
-        #log.error(str(latestStackFrame))
-		
+        if(len(tb) > 0):
+            latestStackFrame = tb[-1]
+        #log.error(str(tb))
+
+        fileStackTrace = ""
+        try:
+            # get files from stack
+            stackFileList = []
+            for frame in full_tb:
+                #log.error(str(frame))
+                frameFile = (os.path.split(frame[0])[1])[:-3]
+                frameLine = frame[1]
+                if(len(stackFileList) == 0 or stackFileList[-1][0] != frameFile):
+                    stackFileList.append([frameFile, [str(frameLine)]])
+                else:
+                    file = stackFileList[-1][0]
+                    lines = stackFileList[-1][1]
+                    lines.append(str(frameLine))
+                    stackFileList[-1] = [file, lines]
+            #log.error(str(stackFileList))
+
+            for item in stackFileList:
+                lines = ",".join(item[1])
+                fileStackTrace += item[0] + "," + lines + ":"
+            #log.error(str(fileStackTrace))
+        except Exception as e:
+            fileStackTrace = None
+            log.error(e)
+
         errorType = "NA"
         errorFile = "NA"
-		
-        if(latestStackFrame != None):
-            fileName = os.path.split(latestStackFrame[0])[1]
+
+        if latestStackFrame is not None:
+            if fileStackTrace is None:
+                fileStackTrace = os.path.split(latestStackFrame[0])[1] + ":" + str(latestStackFrame[1])
             
             codeLine = "NA"
             if(len(latestStackFrame) > 3 and latestStackFrame[3] != None):
                 codeLine = latestStackFrame[3].strip()
 
-            errorFile = "%s:%s(%s)(%s)" % (fileName, latestStackFrame[1], exc_obj.message, codeLine)
+            errorFile = "%s(%s)(%s)" % (fileStackTrace, exc_obj.message, codeLine)
             errorFile = errorFile[0:499]
             errorType = "%s" % (exc_type.__name__)
             #log.error(errorType + " - " + errorFile)
-			
+
         del(exc_type, exc_obj, exc_tb)
         
         return errorType, errorFile
-	
+
     def getBaseData(self):
     
         # all the data we can send to Google Analytics