Beispiel #1
0
    def test_span_kind(self):
        with ContextHelper():
            trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
            parent = trace.start_span()
            wrapped_class = OpenCensusSpan(span=parent)

            wrapped_class.kind = SpanKind.UNSPECIFIED
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.UNSPECIFIED
            assert wrapped_class.kind == SpanKind.UNSPECIFIED

            wrapped_class.kind = SpanKind.SERVER
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.SERVER
            assert wrapped_class.kind == SpanKind.SERVER

            wrapped_class.kind = SpanKind.CLIENT
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.CLIENT
            assert wrapped_class.kind == SpanKind.CLIENT

            # opencensus doesn't support producer, put client instead
            wrapped_class.kind = SpanKind.PRODUCER
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.CLIENT
            assert wrapped_class.kind == SpanKind.CLIENT

            # opencensus doesn't support consumer, put client instead
            wrapped_class.kind = SpanKind.CONSUMER
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.CLIENT
            assert wrapped_class.kind == SpanKind.CLIENT

            # opencensus doesn't support consumer, put client instead
            wrapped_class.kind = SpanKind.INTERNAL
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.UNSPECIFIED
            assert wrapped_class.kind == SpanKind.UNSPECIFIED
Beispiel #2
0
 def test_set_http_attributes(self):
     with ContextHelper():
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
         parent = trace.start_span()
         wrapped_class = OpenCensusSpan(span=parent)
         request = mock.Mock()
         setattr(request, "method", "GET")
         setattr(request, "url", "some url")
         response = mock.Mock()
         setattr(request, "headers", {})
         setattr(response, "status_code", 200)
         wrapped_class.set_http_attributes(request)
         assert wrapped_class.span_instance.attributes.get(
             "http.method") == request.method
         assert wrapped_class.span_instance.attributes.get(
             "component") == "http"
         assert wrapped_class.span_instance.attributes.get(
             "http.url") == request.url
         assert wrapped_class.span_instance.attributes.get(
             "http.status_code") == 504
         assert wrapped_class.span_instance.attributes.get(
             "http.user_agent") is None
         request.headers["User-Agent"] = "some user agent"
         wrapped_class.set_http_attributes(request, response)
         assert wrapped_class.span_instance.attributes.get(
             "http.status_code") == response.status_code
         assert wrapped_class.span_instance.attributes.get(
             "http.user_agent") == request.headers.get("User-Agent")
Beispiel #3
0
def test_distributed_tracing_policy_badurl(caplog):
    """Test policy with a bad url that will throw, and be sure policy ignores it"""
    with ContextHelper():
        exporter = MockExporter()
        trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
        with trace.span("parent"):
            policy = DistributedTracingPolicy()

            request = HttpRequest("GET", "http://[[[")
            request.headers["x-ms-client-request-id"] = "some client request id"

            pipeline_request = PipelineRequest(request, PipelineContext(None))
            with caplog.at_level(logging.WARNING, logger="azure.core.pipeline.policies.distributed_tracing"):
                policy.on_request(pipeline_request)
            assert "Unable to start network span" in caplog.text

            response = HttpResponse(request, None)
            response.headers = request.headers
            response.status_code = 202
            response.headers["x-ms-request-id"] = "some request id"

            ctx = trace.span_context
            header = trace.propagator.to_headers(ctx)
            assert request.headers.get("traceparent") is None  # Got not network trace

            policy.on_response(pipeline_request, PipelineResponse(request, response, PipelineContext(None)))
            time.sleep(0.001)
            policy.on_request(pipeline_request)
            policy.on_exception(pipeline_request)

        trace.finish()
        exporter.build_tree()
        parent = exporter.root
        assert len(parent.children) == 0
Beispiel #4
0
async def test_span_with_exception(value):
    """Assert that if an exception is raised, the next sibling method is actually a sibling span.
    """
    with ContextHelper(tracer_to_use=value):
        exporter = MockExporter()
        trace = tracer_module.Tracer(sampler=AlwaysOnSampler(),
                                     exporter=exporter)
        with trace.span("overall"):
            client = MockClient()
            try:
                await client.raising_exception()
            except:
                pass
            await client.get_foo()
        trace.finish()
        exporter.build_tree()
        parent = exporter.root
        assert len(parent.children) == 3
        assert parent.children[0].span_data.name == "MockClient.__init__"
        assert parent.children[
            1].span_data.name == "MockClient.raising_exception"
        # Exception should propagate status for Opencensus
        assert parent.children[
            1].span_data.status.message == 'Something went horribly wrong here'
        assert parent.children[2].span_data.name == "MockClient.get_foo"
