Skip to content

Commit 456b386

Browse files
committed
add test in fastapi case
1 parent b417f85 commit 456b386

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

packages/service-library/tests/aiohttp/conftest.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44

55
from collections.abc import Iterator
6-
from unittest.mock import patch
76

87
import pytest
98
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
@@ -15,7 +14,7 @@
1514
def mock_otel_collector(mocker: MockerFixture) -> Iterator[InMemorySpanExporter]:
1615
memory_exporter = InMemorySpanExporter()
1716
span_processor = SimpleSpanProcessor(memory_exporter)
18-
with patch(
17+
mocker.patch(
1918
"servicelib.aiohttp.tracing._create_span_processor", return_value=span_processor
20-
):
21-
yield memory_exporter
19+
)
20+
yield memory_exporter

packages/service-library/tests/fastapi/conftest.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
# pylint: disable=unused-variable
44

55
import socket
6-
from collections.abc import AsyncIterator, Callable
6+
from collections.abc import AsyncIterator, Callable, Iterator
77
from typing import cast
88

99
import arrow
1010
import pytest
1111
from fastapi import APIRouter, FastAPI
1212
from fastapi.params import Query
1313
from httpx import ASGITransport, AsyncClient
14+
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
15+
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
1416
from pydantic.types import PositiveFloat
17+
from pytest_mock import MockerFixture
1518

1619

1720
@pytest.fixture
@@ -55,3 +58,13 @@ def go() -> int:
5558
return cast(int, s.getsockname()[1])
5659

5760
return go
61+
62+
63+
@pytest.fixture
64+
def mock_otel_collector(mocker: MockerFixture) -> Iterator[InMemorySpanExporter]:
65+
memory_exporter = InMemorySpanExporter()
66+
span_processor = SimpleSpanProcessor(memory_exporter)
67+
mocker.patch(
68+
"servicelib.fastapi.tracing._create_span_processor", return_value=span_processor
69+
)
70+
yield memory_exporter

packages/service-library/tests/fastapi/test_tracing.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,16 @@
1010
import pip
1111
import pytest
1212
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
1317
from pydantic import ValidationError
1418
from servicelib.fastapi.tracing import (
1519
get_tracing_instrumentation_lifespan,
20+
initialize_fastapi_app_tracing,
1621
)
22+
from servicelib.tracing import _OSPARC_TRACE_ID_HEADER
1723
from settings_library.tracing import TracingSettings
1824

1925

@@ -167,3 +173,45 @@ async def test_tracing_setup_package_detection(
167173
service_name="Mock-Openetlemetry-Pytest",
168174
)(app=mocked_app):
169175
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

Comments
 (0)