Ejemplo n.º 1
0
    def test_extract_empty(self):
        "Test extraction when no headers are present"

        span_context = get_current_span(self.ot_trace_propagator.extract(
            {})).get_span_context()

        self.assertEqual(span_context, INVALID_SPAN_CONTEXT)
Ejemplo n.º 2
0
def _determine_parent_context(
        lambda_event: Any,
        event_context_extractor: Callable[[Any], Context]) -> Context:
    """Determine the parent context for the current Lambda invocation.

    See more:
    https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/instrumentation/aws-lambda.md#determining-the-parent-of-a-span

    Args:
        lambda_event: user-defined, so it could be anything, but this
            method counts it being a map with a 'headers' key
    Returns:
        A Context with configuration found in the carrier.
    """
    parent_context = None

    xray_env_var = os.environ.get(_X_AMZN_TRACE_ID)

    if xray_env_var:
        parent_context = AwsXRayPropagator().extract(
            {TRACE_HEADER_KEY: xray_env_var})

    if (parent_context and get_current_span(
            parent_context).get_span_context().trace_flags.sampled):
        return parent_context

    if event_context_extractor:
        parent_context = event_context_extractor(lambda_event)
    else:
        parent_context = _default_event_context_extractor(lambda_event)

    return parent_context
    def test_extract_trace_id_span_id_sampled_false(self):
        """Test valid trace_id, span_id and sampled false"""

        span_context = get_current_span(
            self.ot_trace_propagator.extract(
                {
                    OT_TRACE_ID_HEADER: "80f198ee56343ba864fe8b2a57d3eff7",
                    OT_SPAN_ID_HEADER: "e457b5a2e4d86bd1",
                    OT_SAMPLED_HEADER: "false",
                }, )).get_span_context()

        self.assertEqual(
            hex(span_context.trace_id)[2:], "80f198ee56343ba864fe8b2a57d3eff7")
        self.assertEqual(hex(span_context.span_id)[2:], "e457b5a2e4d86bd1")
        self.assertTrue(span_context.is_remote)
        self.assertEqual(span_context.trace_flags, TraceFlags.DEFAULT)
        self.assertIsInstance(
            get_current_span().get_span_context().trace_flags, TraceFlags)
Ejemplo n.º 4
0
    def test_extract_invalid_span_id(self):
        """Test extraction with invalid span_id"""

        span_context = get_current_span(
            self.ot_trace_propagator.extract(
                {
                    OT_TRACE_ID_HEADER: "64fe8b2a57d3eff7",
                    OT_SPAN_ID_HEADER: INVALID_SPAN_ID,
                    OT_SAMPLED_HEADER: "false",
                }, )).get_span_context()

        self.assertEqual(span_context, INVALID_SPAN_CONTEXT)
Ejemplo n.º 5
0
    def test_extract_malformed_trace_id(self):
        """Test extraction with malformed trace_id"""

        span_context = get_current_span(
            self.ot_trace_propagator.extract(
                {
                    OT_TRACE_ID_HEADER: "abc123!",
                    OT_SPAN_ID_HEADER: "e457b5a2e4d86bd1",
                    OT_SAMPLED_HEADER: "false",
                }, )).get_span_context()

        self.assertEqual(span_context, INVALID_SPAN_CONTEXT)
