def test_invalid_header_format(self): header = "invalid_header" self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o=".format(format_trace_id(self.valid_trace_id), self.valid_span_id) self._assert_failed_to_extract(self._extract(header)) header = "extra_chars/{}/{};o=1".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self._assert_failed_to_extract(self._extract(header)) header = "{}/{}extra_chars;o=1".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o=1extra_chars".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self._assert_failed_to_extract(self._extract(header)) header = "{}/;o=1".format(format_trace_id(self.valid_trace_id)) self._assert_failed_to_extract(self._extract(header)) header = "/{};o=1".format(self.valid_span_id) self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o={}".format("123", "34", "4") self._assert_failed_to_extract(self._extract(header))
def test_valid_header(self): header = "{}/{};o=1".format(format_trace_id(self.valid_trace_id), self.valid_span_id) new_span_context = self._extract(header) self.assertEqual(new_span_context.trace_id, self.valid_trace_id) self.assertEqual(new_span_context.span_id, self.valid_span_id) self.assertEqual(new_span_context.trace_flags, TraceFlags(1)) self.assertTrue(new_span_context.is_remote) header = "{}/{};o=10".format(format_trace_id(self.valid_trace_id), self.valid_span_id) new_span_context = self._extract(header) self.assertEqual(new_span_context.trace_id, self.valid_trace_id) self.assertEqual(new_span_context.span_id, self.valid_span_id) self.assertEqual(new_span_context.trace_flags, TraceFlags(10)) self.assertTrue(new_span_context.is_remote) header = "{}/{};o=0".format(format_trace_id(self.valid_trace_id), self.valid_span_id) new_span_context = self._extract(header) self.assertEqual(new_span_context.trace_id, self.valid_trace_id) self.assertEqual(new_span_context.span_id, self.valid_span_id) self.assertEqual(new_span_context.trace_flags, TraceFlags(0)) self.assertTrue(new_span_context.is_remote) header = "{}/{};o=0".format(format_trace_id(self.valid_trace_id), 345) new_span_context = self._extract(header) self.assertEqual(new_span_context.trace_id, self.valid_trace_id) self.assertEqual(new_span_context.span_id, 345) self.assertEqual(new_span_context.trace_flags, TraceFlags(0)) self.assertTrue(new_span_context.is_remote)
def test_propagation(self): traceparent_value = "00-{trace_id}-{span_id}-00".format( trace_id=format_trace_id(self.TRACE_ID), span_id=format_span_id(self.SPAN_ID), ) tracestate_value = "foo=1,bar=2,baz=3" headers = { "baggage": ["key1=val1,key2=val2"], "traceparent": [traceparent_value], "tracestate": [tracestate_value], } ctx = extract(headers) baggage_entries = baggage.get_all(context=ctx) expected = {"key1": "val1", "key2": "val2"} self.assertEqual(baggage_entries, expected) span_context = get_current_span(context=ctx).get_span_context() self.assertEqual(span_context.trace_id, self.TRACE_ID) self.assertEqual(span_context.span_id, self.SPAN_ID) span = trace.NonRecordingSpan(span_context) ctx = baggage.set_baggage("key3", "val3") ctx = baggage.set_baggage("key4", "val4", context=ctx) ctx = set_span_in_context(span, context=ctx) output = {} inject(output, context=ctx) self.assertEqual(traceparent_value, output["traceparent"]) self.assertIn("key3=val3", output["baggage"]) self.assertIn("key4=val4", output["baggage"]) self.assertIn("foo=1", output["tracestate"]) self.assertIn("bar=2", output["tracestate"]) self.assertIn("baz=3", output["tracestate"])
def test_invalid_span_id(self): header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), INVALID_SPAN_ID, 1) self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), "0" * 16, 1) self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), "0", 1) self._assert_failed_to_extract(self._extract(header)) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), self.too_long_id, 1) self._assert_failed_to_extract(self._extract(header))
def test_invalid_span_id(self): header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), INVALID_SPAN_ID, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), "0" * 16, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), "0", 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format(format_trace_id(self.valid_trace_id), self.too_long_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context())
def test_invalid_header_format(self): header = "invalid_header" self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o=".format(format_trace_id(self.valid_trace_id), self.valid_span_id) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "extra_chars/{}/{};o=1".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{}extra_chars;o=1".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o=1extra_chars".format( format_trace_id(self.valid_trace_id), self.valid_span_id) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/;o=1".format(format_trace_id(self.valid_trace_id)) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "/{};o=1".format(self.valid_span_id) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format("123", "34", "4") self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context())
def test_inject_with_valid_context(self): span_context = SpanContext( trace_id=self.valid_trace_id, span_id=self.valid_span_id, is_remote=True, trace_flags=TraceFlags(1), ) output = self._inject(trace.NonRecordingSpan(span_context)) self.assertEqual( output, "{}/{};o={}".format( format_trace_id(self.valid_trace_id), self.valid_span_id, 1, ), )
def inject( self, carrier: textmap.CarrierT, context: typing.Optional[Context] = None, setter: textmap.Setter = textmap.default_setter, ) -> None: span = trace.get_current_span(context) span_context = span.get_span_context() if span_context == trace.INVALID_SPAN_CONTEXT: return header = "{}/{};o={}".format( format_trace_id(span_context.trace_id), span_context.span_id, int(span_context.trace_flags.sampled), ) setter.set(carrier, _TRACE_CONTEXT_HEADER_NAME, header)
def test_mixed_case_header_key(self): header_value = "{}/{};o=1".format(format_trace_id(self.valid_trace_id), self.valid_span_id) for header_key in ( "X-Cloud-Trace-Context", "X-ClOuD-tRace-ConTeXt", "X-CLOUD-TRACE-CONTEXT", ): header_map = {header_key: [header_value]} new_context = self.propagator.extract(carrier=header_map, getter=default_getter) new_span_context = trace.get_current_span( new_context).get_span_context() self.assertEqual(new_span_context.trace_id, self.valid_trace_id) self.assertEqual(new_span_context.span_id, self.valid_span_id) self.assertEqual(new_span_context.trace_flags, TraceFlags(1)) self.assertTrue(new_span_context.is_remote)