Exemplo n.º 1
0
def pay(id):
    trace = beeline.start_trace(context={
        "name": "rs-payment",
        "hostname": hostname,
        "user_id": id
        # other initial context
    })
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 6
0
    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')
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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",
        })