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)
예제 #3
0
    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)