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())
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)
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
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
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(), )
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
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
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(), )
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