def extract(self, format: object, carrier: object): """Returns an ``opentracing.SpanContext`` instance extracted from a ``carrier``. See base class for more details. Args: format: a Python object instance that represents a given carrier format. ``format`` may be of any type, and ``format`` equality is defined by python ``==`` operator. carrier: the format-specific carrier object to extract from Returns: An ``opentracing.SpanContext`` extracted from ``carrier`` or ``None`` if no such ``SpanContext`` could be found. """ # pylint: disable=redefined-builtin # This implementation does not perform the extracing by itself but # uses the configured propagators in opentelemetry.propagators. # TODO: Support Format.BINARY once it is supported in # opentelemetry-python. if format not in self._supported_formats: raise UnsupportedFormatException propagator = propagators.get_global_textmap() ctx = propagator.extract(self._carrier_getter, carrier) span = get_current_span(ctx) if span is not None: otel_context = span.get_span_context() else: otel_context = INVALID_SPAN_CONTEXT return SpanContextShim(otel_context)
def inject(self, span_context, format: object, carrier: object): """Injects ``span_context`` into ``carrier``. See base class for more details. Args: span_context: The ``opentracing.SpanContext`` to inject. format: a Python object instance that represents a given carrier format. `format` may be of any type, and `format` equality is defined by Python ``==`` operator. carrier: the format-specific carrier object to inject into """ # pylint: disable=redefined-builtin # This implementation does not perform the injecting by itself but # uses the configured propagators in opentelemetry.propagators. # TODO: Support Format.BINARY once it is supported in # opentelemetry-python. if format not in self._supported_formats: raise UnsupportedFormatException propagator = propagators.get_global_textmap() ctx = set_span_in_context(DefaultSpan(span_context.unwrap())) propagator.inject(type(carrier).__setitem__, carrier, context=ctx)
def test_distributed_context(self): previous_propagator = propagators.get_global_textmap() try: propagators.set_global_textmap(MockTextMapPropagator()) result = self.perform_request(self.URL) self.assertEqual(result.read(), b"Hello!") span = self.assert_span() headers_ = dict(httpretty.last_request().headers) headers = {} for k, v in headers_.items(): headers[k.lower()] = v self.assertIn(MockTextMapPropagator.TRACE_ID_KEY, headers) self.assertEqual( str(span.get_span_context().trace_id), headers[MockTextMapPropagator.TRACE_ID_KEY], ) self.assertIn(MockTextMapPropagator.SPAN_ID_KEY, headers) self.assertEqual( str(span.get_span_context().span_id), headers[MockTextMapPropagator.SPAN_ID_KEY], ) finally: propagators.set_global_textmap(previous_propagator)
def test_extract_empty_context_returns_invalid_context(self): """In the case where the propagator cannot extract a SpanContext, extract should return and invalid span context. """ _old_propagator = propagators.get_global_textmap() propagators.set_global_textmap(NOOPTextMapPropagator()) try: carrier = {} ctx = self.shim.extract(opentracing.Format.HTTP_HEADERS, carrier) self.assertEqual(ctx.unwrap(), trace.INVALID_SPAN_CONTEXT) finally: propagators.set_global_textmap(_old_propagator)
def test_propagation_baggage(self): configure_opentelemetry( service_name="service_name", service_version="service_version", access_token="a" * 104, propagators="baggage", ) with trace.get_tracer(__name__).start_as_current_span("test"): ctx = baggage.set_baggage("abc", "def") prop = get_global_textmap() carrier = {} prop.inject(dict.__setitem__, carrier, context=ctx) self.assertIsNone(carrier.get("x-b3-traceid")) self.assertEqual(carrier.get("baggage"), "abc=def")
def test_propagator_injects_into_request(self): headers = {} previous_propagator = propagators.get_global_textmap() def check_headers(**kwargs): nonlocal headers headers = kwargs["request"].headers try: propagators.set_global_textmap(MockTextMapPropagator()) ec2 = self.session.create_client("ec2", region_name="us-west-2") ec2.meta.events.register_first("before-send.ec2.DescribeInstances", check_headers) ec2.describe_instances() spans = self.memory_exporter.get_finished_spans() assert spans span = spans[0] self.assertEqual(len(spans), 1) self.assertEqual(span.attributes["aws.agent"], "botocore") self.assertEqual(span.attributes["aws.region"], "us-west-2") self.assertEqual(span.attributes["aws.operation"], "DescribeInstances") assert_span_http_status_code(span, 200) self.assertEqual( span.resource, Resource(attributes={ "endpoint": "ec2", "operation": "describeinstances", }), ) self.assertEqual(span.name, "ec2.command") self.assertIn(MockTextMapPropagator.TRACE_ID_KEY, headers) self.assertEqual( str(span.get_span_context().trace_id), headers[MockTextMapPropagator.TRACE_ID_KEY], ) self.assertIn(MockTextMapPropagator.SPAN_ID_KEY, headers) self.assertEqual( str(span.get_span_context().span_id), headers[MockTextMapPropagator.SPAN_ID_KEY], ) finally: propagators.set_global_textmap(previous_propagator)
def test_propagator_injects_into_request(self): headers = {} previous_propagator = propagators.get_global_textmap() def check_headers(**kwargs): nonlocal headers headers = kwargs["request"].headers try: propagators.set_global_textmap(MockTextMapPropagator()) ec2 = self.session.create_client("ec2", region_name="us-west-2") ec2.meta.events.register_first( "before-send.ec2.DescribeInstances", check_headers ) ec2.describe_instances() spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 1) span = spans[0] describe_instances_attributes = spans[0].attributes self.assertEqual( describe_instances_attributes, { "aws.operation": "DescribeInstances", "aws.region": "us-west-2", "aws.request_id": "fdcdcab1-ae5c-489e-9c33-4637c5dda355", "aws.service": "ec2", "retry_attempts": 0, "http.status_code": 200, }, ) self.assertIn(MockTextMapPropagator.TRACE_ID_KEY, headers) self.assertEqual( str(span.get_span_context().trace_id), headers[MockTextMapPropagator.TRACE_ID_KEY], ) self.assertIn(MockTextMapPropagator.SPAN_ID_KEY, headers) self.assertEqual( str(span.get_span_context().span_id), headers[MockTextMapPropagator.SPAN_ID_KEY], ) finally: propagators.set_global_textmap(previous_propagator)
def test_propagation_tracecontext(self): configure_opentelemetry( service_name="service_name", service_version="service_version", access_token="a" * 104, propagators="tracecontext", ) with trace.get_tracer(__name__).start_as_current_span("test") as span: ctx = baggage.set_baggage("abc", "def") prop = get_global_textmap() carrier = {} prop.inject(dict.__setitem__, carrier, context=ctx) self.assertIn( "00-{}".format(format(span.get_span_context().trace_id, "032x")), carrier.get("traceparent"), )
def setUpClass(cls): # Save current propagator to be restored on teardown. cls._previous_propagator = propagators.get_global_textmap() # Set mock propagator for testing. propagators.set_global_textmap(MockTextMapPropagator())
import os service_name = os.getenv('DD_SERVICE') dd_agent = os.getenv('DD_AGENT_HOST') app = Sanic(name=service_name) resource = Resource.create({"service.name": service_name}) trace.set_tracer_provider(TracerProvider(resource=resource)) trace.get_tracer_provider().add_span_processor( DatadogExportSpanProcessor( DatadogSpanExporter(agent_url="http://" + dd_agent + ":8126", service=service_name))) global_textmap = get_global_textmap() if isinstance(global_textmap, CompositeHTTPPropagator) and not any( isinstance(p, DatadogFormat) for p in global_textmap._propagators): set_global_textmap( CompositeHTTPPropagator(global_textmap._propagators + [DatadogFormat()])) else: set_global_textmap(DatadogFormat()) tracer = trace.get_tracer(__name__) @app.route('/') async def test(request): param = request.args.get("param") with tracer.start_as_current_span("hello-world"):
from opentelemetry.sdk.trace import TracerProvider app = Flask(__name__) trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor( DatadogExportSpanProcessor( DatadogSpanExporter( agent_url="http://localhost:8126", service="example-server" ) ) ) # append Datadog format for propagation to and from Datadog instrumented services global_textmap = propagators.get_global_textmap() if isinstance( global_textmap, propagators.composite.CompositeHTTPPropagator ) and not any( isinstance(p, DatadogFormat) for p in global_textmap._propagators ): propagators.set_global_textmap( propagators.composite.CompositeHTTPPropagator( global_textmap._propagators + [DatadogFormat()] ) ) else: propagators.set_global_textmap(DatadogFormat()) tracer = trace.get_tracer(__name__)