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