Beispiel #5
0
    def test_span_kind(self):
        with ContextHelper():
            trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
            parent = trace.start_span()
            wrapped_class = OpenCensusSpan(span=parent)

            wrapped_class.kind = SpanKind.UNSPECIFIED
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.UNSPECIFIED
            assert wrapped_class.kind == SpanKind.UNSPECIFIED

            wrapped_class.kind = SpanKind.SERVER
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.SERVER
            assert wrapped_class.kind == SpanKind.SERVER

            wrapped_class.kind = SpanKind.CLIENT
            assert wrapped_class.span_instance.span_kind == OpenCensusSpanKind.CLIENT
            assert wrapped_class.kind == SpanKind.CLIENT

            # not supported
            with pytest.raises(ValueError):
                wrapped_class.kind = SpanKind.PRODUCER

            with pytest.raises(ValueError):
                wrapped_class.kind = SpanKind.CONSUMER

            with pytest.raises(ValueError):
                wrapped_class.kind = SpanKind.INTERNAL
 def test_get_function_and_class_name(self):
     with ContextHelper():
         client = MockClient()
         assert common.get_function_and_class_name(
             client.get_foo, client) == "MockClient.get_foo"
         assert common.get_function_and_class_name(
             random_function) == "random_function"
Beispiel #7
0
 def test_span_with_opencensus_complicated(self, value):
     with ContextHelper(tracer_to_use=value) as ctx:
         exporter = MockExporter()
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
         with trace.start_span(name="OverAll") as parent:
             client = MockClient()
             client.make_request(2)
             with trace.span("child") as child:
                 time.sleep(0.001)
                 client.make_request(2, parent_span=parent)
                 assert OpenCensusSpan.get_current_span() == child
                 client.make_request(2)
         trace.finish()
         exporter.build_tree()
         parent = exporter.root
         assert len(parent.children) == 4
         assert parent.children[0].span_data.name == "MockClient.__init__"
         assert parent.children[1].span_data.name == "MockClient.make_request"
         assert parent.children[1].children[0].span_data.name == "MockClient.get_foo"
         assert parent.children[1].children[1].span_data.name == "MockClient.make_request"
         assert parent.children[2].span_data.name == "child"
         assert parent.children[2].children[0].span_data.name == "MockClient.make_request"
         assert parent.children[3].span_data.name == "MockClient.make_request"
         assert parent.children[3].children[0].span_data.name == "MockClient.get_foo"
         assert parent.children[3].children[1].span_data.name == "MockClient.make_request"
         children = parent.children[1].children
         assert len(children) == 2
Beispiel #8
0
 def test_add_attribute(self):
     with ContextHelper() as ctx:
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
         parent = trace.start_span()
         wrapped_class = OpenCensusSpan(span=parent)
         wrapped_class.add_attribute("test", "test2")
         assert wrapped_class.span_instance.attributes["test"] == "test2"
         assert parent.attributes["test"] == "test2"
Beispiel #9
0
 def test_should_use_trace(self):
     with ContextHelper(environ={"AZURE_TRACING_ONLY_PROPAGATE": "yes"}):
         parent_span = OpenCensusSpan()
         assert common.should_use_trace(parent_span) == False
         assert common.should_use_trace(None) == False
     parent_span = OpenCensusSpan()
     assert common.should_use_trace(parent_span)
     assert common.should_use_trace(None) == False
Beispiel #10
0
 def test_no_span_passed_in_with_no_environ(self):
     with ContextHelper() as ctx:
         tracer = OpenCensusSpan.get_current_tracer()
         wrapped_span = OpenCensusSpan()
         assert wrapped_span.span_instance.name == "span"
         assert wrapped_span.span_instance.context_tracer.span_context.trace_id == tracer.span_context.trace_id
         assert ctx.orig_tracer == tracer
         wrapped_span.finish()
Beispiel #11
0
 def test_no_span_but_in_trace(self):
     with ContextHelper():
         tracer = tracer_module.Tracer(sampler=AlwaysOnSampler())
         wrapped_span = OpenCensusSpan()
         assert wrapped_span.span_instance.name == "span"
         assert wrapped_span.span_instance.context_tracer.trace_id == tracer.span_context.trace_id
         wrapped_span.finish()
         tracer.finish()
Beispiel #12
0
 def test_with_nothing_imported(self):
     with ContextHelper():
         opencensus = sys.modules["opencensus"]
         del sys.modules["opencensus"]
         client = MockClient(assert_current_span=True)
         with pytest.raises(AssertionError):
             client.make_request(3)
         sys.modules["opencensus"] = opencensus
