|
10 | 10 | import pip |
11 | 11 | import pytest |
12 | 12 | from fastapi import FastAPI |
| 13 | +from fastapi.exceptions import HTTPException |
| 14 | +from fastapi.responses import PlainTextResponse |
| 15 | +from fastapi.testclient import TestClient |
| 16 | +from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter |
13 | 17 | from pydantic import ValidationError |
14 | 18 | from servicelib.fastapi.tracing import ( |
15 | 19 | get_tracing_instrumentation_lifespan, |
| 20 | + initialize_fastapi_app_tracing, |
16 | 21 | ) |
| 22 | +from servicelib.tracing import _OSPARC_TRACE_ID_HEADER |
17 | 23 | from settings_library.tracing import TracingSettings |
18 | 24 |
|
19 | 25 |
|
@@ -167,3 +173,45 @@ async def test_tracing_setup_package_detection( |
167 | 173 | service_name="Mock-Openetlemetry-Pytest", |
168 | 174 | )(app=mocked_app): |
169 | 175 | pass |
| 176 | + |
| 177 | + |
| 178 | +@pytest.mark.parametrize( |
| 179 | + "tracing_settings_in", |
| 180 | + [ |
| 181 | + ("http://opentelemetry-collector", 4318), |
| 182 | + ], |
| 183 | + indirect=True, |
| 184 | +) |
| 185 | +@pytest.mark.parametrize( |
| 186 | + "server_response", |
| 187 | + [ |
| 188 | + PlainTextResponse("ok"), |
| 189 | + HTTPException(status_code=400, detail="error"), |
| 190 | + ], |
| 191 | +) |
| 192 | +async def test_trace_id_in_response_header( |
| 193 | + mock_otel_collector: InMemorySpanExporter, |
| 194 | + mocked_app: FastAPI, |
| 195 | + set_and_clean_settings_env_vars: Callable, |
| 196 | + tracing_settings_in: Callable, |
| 197 | + uninstrument_opentelemetry: Iterator[None], |
| 198 | + server_response: PlainTextResponse | HTTPException, |
| 199 | +) -> None: |
| 200 | + tracing_settings = TracingSettings() |
| 201 | + |
| 202 | + @mocked_app.get("/") |
| 203 | + async def handler(): |
| 204 | + if isinstance(server_response, HTTPException): |
| 205 | + raise server_response |
| 206 | + return server_response |
| 207 | + |
| 208 | + async for _ in get_tracing_instrumentation_lifespan( |
| 209 | + tracing_settings=tracing_settings, |
| 210 | + service_name="Mock-OpenTelemetry-Pytest", |
| 211 | + )(app=mocked_app): |
| 212 | + initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) |
| 213 | + client = TestClient(mocked_app) |
| 214 | + response = client.get("/") |
| 215 | + assert _OSPARC_TRACE_ID_HEADER in response.headers |
| 216 | + trace_id = response.headers[_OSPARC_TRACE_ID_HEADER] |
| 217 | + assert len(trace_id) == 32 # Ensure trace ID is a 32-character hex string |
0 commit comments