def test_traceresponse_header(self): """Test a traceresponse header is sent when a global propagator is set.""" orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) app = otel_asgi.OpenTelemetryMiddleware(simple_asgi) self.seed_app(app) self.send_default_request() span = self.memory_exporter.get_finished_spans()[-1] self.assertEqual(trace_api.SpanKind.SERVER, span.kind) response_start, response_body, *_ = self.get_all_output() self.assertEqual(response_body["body"], b"*") self.assertEqual(response_start["status"], 200) traceresponse = "00-{0}-{1}-01".format( format_trace_id(span.get_span_context().trace_id), format_span_id(span.get_span_context().span_id), ) self.assertListEqual( response_start["headers"], [ [b"Content-Type", b"text/plain"], [b"traceresponse", f"{traceresponse}".encode()], [b"access-control-expose-headers", b"traceresponse"], ], ) set_global_response_propagator(orig)
def test_response_headers(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.fetch("/") headers = response.headers spans = self.sorted_spans(self.memory_exporter.get_finished_spans()) self.assertEqual(len(spans), 3) server_span = spans[1] self.assertIn("traceresponse", headers) self.assertEqual( headers["access-control-expose-headers"], "traceresponse", ) self.assertEqual( headers["traceresponse"], "00-{0}-{1}-01".format( trace.format_trace_id(server_span.get_span_context().trace_id), trace.format_span_id(server_span.get_span_context().span_id), ), ) self.memory_exporter.clear() set_global_response_propagator(orig)
def test_trace_response(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.client.get("/hello/123") headers = response.headers span_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(span_list), 1) span = span_list[0] self.assertIn("traceresponse", headers) self.assertEqual( headers["access-control-expose-headers"], "traceresponse", ) self.assertEqual( headers["traceresponse"], "00-{0}-{1}-01".format( trace.format_trace_id(span.get_span_context().trace_id), trace.format_span_id(span.get_span_context().span_id), ), ) set_global_response_propagator(orig)
def test_response_headers(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.client.get("/hello/500") self.assertTraceResponseHeaderMatchesSpan( response.headers, self.memory_exporter.get_finished_spans()[0] ) set_global_response_propagator(orig)
def test_trace_response(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.client().simulate_get(path="/hello?q=abc") self.assertTraceResponseHeaderMatchesSpan( response.headers, self.memory_exporter.get_finished_spans()[0]) set_global_response_propagator(orig)
def test_inject(self): span = trace.NonRecordingSpan( trace.SpanContext( trace_id=1, span_id=2, is_remote=False, trace_flags=trace.DEFAULT_TRACE_OPTIONS, trace_state=trace.DEFAULT_TRACE_STATE, ), ) ctx = trace.set_span_in_context(span) prop = TraceResponsePropagator() carrier = {} prop.inject(carrier, ctx) self.assertEqual(carrier["Access-Control-Expose-Headers"], "traceresponse") self.assertEqual( carrier["traceresponse"], "00-00000000000000000000000000000001-0000000000000002-00", )
def test_get_set(self): original = propagators._RESPONSE_PROPAGATOR propagators._RESPONSE_PROPAGATOR = None self.assertIsNone(get_global_response_propagator()) prop = TraceResponsePropagator() set_global_response_propagator(prop) self.assertIs(prop, get_global_response_propagator()) propagators._RESPONSE_PROPAGATOR = original
def test_response_headers(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.fetch("/") spans = self.sorted_spans(self.memory_exporter.get_finished_spans()) self.assertEqual(len(spans), 3) self.assertTraceResponseHeaderMatchesSpan(response.headers, spans[1]) self.memory_exporter.clear() set_global_response_propagator(orig)
def test_trace_response_headers(self): response = Client().get("/span_name/1234/") self.assertNotIn("Server-Timing", response.headers) self.memory_exporter.clear() set_global_response_propagator(TraceResponsePropagator()) response = Client().get("/span_name/1234/") self.assertTraceResponseHeaderMatchesSpan( response.headers, self.memory_exporter.get_finished_spans()[0]) self.memory_exporter.clear()
def test_trace_response(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.client.get("/hello/123") span_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(span_list), 1) self.assertTraceResponseHeaderMatchesSpan( response.headers, span_list[0], ) set_global_response_propagator(orig)
def test_trace_response(self): orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) response = self.client().simulate_get(path="/hello?q=abc") headers = response.headers span = self.memory_exporter.get_finished_spans()[0] self.assertIn("traceresponse", headers) self.assertEqual( headers["access-control-expose-headers"], "traceresponse", ) self.assertEqual( headers["traceresponse"], "00-{0}-{1}-01".format( format_trace_id(span.get_span_context().trace_id), format_span_id(span.get_span_context().span_id), ), ) set_global_response_propagator(orig)
def test_websocket_traceresponse_header(self): """Test a traceresponse header is set for websocket messages""" orig = get_global_response_propagator() set_global_response_propagator(TraceResponsePropagator()) self.scope = { "type": "websocket", "http_version": "1.1", "scheme": "ws", "path": "/", "query_string": b"", "headers": [], "client": ("127.0.0.1", 32767), "server": ("127.0.0.1", 80), } app = otel_asgi.OpenTelemetryMiddleware(simple_asgi) self.seed_app(app) self.send_input({"type": "websocket.connect"}) self.send_input({"type": "websocket.receive", "text": "ping"}) self.send_input({"type": "websocket.disconnect"}) _, socket_send, *_ = self.get_all_output() span = self.memory_exporter.get_finished_spans()[-1] self.assertEqual(trace_api.SpanKind.SERVER, span.kind) traceresponse = "00-{0}-{1}-01".format( format_trace_id(span.get_span_context().trace_id), format_span_id(span.get_span_context().span_id), ) self.assertListEqual( socket_send["headers"], [ [b"traceresponse", f"{traceresponse}".encode()], [b"access-control-expose-headers", b"traceresponse"], ], ) set_global_response_propagator(orig)
async def test_trace_response_headers(self): response = await self.async_client.get("/span_name/1234/") self.assertFalse(response.has_header("Server-Timing")) self.memory_exporter.clear() set_global_response_propagator(TraceResponsePropagator()) response = await self.async_client.get("/span_name/1234/") span = self.memory_exporter.get_finished_spans()[0] self.assertTrue(response.has_header("traceresponse")) self.assertEqual( response["Access-Control-Expose-Headers"], "traceresponse", ) trace_id = format_trace_id(span.get_span_context().trace_id) span_id = format_span_id(span.get_span_context().span_id) self.assertEqual( response["traceresponse"], f"00-{trace_id}-{span_id}-01", ) self.memory_exporter.clear()
async def test_trace_response_headers(self): response = await self.async_client.get("/span_name/1234/") self.assertNotIn("Server-Timing", response.headers) self.memory_exporter.clear() set_global_response_propagator(TraceResponsePropagator()) response = await self.async_client.get("/span_name/1234/") span = self.memory_exporter.get_finished_spans()[0] self.assertIn("traceresponse", response.headers) self.assertEqual( response.headers["Access-Control-Expose-Headers"], "traceresponse", ) self.assertEqual( response.headers["traceresponse"], "00-{0}-{1}-01".format( format_trace_id(span.get_span_context().trace_id), format_span_id(span.get_span_context().span_id), ), ) self.memory_exporter.clear()