Beispiel #13
0
def test_distributed_tracing_policy_with_user_agent():
    """Test policy working with user agent."""
    with ContextHelper(environ={"AZURE_HTTP_USER_AGENT": "mytools"}):
        exporter = MockExporter()
        trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
        with trace.span("parent"):
            tracing_context.current_span.set(OpenCensusSpan(trace.current_span()))
            policy = DistributedTracingPolicy()

            request = HttpRequest("GET", "http://127.0.0.1")
            request.headers["x-ms-client-request-id"] = "some client request id"

            pipeline_request = PipelineRequest(request, PipelineContext(None))

            user_agent = UserAgentPolicy()
            user_agent.on_request(pipeline_request)
            policy.on_request(pipeline_request)

            response = HttpResponse(request, None)
            response.headers = request.headers
            response.status_code = 202
            response.headers["x-ms-request-id"] = "some request id"
            pipeline_response = PipelineResponse(request, response, PipelineContext(None))

            ctx = trace.span_context
            header = trace.propagator.to_headers(ctx)
            assert request.headers.get("traceparent") == header.get("traceparent")

            policy.on_response(pipeline_request, pipeline_response)

            time.sleep(0.001)
            policy.on_request(pipeline_request)
            policy.on_exception(pipeline_request)

            user_agent.on_response(pipeline_request, pipeline_response)

        trace.finish()
        exporter.build_tree()
        parent = exporter.root
        network_span = parent.children[0]
        assert network_span.span_data.name == "/"
        assert network_span.span_data.attributes.get("http.method") == "GET"
        assert network_span.span_data.attributes.get("component") == "http"
        assert network_span.span_data.attributes.get("http.url") == "http://127.0.0.1"
        assert network_span.span_data.attributes.get("http.user_agent").endswith("mytools")
        assert network_span.span_data.attributes.get("x-ms-request-id") == "some request id"
        assert network_span.span_data.attributes.get("x-ms-client-request-id") == "some client request id"
        assert network_span.span_data.attributes.get("http.status_code") == 202

        network_span = parent.children[1]
        assert network_span.span_data.name == "/"
        assert network_span.span_data.attributes.get("http.method") == "GET"
        assert network_span.span_data.attributes.get("component") == "http"
        assert network_span.span_data.attributes.get("http.url") == "http://127.0.0.1"
        assert network_span.span_data.attributes.get("http.user_agent").endswith("mytools")
        assert network_span.span_data.attributes.get("x-ms-client-request-id") == "some client request id"
        assert network_span.span_data.attributes.get("x-ms-request-id") is None
        assert network_span.span_data.attributes.get("http.status_code") == 504
Beispiel #14
0
 def test_span_passed_in(self):
     with ContextHelper():
         tracer = tracer_module.Tracer(sampler=AlwaysOnSampler())
         with tracer.start_span(name="parent") as parent:
             wrapped_span = OpenCensusSpan(parent)
         assert wrapped_span.span_instance.name == "parent"
         assert wrapped_span.span_instance.context_tracer.trace_id == tracer.span_context.trace_id
         wrapped_span.finish()
         tracer.finish()
Beispiel #15
0
def test_distributed_tracing_policy_solo():
    """Test policy with no other policy and happy path"""
    with ContextHelper():
        exporter = MockExporter()
        trace = tracer_module.Tracer(sampler=AlwaysOnSampler(),
                                     exporter=exporter)
        with trace.span("parent"):
            tracing_context.current_span.set(
                OpenCensusSpan(trace.current_span()))
            policy = DistributedTracingPolicy()

            request = HttpRequest("GET", "http://127.0.0.1/temp?query=query")

            pipeline_request = PipelineRequest(request, PipelineContext(None))
            policy.on_request(pipeline_request)

            response = HttpResponse(request, None)
            response.headers = request.headers
            response.status_code = 202
            response.headers["x-ms-request-id"] = "some request id"

            ctx = trace.span_context
            header = trace.propagator.to_headers(ctx)
            assert request.headers.get("traceparent") == header.get(
                "traceparent")

            policy.on_response(
                pipeline_request,
                PipelineResponse(request, response, PipelineContext(None)))
            time.sleep(0.001)
            policy.on_request(pipeline_request)
            policy.on_exception(pipeline_request)

        trace.finish()
        exporter.build_tree()
        parent = exporter.root
        network_span = parent.children[0]
        assert network_span.span_data.name == "/temp"
        assert network_span.span_data.attributes.get("http.method") == "GET"
        assert network_span.span_data.attributes.get("component") == "http"
        assert network_span.span_data.attributes.get(
            "http.url") == "http://127.0.0.1/temp?query=query"
        assert network_span.span_data.attributes.get("http.user_agent") is None
        assert network_span.span_data.attributes.get(
            "x-ms-request-id") == "some request id"
        assert network_span.span_data.attributes.get("http.status_code") == 202

        network_span = parent.children[1]
        assert network_span.span_data.name == "/temp"
        assert network_span.span_data.attributes.get("http.method") == "GET"
        assert network_span.span_data.attributes.get("component") == "http"
        assert network_span.span_data.attributes.get(
            "http.url") == "http://127.0.0.1/temp?query=query"
        assert network_span.span_data.attributes.get("http.user_agent") is None
        assert network_span.span_data.attributes.get("x-ms-request-id") == None
        assert network_span.span_data.attributes.get("http.status_code") == 504
