From c366209a32b65531b813e9d8e406b69c6e2b35cb Mon Sep 17 00:00:00 2001 From: smbaker Date: Mon, 7 Nov 2011 19:00:58 -0800 Subject: [PATCH] add exception info to statistics section --- sfa/managers/slice_manager.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/sfa/managers/slice_manager.py b/sfa/managers/slice_manager.py index 29113138..cba72951 100644 --- a/sfa/managers/slice_manager.py +++ b/sfa/managers/slice_manager.py @@ -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"]) -- 2.43.0