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)
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)
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)
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)
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)
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))
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
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")