Пример #1
0
    def pre_request(worker, req):
        """
        Runs before process of response.
        """
        if 'SyncWorker' not in type(worker).__name__:
            return

        trace = epsagon.trace.trace_factory.get_or_create_trace()
        trace.prepare()

        if ignore_request('', req.path.lower()):
            return

        # Create a Gunicorn runner with current request.
        try:
            runner = GunicornRunner(time.time(), req)
            trace.set_runner(runner)

            # Collect metadata in case this is a container.
            collect_container_metadata(runner.resource['metadata'])
        # pylint: disable=W0703
        except Exception as exception:
            # Regress to python runner.
            warnings.warn('Could not extract request', EpsagonWarning)
            epsagon.trace.trace_factory.add_exception(exception,
                                                      traceback.format_exc())
Пример #2
0
    def before_request(cls, wrapped, instance, args, kwargs):
        """
        Runs when new request comes in.
        :param wrapped: wrapt's wrapped
        :param instance: wrapt's instance
        :param args: wrapt's args
        :param kwargs: wrapt's kwargs
        """
        print_debug('before_request Tornado request')
        try:
            ignored = ignore_request('', instance.request.path)
            if not ignored and not is_ignored_endpoint(instance.request.path):
                unique_id = str(uuid.uuid4())
                trace = epsagon.trace.trace_factory.get_or_create_trace(
                    unique_id=unique_id)

                trace.prepare()

                setattr(instance, TORNADO_TRACE_ID, unique_id)

                cls.RUNNERS[unique_id] = (TornadoRunner(
                    time.time(), instance.request))

                trace.set_runner(cls.RUNNERS[unique_id])
                print_debug('Created Tornado Runner')

                # Collect metadata in case this is a container.
                collect_container_metadata(
                    cls.RUNNERS[unique_id].resource['metadata'])
        except Exception as instrumentation_exception:  # pylint: disable=W0703
            epsagon.trace.trace_factory.add_exception(
                instrumentation_exception, traceback.format_exc())
        return wrapped(*args, **kwargs)
Пример #3
0
        async def custom_route_handler(request: Request) -> Response:
            """
            Traces given request and its response.
            :param request: to trace
            """
            should_ignore_request = True
            try:
                epsagon.trace.trace_factory.switch_to_async_tracer()
                if not ignore_request('', request.url.path.lower()):
                    should_ignore_request = False
                    trace = epsagon.trace.trace_factory.get_or_create_trace()
                    trace.prepare()

            except Exception as exception: # pylint: disable=W0703
                return await original_route_handler(request)

            if should_ignore_request:
                return await original_route_handler(request)

            runner = None
            response = None
            try:
                body = await request.json()
            except json.decoder.JSONDecodeError:
                body = ''
            try:
                runner = FastapiRunner(time.time(), request, json.dumps(body))
                trace.set_runner(runner)
                collect_container_metadata(runner.resource['metadata'])
            except Exception as exception: # pylint: disable=W0703
                warnings.warn('Could not extract request', EpsagonWarning)
            raised_err = None
            try:
                response: Response = await original_route_handler(request)
            except Exception as exception:  # pylint: disable=W0703
                raised_err = exception
                traceback_data = get_traceback_data_from_exception(exception)
                trace.runner.set_exception(exception, traceback_data)

            try:
                if not raised_err and response is not None and runner:
                    if ignore_request(
                            response.headers.get('Content-Type', '').lower(),
                            ''
                    ):
                        return response

                    runner.update_response(response)

                if runner:
                    epsagon.trace.trace_factory.send_traces()
            except Exception as exception:  # pylint: disable=W0703
                print_debug('Failed to send traces: {}'.format(exception))

            if raised_err:
                raise raised_err

            return response
