Skip to content

Commit c5e4c1b

Browse files
committed
add getter for tracing instrumentation lifespan
1 parent 90c14ea commit c5e4c1b

File tree

4 files changed

+42
-53
lines changed

4 files changed

+42
-53
lines changed

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

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

7272

73-
def initialize_tracing(
74-
app: FastAPI, tracing_settings: TracingSettings, service_name: str
75-
) -> None:
73+
def _startup(tracing_settings: TracingSettings, service_name: str) -> None:
7674
if (
7775
not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT
7876
and not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_PORT
@@ -102,8 +100,6 @@ def initialize_tracing(
102100
otlp_exporter = OTLPSpanExporterHTTP(endpoint=tracing_destination)
103101
span_processor = BatchSpanProcessor(otlp_exporter)
104102
global_tracer_provider.add_span_processor(span_processor)
105-
# Instrument FastAPI
106-
FastAPIInstrumentor().instrument_app(app)
107103

108104
if HAS_AIOPG:
109105
with log_context(
@@ -191,20 +187,31 @@ def setup_tracing(
191187
app: FastAPI, tracing_settings: TracingSettings, service_name: str
192188
) -> None:
193189

194-
initialize_tracing(app, tracing_settings, service_name)
190+
_startup(tracing_settings=tracing_settings, service_name=service_name)
191+
192+
def _on_startup() -> None:
193+
FastAPIInstrumentor().instrument_app(app)
195194

196195
def _on_shutdown() -> None:
197196
_shutdown()
198197

198+
app.add_event_handler("startup", _on_startup)
199199
app.add_event_handler("shutdown", _on_shutdown)
200200

201201

202-
async def tracing_instrumentation_lifespan(
203-
app: FastAPI,
204-
) -> AsyncIterator[State]:
205-
# initialize tracing must be called (typically right after the app is created)
206-
assert app # nosec
202+
def get_tracing_instrumentation_lifespan(
203+
tracing_settings: TracingSettings, service_name: str
204+
):
205+
206+
_startup(tracing_settings=tracing_settings, service_name=service_name)
207207

208-
yield {}
208+
async def tracing_instrumentation_lifespan(
209+
app: FastAPI,
210+
) -> AsyncIterator[State]:
211+
FastAPIInstrumentor().instrument_app(app)
212+
213+
yield {}
214+
215+
_shutdown()
209216

210-
_shutdown()
217+
return tracing_instrumentation_lifespan

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

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
from fastapi import FastAPI
1313
from pydantic import ValidationError
1414
from servicelib.fastapi.tracing import (
15-
initialize_tracing,
16-
tracing_instrumentation_lifespan,
15+
get_tracing_instrumentation_lifespan,
1716
)
1817
from settings_library.tracing import TracingSettings
1918

@@ -66,22 +65,14 @@ async def test_valid_tracing_settings(
6665
uninstrument_opentelemetry: Iterator[None],
6766
):
6867
tracing_settings = TracingSettings()
69-
initialize_tracing(
70-
app=mocked_app,
68+
async for _ in get_tracing_instrumentation_lifespan(
7169
tracing_settings=tracing_settings,
7270
service_name="Mock-Openetlemetry-Pytest",
73-
)
74-
async for state in tracing_instrumentation_lifespan(
75-
app=mocked_app,
76-
):
77-
initialize_tracing(
78-
app=mocked_app,
71+
)(app=mocked_app):
72+
async for _ in get_tracing_instrumentation_lifespan(
7973
tracing_settings=tracing_settings,
8074
service_name="Mock-Openetlemetry-Pytest",
81-
)
82-
async for _ in tracing_instrumentation_lifespan(
83-
app=mocked_app,
84-
):
75+
)(app=mocked_app):
8576
pass
8677

8778

@@ -110,15 +101,10 @@ async def test_invalid_tracing_settings(
110101
app = mocked_app
111102
with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012
112103
tracing_settings = TracingSettings()
113-
initialize_tracing(
114-
app=app,
104+
async for _ in get_tracing_instrumentation_lifespan(
115105
tracing_settings=tracing_settings,
116106
service_name="Mock-Openetlemetry-Pytest",
117-
)
118-
119-
async for _ in tracing_instrumentation_lifespan(
120-
app=app,
121-
):
107+
)(app=app):
122108
pass
123109

124110

@@ -171,22 +157,13 @@ async def test_tracing_setup_package_detection(
171157
package_name = manage_package
172158
importlib.import_module(package_name)
173159
tracing_settings = TracingSettings()
174-
# Use tracing_instrumentation_lifespan instead of _startup
175-
initialize_tracing(
176-
app=mocked_app,
160+
async for _ in get_tracing_instrumentation_lifespan(
177161
tracing_settings=tracing_settings,
178162
service_name="Mock-Openetlemetry-Pytest",
179-
)
180-
async for _ in tracing_instrumentation_lifespan(
181-
app=mocked_app,
182-
):
183-
# idempotency: call again
184-
initialize_tracing(
185-
app=mocked_app,
163+
)(app=mocked_app):
164+
# idempotency check
165+
async for _ in get_tracing_instrumentation_lifespan(
186166
tracing_settings=tracing_settings,
187167
service_name="Mock-Openetlemetry-Pytest",
188-
)
189-
async for _ in tracing_instrumentation_lifespan(
190-
app=mocked_app,
191-
):
168+
)(app=mocked_app):
192169
pass

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

Lines changed: 2 additions & 2 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 initialize_tracing
7+
from servicelib.fastapi.tracing import _startup
88

99
from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY
1010
from ..api.frontend import initialize_frontend
@@ -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-
initialize_tracing(app, app_settings.DYNAMIC_SCHEDULER_TRACING, APP_NAME)
37+
_startup(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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
from servicelib.fastapi.postgres_lifespan import (
1414
create_postgres_database_input_state,
1515
)
16-
from servicelib.fastapi.tracing import tracing_instrumentation_lifespan
16+
from servicelib.fastapi.tracing import get_tracing_instrumentation_lifespan
1717

18-
from .._meta import APP_FINISHED_BANNER_MSG, APP_STARTED_BANNER_MSG
18+
from .._meta import APP_FINISHED_BANNER_MSG, APP_NAME, APP_STARTED_BANNER_MSG
1919
from ..api.rpc.routes import rpc_api_routes_lifespan
2020
from ..repository.events import repository_lifespan_manager
2121
from ..services.catalog import catalog_lifespan
@@ -56,7 +56,12 @@ def create_app_lifespan(settings: ApplicationSettings) -> LifespanManager:
5656
app_lifespan.add(_settings_lifespan)
5757

5858
if settings.DYNAMIC_SCHEDULER_TRACING:
59-
app_lifespan.add(tracing_instrumentation_lifespan)
59+
app_lifespan.add(
60+
get_tracing_instrumentation_lifespan(
61+
tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING,
62+
service_name=APP_NAME,
63+
)
64+
)
6065

6166
app_lifespan.include(repository_lifespan_manager)
6267
app_lifespan.add(director_v2_lifespan)

0 commit comments

Comments
 (0)