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
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_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_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_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
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_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_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 __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
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_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_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_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_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_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_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_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"
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