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
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_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
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"
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"
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
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"
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
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()
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()
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
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
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 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
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"
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
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()
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
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"
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
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
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 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"
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"
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
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