Ejemplo n.º 6
0
    def get_current_or_new_span(self,
                                name: str = "???",
                                trace_flag: bool = None):
        """
        get_current_or_new_span
            Get current span if one is active, or start a new one

        Parameter:
            name: span name (only used if a new span is started)
            trace_flag(only used if a new span is started)
        """
        try:
            if hasattr(settings,
                       "TELEMETRY") is False or settings.TELEMETRY is False:
                if self.current_span is None:
                    self.current_span = self.start_as_current_span(
                        name, trace_flag)
                return self.current_span
            else:
                tmp_span = get_current_span()
                if tmp_span == INVALID_SPAN:
                    tmp_span = self.start_as_current_span(name, trace_flag)
                    tmp_span = get_current_span()
                return tmp_span
        except Exception as e:
            if e.__dict__.__len__() == 0 or "done" not in e.__dict__:
                exception_type, exception_object, exception_traceback = sys.exc_info(
                )
                exception_info = e.__repr__()
                filename = exception_traceback.tb_frame.f_code.co_filename
                module = exception_traceback.tb_frame.f_code.co_name
                line_number = exception_traceback.tb_lineno
                e.info = {
                    "i": str(exception_info),
                    "f": filename,
                    "n": module,
                    "l": line_number,
                }
                e.done = True
            raise e
    def test_extract_invalid_trace_id(self):
        """Test extraction with invalid trace_id"""

        span_context = get_current_span(
            self.ot_trace_propagator.extract(
                carrier_getter,
                {
                    OT_TRACE_ID_HEADER: INVALID_TRACE_ID,
                    OT_SPAN_ID_HEADER: "e457b5a2e4d86bd1",
                    OT_SAMPLED_HEADER: "false",
                },
            )).get_span_context()

        self.assertEqual(span_context, INVALID_SPAN_CONTEXT)
    def test_extract_malformed_span_id(self):
        """Test extraction with malformed span_id"""

        span_context = get_current_span(
            self.ot_trace_propagator.extract(
                carrier_getter,
                {
                    OT_TRACE_ID_HEADER: "64fe8b2a57d3eff7",
                    OT_SPAN_ID_HEADER: "abc123!",
                    OT_SAMPLED_HEADER: "false",
                },
            )).get_span_context()

        self.assertEqual(span_context, INVALID_SPAN_CONTEXT)
Ejemplo n.º 9
0
    def _trace_prerun(self, *args, **kwargs):
        task = utils.retrieve_task(kwargs)
        task_id = utils.retrieve_task_id(kwargs)

        if task is None or task_id is None:
            return

        request = task.request
        tracectx = propagators.extract(carrier_extractor, request) or {}
        parent = get_current_span(tracectx)

        logger.debug("prerun signal start task_id=%s", task_id)

        operation_name = "{0}/{1}".format(_TASK_RUN, task.name)
        span = self._tracer.start_span(operation_name,
                                       parent=parent,
                                       kind=trace.SpanKind.CONSUMER)

        activation = self._tracer.use_span(span, end_on_exit=True)
        activation.__enter__()
        utils.attach_span(task, task_id, (span, activation))
Ejemplo n.º 10
0
    def start_as_current_span(self,
                              span_name: str,
                              trace_flag: bool = None) -> Span:
        """
        start_as_current_span
            start a new Span

        Parameter:
            name: span name
            trace_flag
        """
        try:
            if hasattr(settings,
                       "TELEMETRY") is False or settings.TELEMETRY is False:
                self.current_span = SpanMok(span_name, trace_flag)
                self.trace = trace_flag
                if trace_flag is None:
                    print("   ** trace_flag is None")
                return self.current_span
            else:
                my_span = self.real_tracer.start_as_current_span(span_name)
                self.current_span = get_current_span()
                return my_span
        except Exception as e:
            if e.__dict__.__len__() == 0 or "done" not in e.__dict__:
                exception_type, exception_object, exception_traceback = sys.exc_info(
                )
                exception_info = e.__repr__()
                filename = exception_traceback.tb_frame.f_code.co_filename
                module = exception_traceback.tb_frame.f_code.co_name
                line_number = exception_traceback.tb_lineno
                e.info = {
                    "i": str(exception_info),
                    "f": filename,
                    "n": module,
                    "l": line_number,
                }
                e.done = True
            raise e
Ejemplo n.º 11
0
    def test_extract_baggage(self):
        """Test baggage extraction"""

        context = self.ot_trace_propagator.extract(
            {
                OT_TRACE_ID_HEADER: "64fe8b2a57d3eff7",
                OT_SPAN_ID_HEADER: "e457b5a2e4d86bd1",
                OT_SAMPLED_HEADER: "false",
                "".join([OT_BAGGAGE_PREFIX, "abc"]): "abc",
                "".join([OT_BAGGAGE_PREFIX, "def"]): "def",
            }, )
        span_context = get_current_span(context).get_span_context()

        self.assertEqual(hex(span_context.trace_id)[2:], "64fe8b2a57d3eff7")
        self.assertEqual(hex(span_context.span_id)[2:], "e457b5a2e4d86bd1")
        self.assertTrue(span_context.is_remote)
        self.assertEqual(span_context.trace_flags, TraceFlags.DEFAULT)

        baggage = get_all(context)

        self.assertEqual(baggage["abc"], "abc")
        self.assertEqual(baggage["def"], "def")