|
10 | 10 |
|
11 | 11 | import pip |
12 | 12 | import pytest |
13 | | -from fastapi import FastAPI, status |
| 13 | +from fastapi import FastAPI |
14 | 14 | from fastapi.exceptions import HTTPException |
15 | | -from fastapi.responses import JSONResponse, PlainTextResponse |
| 15 | +from fastapi.responses import PlainTextResponse |
16 | 16 | from fastapi.testclient import TestClient |
17 | 17 | from opentelemetry import trace |
18 | 18 | from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter |
@@ -237,34 +237,44 @@ async def handler(handler_data: dict): |
237 | 237 | ], |
238 | 238 | indirect=True, |
239 | 239 | ) |
| 240 | +@pytest.mark.parametrize( |
| 241 | + "server_response", |
| 242 | + [ |
| 243 | + PlainTextResponse("ok"), |
| 244 | + HTTPException(status_code=400, detail="error"), |
| 245 | + ], |
| 246 | +) |
240 | 247 | async def test_with_profile_span( |
241 | 248 | mock_otel_collector: InMemorySpanExporter, |
242 | 249 | mocked_app: FastAPI, |
243 | 250 | set_and_clean_settings_env_vars: Callable[[], None], |
244 | 251 | tracing_settings_in: Callable, |
| 252 | + server_response: PlainTextResponse | HTTPException, |
245 | 253 | ): |
246 | 254 | tracing_settings = TracingSettings() |
247 | 255 |
|
| 256 | + handler_data = dict() |
| 257 | + |
248 | 258 | @with_profiled_span |
249 | | - async def handler(): |
| 259 | + async def handler(handler_data: dict): |
250 | 260 | current_span = trace.get_current_span() |
251 | | - return JSONResponse( |
252 | | - content={ |
253 | | - "trace_id": f"{format(current_span.get_span_context().trace_id, '032x')}" |
254 | | - }, |
| 261 | + handler_data[_OSPARC_TRACE_ID_HEADER] = format( |
| 262 | + current_span.get_span_context().trace_id, "032x" |
255 | 263 | ) |
| 264 | + if isinstance(server_response, HTTPException): |
| 265 | + raise server_response |
| 266 | + return server_response |
256 | 267 |
|
257 | | - mocked_app.get("/")(handler) |
| 268 | + mocked_app.get("/")(partial(handler, handler_data)) |
258 | 269 |
|
259 | 270 | async for _ in get_tracing_instrumentation_lifespan( |
260 | 271 | tracing_settings=tracing_settings, |
261 | 272 | service_name="Mock-OpenTelemetry-Pytest", |
262 | 273 | )(app=mocked_app): |
263 | 274 | initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) |
264 | 275 | client = TestClient(mocked_app) |
265 | | - response = client.get("/") |
266 | | - assert response.status_code == status.HTTP_200_OK |
267 | | - trace_id = response.json().get("trace_id") |
| 276 | + _ = client.get("/") |
| 277 | + trace_id = handler_data.get(_OSPARC_TRACE_ID_HEADER) |
268 | 278 | assert trace_id is not None |
269 | 279 |
|
270 | 280 | spans = mock_otel_collector.get_finished_spans() |
|
0 commit comments