Beispiel #16
0
 def test_links(self):
     with ContextHelper() as ctx:
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
         og_header = {"traceparent": "00-2578531519ed94423ceae67588eff2c9-231ebdc614cb9ddd-01"}
         wrapped_class = OpenCensusSpan()
         OpenCensusSpan.link_from_headers(og_header)
         assert len(wrapped_class.span_instance.links) == 1
         link = wrapped_class.span_instance.links[0]
         assert link.trace_id == "2578531519ed94423ceae67588eff2c9"
         assert link.span_id == "231ebdc614cb9ddd"
Beispiel #17
0
 def test_set_span_context(self):
     with ContextHelper(environ={"AZURE_SDK_TRACING_IMPLEMENTATION": "opencensus"}):
         wrapper = settings.tracing_implementation()
         assert wrapper is OpenCensusSpan
         assert tracing_context.current_span.get() is None
         assert wrapper.get_current_span() is None
         parent = OpenCensusSpan()
         common.set_span_contexts(parent)
         assert parent.span_instance == wrapper.get_current_span()
         assert tracing_context.current_span.get() == parent
Beispiel #18
0
 def test_start_finish(self):
     with ContextHelper() as ctx:
         tracer = tracer_module.Tracer(sampler=AlwaysOnSampler())
         parent = OpenCensusSpan()
         wrapped_class = parent.span()
         assert wrapped_class.span_instance.end_time is None
         wrapped_class.start()
         wrapped_class.finish()
         assert wrapped_class.span_instance.start_time is not None
         assert wrapped_class.span_instance.end_time is not None
         parent.finish()
Beispiel #19
0
 def test_to_header(self):
     with ContextHelper() as ctx:
         og_header = {"traceparent": "00-2578531519ed94423ceae67588eff2c9-231ebdc614cb9ddd-01"}
         ctx = tracer_module.trace_context_http_header_format.TraceContextPropagator().from_headers(og_header)
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), span_context=ctx)
         wrapped_class = OpenCensusSpan()
         headers = wrapped_class.to_header()
         new_header = {
             "traceparent": "00-2578531519ed94423ceae67588eff2c9-{}-01".format(wrapped_class.span_instance.span_id)
         }
         assert headers == new_header
Beispiel #20
0
 def test_decorator_has_different_name(self):
     with ContextHelper():
         exporter = MockExporter()
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
         with trace.span("overall"):
             client = MockClient()
             client.check_name_is_different()
         trace.finish()
         exporter.build_tree()
         parent = exporter.root
         assert len(parent.children) == 2
         assert parent.children[0].span_data.name == "MockClient.__init__"
         assert parent.children[1].span_data.name == "different name"
 def test_passing_links_in_ctor(self):
     with ContextHelper() as ctx:
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
         parent = trace.start_span()
         wrapped_class = OpenCensusSpan(links=[
             Link(
                 headers={
                     "traceparent":
                     "00-2578531519ed94423ceae67588eff2c9-231ebdc614cb9ddd-01"
                 })
         ])
         assert len(wrapped_class.span_instance.links) == 1
         link = wrapped_class.span_instance.links[0]
         assert link.trace_id == "2578531519ed94423ceae67588eff2c9"
         assert link.span_id == "231ebdc614cb9ddd"
Beispiel #22
0
 def test_span(self):
     exporter = MockExporter()
     with ContextHelper() as ctx:
         tracer = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
         assert OpenCensusSpan.get_current_tracer() is tracer
         wrapped_class = OpenCensusSpan()
         assert tracer.current_span() == wrapped_class.span_instance
         child = wrapped_class.span()
         assert tracer.current_span() == child.span_instance
         assert child.span_instance.name == "span"
         assert child.span_instance.context_tracer.trace_id == tracer.span_context.trace_id
         assert child.span_instance.parent_span is wrapped_class.span_instance
         tracer.finish()
     exporter.build_tree()
     parent = exporter.root
     assert len(parent.children) == 1
     assert parent.children[0].span_data.span_id == child.span_instance.span_id
