def pay(id): trace = beeline.start_trace(context={ "name": "rs-payment", "hostname": hostname, "user_id": id # other initial context })
def __call__(self, environ, start_response): request_method = environ.get('REQUEST_METHOD') if request_method: trace_name = "werkzeug_http_%s" % request_method.lower() else: trace_name = "werkzeug_http" trace = beeline.start_trace( context={ "name": trace_name, "type": "http_server", "request.host": environ.get('HTTP_HOST'), "request.method": request_method, "request.path": environ.get('PATH_INFO'), "request.remote_addr": environ.get('REMOTE_ADDR'), "request.content_length": environ.get('CONTENT_LENGTH', 0), "request.user_agent": environ.get('HTTP_USER_AGENT'), "request.scheme": environ.get('wsgi.url_scheme'), "request.query": environ.get('QUERY_STRING') }) def _start_response(status, headers, *args): beeline.add_context_field("response.status_code", status) beeline.finish_trace(trace) return start_response(status, headers, *args) return self.app(environ, _start_response)
def create_http_event(self, request): # Code to be executed for each request before # the view (and later middleware) are called. trace_id, parent_id, parent_context = _get_trace_context(request) request_context = self.get_context_from_request(request) trace = beeline.start_trace(context=request_context, trace_id=trace_id, parent_span_id=parent_id) if isinstance(parent_context, dict): for k, v in parent_context.items(): beeline.add_trace_field(k, v) response = self.get_response(request) # Code to be executed for each request/response after # the view is called. response_context = self.get_context_from_response(request, response) beeline.add_context(response_context) beeline.finish_trace(trace) return response
async def __call__(self, scope, receive, send): # Don't trace non http/websocket types if scope["type"] not in ("http", "websocket"): await self.app(scope, receive, send) return trace = beeline.start_trace(context=self.get_context(scope)) status_code = None async def wrapper(response): nonlocal status_code if response["type"] == "http.response.start": status_code = response["status"] return await send(response) try: await self.app(scope, receive, wrapper) except HTTPException as exc: status_code = exc.status_code raise except Exception: status_code = 500 raise finally: trace.add_context_field("response.status_code", status_code) beeline.finish_trace(trace)
def lambda_handler(event, context): trace_context = None input = None parent_trace = None output = {} logging.debug(f"event: {json.dumps(event)}") init_beeline() # Attempt to get trace_context(s) from the input input = event.get("Input", None) if input: trace_context = input.get("trace_context", None) # Start trace if it isn't already, otherwise resume if trace_context: trace_id, parent_id, context = beeline.trace.unmarshal_trace_context( trace_context) logging.info(f"Resuming trace: {trace_id}") trace = beeline.start_trace(trace_id=trace_id, parent_span_id=parent_id, context=context) # add a field to test context propogation beeline.add_trace_field( event.get("Path", "UnknownPath").lower(), uuid.uuid4()) beeline.add_context( {"name": event.get("Path", "Missing Path Information")}) beeline.add_context( {"function_name": event.get("Path", "Missing Path Information")}) random_sleep() beeline.finish_span(trace) else: trace = start_trace() beeline.add_trace_field("c3po", "r2d2") logging.info(f"Starting Trace") with beeline.tracer( name=event.get("Path", "Missing Path Information")): random_sleep() trace_context = beeline.get_beeline( ).tracer_impl.marshal_trace_context() # If final step close the parent trace if event.get("Path") == "Step4": # 2019-03-26T20:14:13.192Z parent_trace_id, parent_parent_id, parent_context_data = beeline.trace.unmarshal_trace_context( trace_context) start_time = datetime.strptime(event.get("start_time"), "%Y-%m-%dT%H:%M:%S.%fZ") close_final_trace(parent_trace_id, parent_parent_id, parent_context_data, start_time) # Close only (send pending) beeline.close() # Return the trace_context to the SFN output["trace_context"] = trace_context return output
def test_start_trace_returns_value(self): ''' ensure the top-level start_span and start_trace APIs return the value form their calls to the tracer ''' self.m_gbl.tracer_impl.start_span.return_value = 'wooimaspan' val = beeline.start_span() self.assertEqual(val, 'wooimaspan') self.m_gbl.tracer_impl.start_trace.return_value = 'wooimatrace' val = beeline.start_trace() self.assertEqual(val, 'wooimatrace')
def __call__(self, environ, start_response): trace = beeline.start_trace(context=self.get_context_from_environ(environ)) def _start_response(status, headers, *args): beeline.add_context_field("response.status_code", status) beeline.finish_trace(trace) return start_response(status, headers, *args) return self.app(environ, _start_response)
def create_http_event(self, request): # Code to be executed for each request before # the view (and later middleware) are called. trace_id, parent_id, context = _get_trace_context(request) trace_name = "django_http_%s" % request.method.lower() trace = beeline.start_trace(context={ "name": trace_name, "type": "http_server", "request.host": request.get_host(), "request.method": request.method, "request.path": request.path, "request.remote_addr": request.META.get('REMOTE_ADDR'), "request.content_length": request.META.get('CONTENT_LENGTH', 0), "request.user_agent": request.META.get('HTTP_USER_AGENT'), "request.scheme": request.scheme, "request.secure": request.is_secure(), "request.query": request.GET.dict(), "request.xhr": request.is_ajax(), "request.post": request.POST.dict() }, trace_id=trace_id, parent_span_id=parent_id) if isinstance(context, dict): for k, v in context.items(): beeline.add_trace_field(k, v) response = self.get_response(request) # Code to be executed for each request/response after # the view is called. beeline.add_context_field("response.status_code", response.status_code) beeline.finish_trace(trace) return response
def __call__(self, environ, start_response): request_method = environ.get('REQUEST_METHOD') if request_method: trace_name = "flask_http_%s" % request_method.lower() else: trace_name = "flask_http" trace_id, parent_id, context = _get_trace_context(environ) root_span = beeline.start_trace(context={ "type": "http_server", "name": trace_name, "request.host": environ.get('HTTP_HOST'), "request.method": request_method, "request.path": environ.get('PATH_INFO'), "request.remote_addr": environ.get('REMOTE_ADDR'), "request.content_length": environ.get('CONTENT_LENGTH', 0), "request.user_agent": environ.get('HTTP_USER_AGENT'), "request.scheme": environ.get('wsgi.url_scheme'), "request.query": environ.get('QUERY_STRING') }, trace_id=trace_id, parent_span_id=parent_id) # populate any propagated custom context if isinstance(context, dict): for k, v in context.items(): beeline.add_trace_field(k, v) def _start_response(status, headers, *args): status_code = int(status[0:4]) beeline.add_context_field("response.status_code", status_code) if status_code != 500: beeline.finish_trace(root_span) elif status_code == 500 and not signals.signals_available: beeline.finish_trace(root_span) return start_response(status, headers, *args) return self.app(environ, _start_response)
def __call__(self, environ, start_response): trace_id, parent_id, context = _get_trace_context(environ) root_span = beeline.start_trace( context=self.get_context_from_environ(environ), trace_id=trace_id, parent_span_id=parent_id) # populate any propagated custom context if isinstance(context, dict): for k, v in context.items(): beeline.add_trace_field(k, v) def _start_response(status, headers, *args): status_code = int(status[0:4]) beeline.add_context_field("response.status_code", status_code) if status_code != 500: beeline.finish_trace(root_span) elif status_code == 500 and not signals.signals_available: beeline.finish_trace(root_span) return start_response(status, headers, *args) return self.app(environ, _start_response)
def start_trace(): logging.info(f"Starting Trace") return beeline.start_trace( context={ "name": "reference-honeycomb-traced-stepfunction", })