Пример #4
0
async def AiohttpMiddleware(request, handler):
    """
    aiohttp middleware to create a runner with event details
    :param request: incoming request data
    :param handler: original handler
    :return: response data from the handler
    """
    print_debug('[aiohttp] started middleware')
    epsagon.trace.trace_factory.switch_to_async_tracer()

    if (ignore_request('', request.path.lower())
            or is_ignored_endpoint(request.path.lower())):
        print_debug('[aiohttp] ignoring request')
        return await handler(request)

    trace = epsagon.trace.trace_factory.get_or_create_trace()
    trace.prepare()
    runner = None
    response = None

    try:
        body = await request.text()
        print_debug('[aiohttp] got body')
        runner = AiohttpRunner(time.time(), request, body, handler)
        trace.set_runner(runner)
        collect_container_metadata(runner.resource['metadata'])
        print_debug('[aiohttp] initialized runner')
    except Exception as exception:  # pylint: disable=W0703
        warnings.warn('Could not extract request', EpsagonWarning)

    raised_err = None
    try:
        response = await handler(request)
        print_debug('[aiohttp] got response')
    except HTTPNotFound:
        # Ignoring 404s
        epsagon.trace.trace_factory.pop_trace(trace)
        raise
    except Exception as exception:  # pylint: disable=W0703
        raised_err = exception
        traceback_data = get_traceback_data_from_exception(exception)
        trace.runner.set_exception(exception, traceback_data)

    if response is not None and runner:
        if ignore_request(response.content_type.lower(), ''):
            return response

        runner.update_response(response)

    if runner:
        print_debug('[aiohttp] sending trace')
        epsagon.trace.trace_factory.send_traces()
    if raised_err:
        print_debug('[aiohttp] raising error')
        raise raised_err
    print_debug('[aiohttp] middleware done')
    return response
Пример #5
0
    def before_request(self):
        """
        Runs before process of response.
        """
        trace = epsagon.trace.trace_factory.get_trace()
        if not trace:
            trace = epsagon.trace.trace_factory.get_or_create_trace()
        else:
            self.should_send_trace = False
        trace.prepare()

        # Ignoring non relevant content types.
        self.ignored_request = ignore_request('', self.request.path.lower())

        if self.ignored_request:
            return

        # Create a Django runner with current request.
        try:
            self.runner = epsagon.runners.django.DjangoRunner(
                time.time(),
                self.request
            )
            trace.set_runner(self.runner)
            self.request.epsagon_trace = trace

            # Collect metadata in case this is a container.
            collect_container_metadata(self.runner.resource['metadata'])

        # pylint: disable=W0703
        except Exception as exception:
            # Regress to python runner.
            warnings.warn('Could not extract request', EpsagonWarning)
            epsagon.trace.trace_factory.add_exception(
                exception,
                traceback.format_exc()
            )

        # Extract HTTP trigger data.
        try:
            trigger = epsagon.triggers.http.HTTPTriggerFactory.factory(
                time.time(),
                self.request
            )
            if trigger:
                epsagon.trace.trace_factory.add_event(trigger)
        # pylint: disable=W0703
        except Exception as exception:
            epsagon.trace.trace_factory.add_exception(
                exception,
                traceback.format_exc(),
            )
Пример #6
0
def wrap_python_function(func, args, kwargs, name=None):
    """
    Wrap a python function call with a simple python wrapper. Used as default
    when wrapping with other wrappers is impossible.
    NOTE: this function does not prepare the tracer (clears the previous run)
    :param func: The function to wrap.
    :param args: The arguments to the function.
    :param kwargs: The keyword arguments to the function.
    :param name: Resource name for the runner
    :return: The function's result.
    """
    try:
        runner = epsagon.runners.python_function.PythonRunner(time.time(),
                                                              func,
                                                              args,
                                                              kwargs,
                                                              name=name)
        epsagon.trace.trace_factory.set_runner(runner)

        # Collect metadata in case this is a container.
        collect_container_metadata(runner.resource['metadata'])

    # pylint: disable=W0703
    except Exception:
        # If we failed, just call the user's function. Nothing more to do.
        return func(*args, **kwargs)

    # settings in case we are in a lambda and context is None
    constants.COLD_START = False

    result = None
    try:
        result = func(*args, **kwargs)
        return result
    # pylint: disable=W0703
    except Exception as exception:
        runner.set_exception(exception, traceback.format_exc())
        raise
    finally:
        try:
            runner.add_json_field('python.function.return_value', result)
        # pylint: disable=W0703
        except Exception as exception:
            epsagon.trace.trace_factory.add_exception(
                exception,
                traceback.format_exc(),
            )
        try:
            epsagon.trace.trace_factory.send_traces()
        # pylint: disable=W0703
        except Exception:
            pass
