コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
    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)
コード例 #5
0
    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)
コード例 #8
0
    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"),
            )
コード例 #9
0
    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())
コード例 #10
0
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"):
コード例 #11
0
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__)