Skip to content

Commit 3840e07

Browse files
committed
use lifespan manager approach
1 parent 2c6afb9 commit 3840e07

File tree

4 files changed

+38
-24
lines changed

4 files changed

+38
-24
lines changed

packages/service-library/src/servicelib/fastapi/tracing.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
HAS_AIOPIKA_INSTRUMENTOR = False
7171

7272

73-
def _startup(
73+
def initialize_tracing(
7474
app: FastAPI, tracing_settings: TracingSettings, service_name: str
7575
) -> None:
7676
if (
@@ -191,7 +191,7 @@ def setup_tracing(
191191
app: FastAPI, tracing_settings: TracingSettings, service_name: str
192192
) -> None:
193193

194-
_startup(app, tracing_settings, service_name)
194+
initialize_tracing(app, tracing_settings, service_name)
195195

196196
def _on_shutdown() -> None:
197197
_shutdown()
@@ -200,15 +200,11 @@ def _on_shutdown() -> None:
200200

201201

202202
async def tracing_instrumentation_lifespan(
203-
*,
204203
app: FastAPI,
205-
state: State,
206-
tracing_settings: TracingSettings,
207-
service_name: str,
208204
) -> AsyncIterator[State]:
205+
# initialize tracing must be called (typically right after the app is created)
206+
assert app # nosec
209207

210-
_startup(app, tracing_settings, service_name)
211-
212-
yield state
208+
yield {}
213209

214210
_shutdown()

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

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import pytest
1212
from fastapi import FastAPI
1313
from pydantic import ValidationError
14-
from servicelib.fastapi.tracing import tracing_instrumentation_lifespan
14+
from servicelib.fastapi.tracing import (
15+
initialize_tracing,
16+
tracing_instrumentation_lifespan,
17+
)
1518
from settings_library.tracing import TracingSettings
1619

1720

@@ -63,17 +66,21 @@ async def test_valid_tracing_settings(
6366
uninstrument_opentelemetry: Iterator[None],
6467
):
6568
tracing_settings = TracingSettings()
66-
async for state in tracing_instrumentation_lifespan(
69+
initialize_tracing(
6770
app=mocked_app,
68-
state={},
6971
tracing_settings=tracing_settings,
7072
service_name="Mock-Openetlemetry-Pytest",
73+
)
74+
async for state in tracing_instrumentation_lifespan(
75+
app=mocked_app,
7176
):
72-
async for _ in tracing_instrumentation_lifespan(
77+
initialize_tracing(
7378
app=mocked_app,
74-
state=state,
7579
tracing_settings=tracing_settings,
7680
service_name="Mock-Openetlemetry-Pytest",
81+
)
82+
async for _ in tracing_instrumentation_lifespan(
83+
app=mocked_app,
7784
):
7885
pass
7986

@@ -103,11 +110,14 @@ async def test_invalid_tracing_settings(
103110
app = mocked_app
104111
with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012
105112
tracing_settings = TracingSettings()
106-
async for _ in tracing_instrumentation_lifespan(
113+
initialize_tracing(
107114
app=app,
108-
state={},
109115
tracing_settings=tracing_settings,
110116
service_name="Mock-Openetlemetry-Pytest",
117+
)
118+
119+
async for _ in tracing_instrumentation_lifespan(
120+
app=app,
111121
):
112122
pass
113123

@@ -162,17 +172,21 @@ async def test_tracing_setup_package_detection(
162172
importlib.import_module(package_name)
163173
tracing_settings = TracingSettings()
164174
# Use tracing_instrumentation_lifespan instead of _startup
165-
async for _ in tracing_instrumentation_lifespan(
175+
initialize_tracing(
166176
app=mocked_app,
167-
state={},
168177
tracing_settings=tracing_settings,
169178
service_name="Mock-Openetlemetry-Pytest",
179+
)
180+
async for _ in tracing_instrumentation_lifespan(
181+
app=mocked_app,
170182
):
171183
# idempotency: call again
172-
async for _ in tracing_instrumentation_lifespan(
184+
initialize_tracing(
173185
app=mocked_app,
174-
state={},
175186
tracing_settings=tracing_settings,
176187
service_name="Mock-Openetlemetry-Pytest",
188+
)
189+
async for _ in tracing_instrumentation_lifespan(
190+
app=mocked_app,
177191
):
178192
pass

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
)
55
from servicelib.fastapi.openapi import override_fastapi_openapi_method
66
from servicelib.fastapi.profiler import initialize_profiler
7-
from servicelib.fastapi.tracing import setup_tracing
7+
from servicelib.fastapi.tracing import initialize_tracing
88

99
from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY
1010
from ..api.frontend import initialize_frontend
@@ -25,7 +25,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI:
2525
"/doc" if app_settings.DYNAMIC_SCHEDULER_SWAGGER_API_DOC_ENABLED else None
2626
),
2727
redoc_url=None,
28-
lifespan=events.create_app_lifespan(),
28+
lifespan=events.create_app_lifespan(settings=app_settings),
2929
)
3030
override_fastapi_openapi_method(app)
3131

@@ -34,7 +34,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI:
3434
assert app.state.settings.API_VERSION == API_VERSION # nosec
3535

3636
if app_settings.DYNAMIC_SCHEDULER_TRACING:
37-
setup_tracing(app, app_settings.DYNAMIC_SCHEDULER_TRACING, APP_NAME)
37+
initialize_tracing(app, app_settings.DYNAMIC_SCHEDULER_TRACING, APP_NAME)
3838

3939
initialize_rest_api(app)
4040

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from servicelib.fastapi.postgres_lifespan import (
1414
create_postgres_database_input_state,
1515
)
16+
from servicelib.fastapi.tracing import tracing_instrumentation_lifespan
1617

1718
from .._meta import APP_FINISHED_BANNER_MSG, APP_STARTED_BANNER_MSG
1819
from ..api.rpc.routes import rpc_api_routes_lifespan
@@ -50,10 +51,13 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]:
5051
}
5152

5253

53-
def create_app_lifespan() -> LifespanManager:
54+
def create_app_lifespan(settings: ApplicationSettings) -> LifespanManager:
5455
app_lifespan = LifespanManager()
5556
app_lifespan.add(_settings_lifespan)
5657

58+
if settings.DYNAMIC_SCHEDULER_TRACING:
59+
app_lifespan.add(tracing_instrumentation_lifespan)
60+
5761
app_lifespan.include(repository_lifespan_manager)
5862
app_lifespan.add(director_v2_lifespan)
5963
app_lifespan.add(director_v0_lifespan)

0 commit comments

Comments
 (0)