Beispiel #23
0
 def test_with_opencencus_used(self):
     with ContextHelper():
         exporter = MockExporter()
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(), exporter=exporter)
         parent = trace.start_span(name="OverAll")
         client = MockClient(policies=[])
         client.get_foo(parent_span=parent)
         client.get_foo()
         parent.finish()
         trace.finish()
         exporter.build_tree()
         parent = exporter.root
         assert len(parent.children) == 3
         assert parent.children[0].span_data.name == "MockClient.__init__"
         assert not parent.children[0].children
         assert parent.children[1].span_data.name == "MockClient.get_foo"
         assert not parent.children[1].children
Beispiel #24
0
 def test_should_only_propagate(self):
     with ContextHelper(should_only_propagate=True):
         exporter = MockExporter()
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(),
                                      exporter=exporter)
         with trace.start_span(name="OverAll") as parent:
             client = MockClient()
             client.make_request(2)
             with trace.span("child") as child:
                 client.make_request(2, parent_span=parent)
                 assert OpenCensusSpan.get_current_span() == child
                 client.make_request(2)
         trace.finish()
         exporter.build_tree()
         parent = exporter.root
         assert len(parent.children) == 1
         assert parent.children[0].span_data.name == "child"
         assert not parent.children[0].children
Beispiel #25
0
 def test_span_with_exception(self):
     """Assert that if an exception is raised, the next sibling method is actually a sibling span.
     """
     with ContextHelper():
         exporter = MockExporter()
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler(),
                                      exporter=exporter)
         with trace.span("overall"):
             client = MockClient()
             try:
                 client.raising_exception()
             except:
                 pass
             client.get_foo()
         trace.finish()
         exporter.build_tree()
         parent = exporter.root
         assert len(parent.children) == 3
         assert parent.children[0].span_data.name == "MockClient.__init__"
         assert parent.children[
             1].span_data.name == "MockClient.raising_exception"
         assert parent.children[2].span_data.name == "MockClient.get_foo"
Beispiel #26
0
async def test_span_with_opencensus_merge_span(value):
    with ContextHelper(tracer_to_use=value) as ctx:
        exporter = MockExporter()
        trace = tracer_module.Tracer(sampler=AlwaysOnSampler(),
                                     exporter=exporter)
        with trace.start_span(name="OverAll") as parent:
            client = MockClient()
            await client.merge_span_method()
            await client.no_merge_span_method()
        trace.finish()
        exporter.build_tree()
        parent = exporter.root
        assert len(parent.children) == 3
        assert parent.children[0].span_data.name == "MockClient.__init__"
        assert not parent.children[0].children
        assert parent.children[
            1].span_data.name == "MockClient.merge_span_method"
        assert not parent.children[1].children
        assert parent.children[
            2].span_data.name == "MockClient.no_merge_span_method"
        assert parent.children[2].children[
            0].span_data.name == "MockClient.get_foo"
Beispiel #27
0
    def test_get_parent_span(self):
        with ContextHelper():
            opencensus = sys.modules["opencensus"]
            del sys.modules["opencensus"]

            parent = common.get_parent_span(None)
            assert parent is None

            sys.modules["opencensus"] = opencensus
            parent = common.get_parent_span(None)
            assert parent.span_instance.name == "azure-sdk-for-python-first_parent_span"

            tracer = tracer_module.Tracer(sampler=AlwaysOnSampler())
            parent = common.get_parent_span(None)
            assert parent.span_instance.name == "azure-sdk-for-python-first_parent_span"
            parent.finish()

            some_span = tracer.start_span(name="some_span")
            new_parent = common.get_parent_span(None)
            assert new_parent.span_instance.name == "some_span"
            some_span.finish()

            should_be_old_parent = common.get_parent_span(parent.span_instance)
            assert should_be_old_parent.span_instance == parent.span_instance
Beispiel #28
0
 def test_with_opencensus_imported_but_not_used(self):
     with ContextHelper():
         client = MockClient(assert_current_span=True)
         client.make_request(3)
 def test_passing_kind_in_ctor(self):
     with ContextHelper() as ctx:
         trace = tracer_module.Tracer(sampler=AlwaysOnSampler())
         parent = trace.start_span()
         wrapped_class = OpenCensusSpan(kind=SpanKind.CLIENT)
         assert wrapped_class.kind == SpanKind.CLIENT