def __init__(self, environ={}, tracer_to_use=None, should_only_propagate=None):
     self.orig_tracer = OpenCensusSpan.get_current_tracer()
     self.orig_current_span = OpenCensusSpan.get_current_span()
     self.orig_sdk_context_span = tracing_context.current_span.get()
     self.os_env = mock.patch.dict(os.environ, environ)
     self.tracer_to_use = tracer_to_use
     self.should_only_propagate = should_only_propagate
 def __exit__(self, exc_type, exc_val, exc_tb):
     OpenCensusSpan.set_current_tracer(self.orig_tracer)
     OpenCensusSpan.set_current_span(self.orig_current_span)
     tracing_context.current_span.set(self.orig_sdk_context_span)
     settings.tracing_implementation.unset_value()
     settings.tracing_should_only_propagate.unset_value()
     self.os_env.stop()
 def __init__(self, environ=None, tracer_to_use=None):
     if environ is None:
         environ = {}
     self.orig_tracer = OpenCensusSpan.get_current_tracer()
     self.orig_current_span = OpenCensusSpan.get_current_span()
     self.os_env = mock.patch.dict(os.environ, environ)
     self.tracer_to_use = tracer_to_use
Esempio n. 4
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"
Esempio n. 5
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()
Esempio n. 6
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()
Esempio n. 7
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
Esempio n. 8
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()
 def __enter__(self):
     self.orig_tracer = OpenCensusSpan.get_current_tracer()
     self.orig_current_span = OpenCensusSpan.get_current_span()
     execution_context.clear()
     if self.tracer_to_use is not None:
         settings.tracing_implementation.set_value(self.tracer_to_use)
     self.os_env.start()
     execution_context.clear()
     return self
Esempio n. 10
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"
Esempio n. 11
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
Esempio n. 12
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()
Esempio n. 13
0
 def __enter__(self):
     self.orig_tracer = OpenCensusSpan.get_current_tracer()
     self.orig_current_span = OpenCensusSpan.get_current_span()
     self.orig_sdk_context_span = tracing_context.current_span.get()
     if self.tracer_to_use is not None:
         settings.tracing_implementation.set_value(self.tracer_to_use)
     if self.should_only_propagate is not None:
         settings.tracing_should_only_propagate.set_value(
             self.should_only_propagate)
     self.os_env.start()
     return self
Esempio n. 14
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
Esempio n. 15
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
Esempio n. 16
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
Esempio n. 17
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
Esempio n. 18
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
Esempio n. 19
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
Esempio n. 20
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
Esempio n. 21
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")
 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"
Esempio n. 23
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
 def get_span_from_thread(output):
     current_span = OpenCensusSpan.get_current_span()
     output.append(current_span)
 def __exit__(self, exc_type, exc_val, exc_tb):
     OpenCensusSpan.set_current_tracer(self.orig_tracer)
     OpenCensusSpan.set_current_span(self.orig_current_span)
     settings.tracing_implementation.unset_value()
     self.os_env.stop()
 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