def initialize_tracer(project_id): trace.set_tracer_provider(TracerProvider()) cloud_trace_exporter = CloudTraceSpanExporter(project_id) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(cloud_trace_exporter)) propagate.set_global_textmap(CloudTraceFormatPropagator()) opentelemetry_tracer = trace.get_tracer(__name__) return opentelemetry_tracer
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import requests from opentelemetry import trace from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter from opentelemetry.instrumentation.requests import RequestsInstrumentor from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.cloud_trace_propagator import ( CloudTraceFormatPropagator, ) from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor set_global_textmap(CloudTraceFormatPropagator()) tracer_provider = TracerProvider() cloud_trace_exporter = CloudTraceSpanExporter() tracer_provider.add_span_processor( # BatchSpanProcessor buffers spans and sends them in batches in a # background thread. The default parameters are sensible, but can be # tweaked to optimize your performance BatchSpanProcessor(cloud_trace_exporter) ) trace.set_tracer_provider(tracer_provider) tracer = trace.get_tracer(__name__) RequestsInstrumentor().instrument()
class TestCloudTraceFormatPropagator(unittest.TestCase): def setUp(self): self.propagator = CloudTraceFormatPropagator() self.valid_trace_id = 281017822499060589596062859815111849546 self.valid_span_id = 17725314949316355921 self.too_long_id = 111111111111111111111111111111111111111111111 def _extract(self, header_value): """Test helper""" header = {_TRACE_CONTEXT_HEADER_NAME: [header_value]} new_context = self.propagator.extract(carrier=header, getter=default_getter) return trace.get_current_span(new_context).get_span_context() def _inject(self, span=None): """Test helper""" ctx = get_current() if span is not None: ctx = trace.set_span_in_context(span, ctx) output = {} self.propagator.inject(output, context=ctx) return output.get(_TRACE_CONTEXT_HEADER_NAME) def test_no_context_header(self): header = {} new_context = self.propagator.extract(carrier=header, getter=default_getter) self.assertEqual( trace.get_current_span(new_context).get_span_context(), trace.INVALID_SPAN.get_span_context(), ) def test_empty_context_header(self): header = "" self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) 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_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) 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_invalid_trace_id(self): header = "{}/{};o={}".format(INVALID_TRACE_ID, self.valid_span_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format("0" * 32, self.valid_span_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "0/{};o={}".format(self.valid_span_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "234/{};o={}".format(self.valid_span_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) header = "{}/{};o={}".format(self.too_long_id, self.valid_span_id, 1) self.assertEqual(self._extract(header), trace.INVALID_SPAN.get_span_context()) 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_inject_with_no_context(self): output = self._inject() self.assertIsNone(output) def test_inject_with_invalid_context(self): output = self._inject(trace.INVALID_SPAN) self.assertIsNone(output) 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 setUp(self): self.propagator = CloudTraceFormatPropagator() self.valid_trace_id = 281017822499060589596062859815111849546 self.valid_span_id = 17725314949316355921 self.too_long_id = 111111111111111111111111111111111111111111111
def configure_exporter(exporter): trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(exporter)) propagate.set_global_textmap(CloudTraceFormatPropagator())