add exception info to statistics section
authorsmbaker <smbaker@fc8clean.lan>
Tue, 8 Nov 2011 03:00:58 +0000 (19:00 -0800)
committersmbaker <smbaker@fc8clean.lan>
Tue, 8 Nov 2011 03:00:58 +0000 (19:00 -0800)
sfa/managers/slice_manager.py

index 2911313..cba7295 100644 (file)
@@ -1,4 +1,5 @@
 import sys
+import traceback
 import time
 from StringIO import StringIO
 from copy import copy
@@ -82,7 +83,7 @@ def drop_slicemgr_stats(rspec):
     except Exception, e:
         logger.warn("drop_slicemgr_stats failed: %s " % (str(e)))
 
-def add_slicemgr_stat(rspec, callname, aggname, elapsed, status):
+def add_slicemgr_stat(rspec, callname, aggname, elapsed, status, exc_info=None):
     try:
         stats_tags = rspec.xml.xpath('//statistics[@call="%s"]' % callname)
         if stats_tags:
@@ -90,7 +91,19 @@ def add_slicemgr_stat(rspec, callname, aggname, elapsed, status):
         else:
             stats_tag = etree.SubElement(rspec.xml.root, "statistics", call=callname)
 
-        etree.SubElement(stats_tag, "aggregate", name=str(aggname), elapsed=str(elapsed), status=str(status))
+        stat_tag = etree.SubElement(stats_tag, "aggregate", name=str(aggname), elapsed=str(elapsed), status=str(status))
+
+        if exc_info:
+            exc_tag = etree.SubElement(stat_tag, "exc_info", name=str(exc_info[1]))
+
+            # this would encode it as a text block
+            #exc_tag.text = "\n".join(traceback.format_exception(exc_info[0], exc_info[1], exc_info[2]))
+
+            # this encodes the traceback as a set of xml tags
+            tb = traceback.extract_tb(exc_info[2])
+            for item in tb:
+                exc_frame = etree.SubElement(exc_tag, "tb_frame", filename=str(item[0]), line=str(item[1]), func=str(item[2]), code=str(item[3]))
+
     except Exception, e:
         logger.warn("add_slicemgr_stat failed on  %s: %s" %(aggname, str(e)))
 
@@ -112,7 +125,7 @@ def ListResources(api, creds, options, call_id):
             return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"}
         except Exception, e:
             api.logger.log_exc("ListResources failed at %s" %(server.url))
-            return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception"}
+            return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception", "exc_info": sys.exc_info()}
 
     if Callids().already_handled(call_id): return ""
 
@@ -157,11 +170,11 @@ def ListResources(api, creds, options, call_id):
     rspec_version = version_manager.get_version(options.get('rspec_version'))
     if xrn:    
         result_version = version_manager._get_version(rspec_version.type, rspec_version.version, 'manifest')
-    else: 
+    else:
         result_version = version_manager._get_version(rspec_version.type, rspec_version.version, 'ad')
     rspec = RSpec(version=result_version)
     for result in results:
-        add_slicemgr_stat(rspec, "ListResources", result["aggregate"], result["elapsed"], result["status"])
+        add_slicemgr_stat(rspec, "ListResources", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None))
         if result["status"]=="success":
             try:
                 rspec.version.merge(result["rspec"])
@@ -200,7 +213,7 @@ def CreateSliver(api, xrn, creds, rspec_str, users, call_id):
             return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"}
         except: 
             logger.log_exc('Something wrong in _CreateSliver with URL %s'%server.url)
-            return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception"}
+            return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception", "exc_info": sys.exc_info()}
 
     if Callids().already_handled(call_id): return ""
     # Validate the RSpec against PlanetLab's schema --disabled for now
@@ -239,7 +252,7 @@ def CreateSliver(api, xrn, creds, rspec_str, users, call_id):
     manifest_version = version_manager._get_version(rspec.version.type, rspec.version.version, 'manifest')
     result_rspec = RSpec(version=manifest_version)
     for result in results:
-        add_slicemgr_stat(result_rspec, "CreateSliver", result["aggregate"], result["elapsed"], result["status"])
+        add_slicemgr_stat(result_rspec, "CreateSliver", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None))
         if result["status"]=="success":
             try:
                 result_rspec.version.merge(result["rspec"])