Пример #7
0
def _setup_trace_runner(epsagon_scope, trace, request):
    """
    Setups the trace runner event - creates the FastAPI runner event,
    collects container metadata (if relevant).
    Assumption: a runner event has NOT been created before for given trace.
    :return: True if succeeded to setup runner event, False otherwise
    """
    try:
        trace.set_runner(FastapiRunner(time.time(), request))
    except Exception:  # pylint: disable=W0703
        print_debug('Failed to add FastAPI runner event, skipping trace')
        # failed to add runner event, skipping trace
        return False
    try:
        if not epsagon_scope.get(SCOPE_CONTAINER_METADATA_COLLECTED):
            collect_container_metadata(trace.runner.resource['metadata'])
            epsagon_scope[SCOPE_CONTAINER_METADATA_COLLECTED] = True
    except Exception:  # pylint: disable=W0703
        warnings.warn('Could not extract container metadata', EpsagonWarning)
    return True
Пример #8
0
    def _before_request(self):
        """
        Runs when new request comes in.
        :return: None.
        """
        # Ignoring non relevant content types.
        self.ignored_request = ignore_request('', request.path.lower())

        if self.ignored_request:
            return

        trace = epsagon.trace.trace_factory.get_or_create_trace()
        trace.prepare()

        # Create flask runner with current request.
        try:
            self.runner = epsagon.runners.flask.FlaskRunner(
                time.time(), self.app, request)
            trace.set_runner(self.runner)

            # Collect metadata in case this is a container.
            collect_container_metadata(self.runner.resource['metadata'])

        # pylint: disable=W0703
        except Exception as exception:
            # Regress to python runner.
            warnings.warn('Could not extract request', EpsagonWarning)
            trace.add_exception(exception, traceback.format_exc())

        # Extract HTTP trigger data.
        try:
            trigger = epsagon.triggers.http.HTTPTriggerFactory.factory(
                time.time(), request)
            if trigger:
                trace.add_event(trigger)
        # pylint: disable=W0703
        except Exception as exception:
            trace.add_exception(
                exception,
                traceback.format_exc(),
            )
Пример #9
0
async def AiohttpMiddleware(request, handler):
    """
    aiohttp middleware to create a runner with event details
    :param request: incoming request data
    :param handler: original handler
    :return: response data from the handler
    """
    epsagon.trace.trace_factory.switch_to_async_tracer()

    if ignore_request('', request.path.lower()):
        return await handler(request)

    trace = epsagon.trace.trace_factory.get_or_create_trace()
    trace.prepare()
    runner = None
    response = None

    try:
        body = await request.text()
        runner = AiohttpRunner(time.time(), request, body, handler)
        trace.set_runner(runner)
        collect_container_metadata(runner.resource['metadata'])
    except Exception as exception:  # pylint: disable=W0703
        warnings.warn('Could not extract request', EpsagonWarning)

    try:
        response = await handler(request)
    except Exception as exception:  # pylint: disable=W0703
        traceback_data = get_traceback_data_from_exception(exception)
        trace.runner.set_exception(exception, traceback_data)

    if response is not None and runner:
        if ignore_request(response.content_type.lower(), ''):
            return response

        runner.update_response(response)

    if runner:
        epsagon.trace.trace_factory.send_traces()

    return response