Module brevettiai.interfaces.raygun
Expand source code
import os
import sys
import logging
import json
from brevettiai.platform import Job
log = logging.getLogger(__name__)
def setup_raygun(api_key=None, force=True):
try:
from raygun4py import raygunprovider
except ModuleNotFoundError:
return
api_key = api_key or os.environ.get("RAYGUN_API_KEY")
if (force or not sys.gettrace()) and api_key is not None:
log.info("Setting up raygun to catch errors! '%s'")
def handle_exception(exc_type, exc_value, exc_traceback):
log.debug("Sending exception info to raygun")
raygun_config = dict(
filtered_keys=['AWS_SECRET_ACCESS_KEY'],
transmit_global_variables=False,
transmit_local_variables=False,
userversion=os.environ.get("BUILD_ID"),
)
client = raygunprovider.RaygunSender(api_key,
config=raygun_config)
client.send_exception(exc_info=(exc_type, exc_value, exc_traceback),
userCustomData={"configs": object_extractor(Job,
exc_traceback,
prep_criterion_config)})
sys.excepthook = handle_exception
def prep_criterion_config(config):
return json.loads(str(config))
def object_extractor(types, exc_tb=None, prep_func=None):
import inspect
types = types if isinstance(types, tuple) else (types, )
objects = {}
frames = inspect.stack() if exc_tb is None else inspect.getinnerframes(exc_tb)
for frameinfo in frames:
frame = frameinfo.frame
f_locals = frame.f_locals
keys = list(f_locals.keys())
for k in keys:
v = f_locals.get(k, None)
code = frame.f_code
if isinstance(v, types):
entry = objects.setdefault(id(v),
{"location": [],
"obj": v if prep_func is None else prep_func(v)})
entry["location"].insert(0, f"{k} in {code.co_name}, {code.co_filename}:{frame.f_lineno}")
return objects
Functions
def object_extractor(types, exc_tb=None, prep_func=None)
-
Expand source code
def object_extractor(types, exc_tb=None, prep_func=None): import inspect types = types if isinstance(types, tuple) else (types, ) objects = {} frames = inspect.stack() if exc_tb is None else inspect.getinnerframes(exc_tb) for frameinfo in frames: frame = frameinfo.frame f_locals = frame.f_locals keys = list(f_locals.keys()) for k in keys: v = f_locals.get(k, None) code = frame.f_code if isinstance(v, types): entry = objects.setdefault(id(v), {"location": [], "obj": v if prep_func is None else prep_func(v)}) entry["location"].insert(0, f"{k} in {code.co_name}, {code.co_filename}:{frame.f_lineno}") return objects
def prep_criterion_config(config)
-
Expand source code
def prep_criterion_config(config): return json.loads(str(config))
def setup_raygun(api_key=None, force=True)
-
Expand source code
def setup_raygun(api_key=None, force=True): try: from raygun4py import raygunprovider except ModuleNotFoundError: return api_key = api_key or os.environ.get("RAYGUN_API_KEY") if (force or not sys.gettrace()) and api_key is not None: log.info("Setting up raygun to catch errors! '%s'") def handle_exception(exc_type, exc_value, exc_traceback): log.debug("Sending exception info to raygun") raygun_config = dict( filtered_keys=['AWS_SECRET_ACCESS_KEY'], transmit_global_variables=False, transmit_local_variables=False, userversion=os.environ.get("BUILD_ID"), ) client = raygunprovider.RaygunSender(api_key, config=raygun_config) client.send_exception(exc_info=(exc_type, exc_value, exc_traceback), userCustomData={"configs": object_extractor(Job, exc_traceback, prep_criterion_config)}) sys.excepthook = handle_exception