diff --git a/tests/test_tracing.py b/tests/test_tracing.py index e1cb7c9..19bf0f1 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -5,7 +5,7 @@ from fastapi import status from httpx import ASGITransport, AsyncClient from opentelemetry import trace -from opentelemetry.sdk.trace import ReadableSpan, TracerProvider +from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from opentelemetry.trace import SpanKind @@ -18,7 +18,7 @@ import pytest -async def _trace_list_decks(monkeypatch: pytest.MonkeyPatch) -> tuple[ReadableSpan, ...]: +async def test_traced_request_records_server_and_db_spans_only(monkeypatch: pytest.MonkeyPatch) -> None: traced_config = dataclasses.replace(settings.api_bootstrapper_config, opentelemetry_log_traces=True) monkeypatch.setattr(Settings, "api_bootstrapper_config", traced_config) exporter = InMemorySpanExporter() @@ -31,26 +31,20 @@ async def _trace_list_decks(monkeypatch: pytest.MonkeyPatch) -> tuple[ReadableSp response = await client.get("/api/decks/") assert response.status_code == status.HTTP_200_OK - return exporter.get_finished_spans() - - -async def test_db_queries_produce_sqlalchemy_spans(monkeypatch: pytest.MonkeyPatch) -> None: + spans = exporter.get_finished_spans() + sqlalchemy_scope = "opentelemetry.instrumentation.sqlalchemy" db_spans = [ span - for span in await _trace_list_decks(monkeypatch) + for span in spans if span.instrumentation_scope is not None - and span.instrumentation_scope.name == "opentelemetry.instrumentation.sqlalchemy" + and span.instrumentation_scope.name == sqlalchemy_scope and span.name.startswith("SELECT") ] assert db_spans assert all(span.parent is not None for span in db_spans) - - -async def test_request_has_no_asgi_event_spans(monkeypatch: pytest.MonkeyPatch) -> None: request_spans = [ span - for span in await _trace_list_decks(monkeypatch) - if span.instrumentation_scope is None - or span.instrumentation_scope.name != "opentelemetry.instrumentation.sqlalchemy" + for span in spans + if span.instrumentation_scope is None or span.instrumentation_scope.name != sqlalchemy_scope ] assert [span.kind for span in request_spans] == [SpanKind.SERVER] diff --git a/uv.lock b/uv.lock index d1971f0..4ea4a91 100644 --- a/uv.lock +++ b/uv.lock @@ -509,14 +509,14 @@ wheels = [ [[package]] name = "lite-bootstrap" -version = "1.9.3" +version = "1.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/64/34c80f72a567aac3ac0fabf4530d7074314019dd07075f09930239f4659f/lite_bootstrap-1.9.3.tar.gz", hash = "sha256:cacca6a721cf9657cd0801dea8fef1e361e8e2ce84c6c4e454f92f0a3d1745f5", size = 1838726, upload-time = "2026-09-27T15:52:10.859Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/71/645aaf63a35ef09615c03d22958ebe7244bbc5349a5e3d3c2e13886def7a/lite_bootstrap-1.13.0.tar.gz", hash = "sha256:ec5e0897fa1855f4911d0b61467b2da954500d3a8ee977eb7e71bc006090d921", size = 1843890, upload-time = "2026-10-16T11:07:05.788Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/42/ad1d5e1d6c29e03b222a99388b5138496ab17061cd428b21cfe76b913886/lite_bootstrap-1.9.3-py3-none-any.whl", hash = "sha256:ac929bf4aefd154a0fc1d00749b59aefb3d10c7f0b333b27b94de7579c12c409", size = 1850322, upload-time = "2026-09-27T15:52:08.291Z" }, + { url = "https://files.pythonhosted.org/packages/ab/8e/1a53f12b0a18a55c98cb54cefef7e1520eadb26ee0261ce6295a8041546a/lite_bootstrap-1.13.0-py3-none-any.whl", hash = "sha256:36ae7d76fed4d5c0b782e199367ab47e4d22ff2d87a578fa84112a9ded89fa22", size = 1853736, upload-time = "2026-10-16T11:07:03.922Z" }, ] [package.optional-dependencies]