From 7ea10dfb8b6f1cf28ce92207f863dc539bcd89c9 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:14:33 +0200 Subject: [PATCH 01/62] add TRACING_SAMPLING_PROBABILITY to TracingSettings --- packages/settings-library/src/settings_library/tracing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/settings-library/src/settings_library/tracing.py b/packages/settings-library/src/settings_library/tracing.py index c8263dd8be24..f2d9ab5da554 100644 --- a/packages/settings-library/src/settings_library/tracing.py +++ b/packages/settings-library/src/settings_library/tracing.py @@ -15,3 +15,7 @@ class TracingSettings(BaseCustomSettings): TRACING_OPENTELEMETRY_COLLECTOR_PORT: Annotated[ RegisteredPortInt, Field(description="Opentelemetry compatible collector port") ] + TRACING_SAMPLING_PROBABILITY: Annotated[ + float, + Field(description="Probability of sampling traces (0.0 - 1.0)", ge=0.0, le=1.0), + ] From 246ed0d868f7f6519b0a33bd7e0db523a9524e6d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:18:17 +0200 Subject: [PATCH 02/62] replace collector sampling strategy --- .env-devel | 2 +- services/director/tests/unit/test_core_settings.py | 2 -- services/docker-compose-ops.yml | 1 - services/docker-compose.yml | 2 +- services/opentelemetry-collector-config.yaml | 2 +- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.env-devel b/.env-devel index 0e27dfde6f1a..8e7045e63e1a 100644 --- a/.env-devel +++ b/.env-devel @@ -376,7 +376,7 @@ TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE=2 TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT=http://opentelemetry-collector TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT=http://jaeger:4318 TRACING_OPENTELEMETRY_COLLECTOR_PORT=4318 -TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE=100 +TRACING_SAMPLING_PROBABILITY=100 TRAEFIK_SIMCORE_ZONE=internal_simcore_stack TRASH_RETENTION_DAYS=7 TWILIO_ACCOUNT_SID=DUMMY diff --git a/services/director/tests/unit/test_core_settings.py b/services/director/tests/unit/test_core_settings.py index 122d6baea9af..ec9c2f4460cf 100644 --- a/services/director/tests/unit/test_core_settings.py +++ b/services/director/tests/unit/test_core_settings.py @@ -100,7 +100,6 @@ def test_docker_container_env_sample(monkeypatch: pytest.MonkeyPatch): SWARM_STACK_NAME=master-simcore TERM=xterm TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT=http://jaeger:4318 - TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE=50 TRAEFIK_SIMCORE_ZONE=master_internal_simcore_stack VIRTUAL_ENV=/home/scu/.venv LOG_FORMAT_LOCAL_DEV_ENABLED=1 @@ -150,7 +149,6 @@ def test_docker_compose_environment_sample( "STORAGE_ENDPOINT": "master_storage:8080", "SWARM_STACK_NAME": "master-simcore", "TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT": "http://jaeger:4318", - "TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE": "50", "TRAEFIK_SIMCORE_ZONE": "master_internal_simcore_stack", }, ) diff --git a/services/docker-compose-ops.yml b/services/docker-compose-ops.yml index d6a336c9dacc..8da9002dbf40 100644 --- a/services/docker-compose-ops.yml +++ b/services/docker-compose-ops.yml @@ -117,7 +117,6 @@ services: - interactive_services_subnet environment: TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE: ${TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE} - TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE: ${TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE} TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT: ${TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT} volumes: minio_data: diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 2e46e7ccf8b3..41b521c2030c 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -10,7 +10,7 @@ x-tracing-open-telemetry: &tracing_open_telemetry_environs TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT: ${TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT} TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE: ${TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE} TRACING_OPENTELEMETRY_COLLECTOR_PORT: ${TRACING_OPENTELEMETRY_COLLECTOR_PORT} - TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE: ${TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE} + TRACING_SAMPLING_PROBABILITY: ${TRACING_SAMPLING_PROBABILITY} x-webserver-diagnostics: &webserver_diagnostics_environs DIAGNOSTICS_HEALTHCHECK_ENABLED: ${DIAGNOSTICS_HEALTHCHECK_ENABLED} diff --git a/services/opentelemetry-collector-config.yaml b/services/opentelemetry-collector-config.yaml index 7386666956e4..4cd5d760dd97 100644 --- a/services/opentelemetry-collector-config.yaml +++ b/services/opentelemetry-collector-config.yaml @@ -19,7 +19,7 @@ processors: timeout: 5s send_batch_size: ${TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE} probabilistic_sampler: - sampling_percentage: ${TRACING_OPENTELEMETRY_COLLECTOR_SAMPLING_PERCENTAGE} + sampling_percentage: 100 filter/drop_healthcheck: error_mode: ignore traces: From 1fc5a308a3abc84423a92c17ed2c23633d585d4f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:22:06 +0200 Subject: [PATCH 03/62] add sampling probability to traefik --- services/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 41b521c2030c..4b9fb1ab0ea9 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -1502,6 +1502,7 @@ services: - "--tracing.addinternals" - "--tracing.otlp=true" - "--tracing.otlp.http=true" + - "--tracing.sampleRate=${TRACING_SAMPLING_PROBABILITY}" healthcheck: # NOTE: this healthcheck to check if traefik is up and running must be run on the ping entrypoint defined in command! test: traefik healthcheck --ping --ping.entryPoint=ping --entryPoints.ping.address=:9082 From 29c5cbc8d93750c78df57d6ebaf35b7140ab4d77 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:49:48 +0200 Subject: [PATCH 04/62] improve test --- .../tests/fastapi/test_tracing.py | 83 ++++++++++++++++--- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 148f4e43776d..4b6b37a6f6e4 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -55,18 +55,24 @@ def set_and_clean_settings_env_vars( monkeypatch.setenv( "TRACING_OPENTELEMETRY_COLLECTOR_PORT", f"{tracing_settings_in[1]}" ) + sampling_probability_mocked = False + if tracing_settings_in[2]: + sampling_probability_mocked = True + monkeypatch.setenv("TRACING_SAMPLING_PROBABILITY", f"{tracing_settings_in[2]}") yield if endpoint_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT") if port_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_PORT") + if sampling_probability_mocked: + monkeypatch.delenv("TRACING_SAMPLING_PROBABILITY") @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 4318), - ("http://opentelemetry-collector", "4318"), + ("http://opentelemetry-collector", 4318, 1.0), + ("http://opentelemetry-collector", "4318", 1.0), ], indirect=True, ) @@ -91,15 +97,16 @@ async def test_valid_tracing_settings( @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 80), - ("http://opentelemetry-collector", 1238712936), - ("opentelemetry-collector", 4318), - ("httsdasp://ot@##el-collector", 4318), - (" !@#$%^&*()[]{};:,<>?\\|`~+=/'\"", 4318), + ("http://opentelemetry-collector", 80, 0.5), + ("http://opentelemetry-collector", 1238712936, 0.5), + ("opentelemetry-collector", 4318, 0.5), + ("httsdasp://ot@##el-collector", 4318, 0.5), + (" !@#$%^&*()[]{};:,<>?\\|`~+=/'\"", 4318, 0.5), # The following exceeds max DNS name length ( "".join(random.choice(string.ascii_letters) for _ in range(300)), "1238712936", + 0.5, ), # noqa: S311 ], indirect=True, @@ -143,14 +150,14 @@ def manage_package(request): "tracing_settings_in, manage_package", [ ( - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ( "opentelemetry-instrumentation-botocore", "opentelemetry.instrumentation.botocore", ), ), ( - ("http://opentelemetry-collector", "4318"), + ("http://opentelemetry-collector", "4318", 1.0), ( "opentelemetry-instrumentation-aiopg", "opentelemetry.instrumentation.aiopg", @@ -184,7 +191,7 @@ async def test_tracing_setup_package_detection( @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ], indirect=True, ) @@ -233,7 +240,7 @@ async def handler(handler_data: dict): @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ], indirect=True, ) @@ -284,3 +291,57 @@ async def handler(handler_data: dict): for span in spans if span.context is not None and span.attributes is not None ) + + +@pytest.mark.parametrize( + "tracing_settings_in", + [ + ("http://opentelemetry-collector", 4318, 0.05), + ], + indirect=True, +) +async def test_tracing_sampling_probability_effective( + mock_otel_collector: InMemorySpanExporter, + mocked_app: FastAPI, + set_and_clean_settings_env_vars: Callable[[], None], + tracing_settings_in: Callable[[], dict[str, Any]], +): + """ + This test checks that the TRACING_SAMPLING_PROBABILITY setting in TracingSettings + is effective by sending 1000 requests and verifying that the number of collected traces + is close to 0.05 * 1000 (with some tolerance). + """ + n_requests = 1000 + tolerance_probability = 0.5 + + tracing_settings = TracingSettings() + + async def handler(): + return PlainTextResponse("ok") + + mocked_app.get("/")(handler) + + async for _ in get_tracing_instrumentation_lifespan( + tracing_settings=tracing_settings, + service_name="Mock-OpenTelemetry-Pytest", + )(app=mocked_app): + initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) + client = TestClient(mocked_app) + for _ in range(n_requests): + client.get("/") + spans = mock_otel_collector.get_finished_spans() + trace_ids = set() + for span in spans: + if span.context is not None: + trace_ids.add(span.context.trace_id) + num_traces = len(trace_ids) + expected_num_traces = int( + tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests + ) + # Allow a 50% tolerance due to randomness + tolerance = int(tolerance_probability * expected_num_traces) + assert ( + expected_num_traces - tolerance + <= num_traces + <= expected_num_traces + tolerance + ), f"Expected roughly {expected_num_traces} distinct trace ids, got {num_traces}" From 8e3a187ab848f6f047f5e998185e105678875196 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 09:53:25 +0200 Subject: [PATCH 05/62] add sampling based strategy to fast api tracing instrumentation --- packages/service-library/src/servicelib/fastapi/tracing.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 50c8aeab1d7d..d25b37a22782 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -15,6 +15,7 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased from settings_library.tracing import TracingSettings from starlette.middleware.base import BaseHTTPMiddleware from yarl import URL @@ -87,7 +88,11 @@ def _startup(tracing_settings: TracingSettings, service_name: str) -> None: return # Set up the tracer provider resource = Resource(attributes={"service.name": service_name}) - trace.set_tracer_provider(TracerProvider(resource=resource)) + sampler = ParentBased( + root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) + ) + trace_provider = TracerProvider(resource=resource, sampler=sampler) + trace.set_tracer_provider(trace_provider) global_tracer_provider = trace.get_tracer_provider() assert isinstance(global_tracer_provider, TracerProvider) # nosec From c3a7962543f8eb843c080c7c24a9b86529fbc4cd Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 10:21:03 +0200 Subject: [PATCH 06/62] add test and sampling strategy to aiohttp tracing instrumentation --- .../src/servicelib/aiohttp/tracing.py | 7 +- .../tests/aiohttp/test_tracing.py | 65 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 0d8fac83625e..9cb03ca0c3bb 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -17,6 +17,7 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased from settings_library.tracing import TracingSettings from yarl import URL @@ -95,7 +96,11 @@ def _startup( ) raise RuntimeError(msg) resource = Resource(attributes={"service.name": service_name}) - trace.set_tracer_provider(TracerProvider(resource=resource)) + sampler = ParentBased( + root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) + ) + tracer_provider = TracerProvider(resource=resource, sampler=sampler) + trace.set_tracer_provider(tracer_provider=tracer_provider) tracer_provider: trace.TracerProvider = trace.get_tracer_provider() tracing_destination: str = ( diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index c9fb30d7de85..b959fd635584 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -2,6 +2,7 @@ # pylint: disable=unused-argument # pylint: disable=unused-variable +import asyncio import importlib from collections.abc import Callable from functools import partial @@ -40,11 +41,17 @@ def set_and_clean_settings_env_vars( monkeypatch.setenv( "TRACING_OPENTELEMETRY_COLLECTOR_PORT", f"{tracing_settings_in[1]}" ) + sampling_probability_mocked = False + if tracing_settings_in[2]: + sampling_probability_mocked = True + monkeypatch.setenv("TRACING_SAMPLING_PROBABILITY", tracing_settings_in[2]) yield if endpoint_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT") if port_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_PORT") + if sampling_probability_mocked: + monkeypatch.delenv("TRACING_SAMPLING_PROBABILITY") @pytest.mark.parametrize( @@ -201,3 +208,61 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: assert ( trace_id == handler_data[_OSPARC_TRACE_ID_HEADER] ) # Ensure trace IDs match + + +@pytest.mark.parametrize( + "tracing_settings_in", + [ + ("http://opentelemetry-collector", 4318, 0.05), + ], + indirect=True, +) +async def test_tracing_sampling_probability_effective( + mock_otel_collector: InMemorySpanExporter, + aiohttp_client: Callable, + set_and_clean_settings_env_vars: Callable[[], None], + tracing_settings_in, +): + """ + This test checks that the TRACING_SAMPLING_PROBABILITY setting in TracingSettings + is effective by sending 1000 requests and verifying that the number of collected traces + is close to 0.05 * 1000 (with some tolerance). + """ + n_requests = 1000 + tolerance_probability = 0.5 + + app = web.Application() + service_name = "simcore_service_webserver" + tracing_settings = TracingSettings() + + async def handler(request: web.Request) -> web.Response: + return web.Response(text="ok") + + app.router.add_get("/", handler) + + async for _ in get_tracing_lifespan( + app=app, + service_name=service_name, + tracing_settings=tracing_settings, + )(app): + client = await aiohttp_client(app) + + async def make_request(): + await client.get("/") + + await asyncio.gather(*(make_request() for _ in range(n_requests))) + spans = mock_otel_collector.get_finished_spans() + trace_ids = set() + for span in spans: + if span.context is not None: + trace_ids.add(span.context.trace_id) + num_traces = len(trace_ids) + expected_num_traces = int( + tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests + ) + tolerance = int(tolerance_probability * expected_num_traces) + assert ( + expected_num_traces - tolerance + <= num_traces + <= expected_num_traces + tolerance + ), f"Expected roughly {expected_num_traces} distinct trace ids, got {num_traces}" From 5c2ce1bf78fe51423c623e2bbf480f573c15c423 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 10:25:59 +0200 Subject: [PATCH 07/62] clean up tests --- .../service-library/tests/aiohttp/test_tracing.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index b959fd635584..2a50d4758fda 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -57,7 +57,7 @@ def set_and_clean_settings_env_vars( @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ], indirect=True, ) @@ -79,9 +79,9 @@ async def test_valid_tracing_settings( @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 80), - ("opentelemetry-collector", 4318), - ("httsdasp://ot@##el-collector", 4318), + ("http://opentelemetry-collector", 80, 1.0), + ("opentelemetry-collector", 4318, 1.0), + ("httsdasp://ot@##el-collector", 4318, 1.0), ], indirect=True, ) @@ -118,14 +118,14 @@ def manage_package(request): "tracing_settings_in, manage_package", [ ( - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ( "opentelemetry-instrumentation-botocore", "opentelemetry.instrumentation.botocore", ), ), ( - ("http://opentelemetry-collector", "4318"), + ("http://opentelemetry-collector", "4318", 1.0), ( "opentelemetry-instrumentation-aiopg", "opentelemetry.instrumentation.aiopg", @@ -164,7 +164,7 @@ async def test_tracing_setup_package_detection( @pytest.mark.parametrize( "tracing_settings_in", [ - ("http://opentelemetry-collector", 4318), + ("http://opentelemetry-collector", 4318, 1.0), ], indirect=True, ) From bbff3e4c15345257f5c3994655ed59d3999d9ed0 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 25 Sep 2025 10:37:53 +0200 Subject: [PATCH 08/62] correct env var value --- .env-devel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env-devel b/.env-devel index 8e7045e63e1a..e2577fd77489 100644 --- a/.env-devel +++ b/.env-devel @@ -376,7 +376,7 @@ TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE=2 TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT=http://opentelemetry-collector TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT=http://jaeger:4318 TRACING_OPENTELEMETRY_COLLECTOR_PORT=4318 -TRACING_SAMPLING_PROBABILITY=100 +TRACING_SAMPLING_PROBABILITY=1.0 TRAEFIK_SIMCORE_ZONE=internal_simcore_stack TRASH_RETENTION_DAYS=7 TWILIO_ACCOUNT_SID=DUMMY From cf095126e5eb83c22755e2cfb0d78a2a96c10b12 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 10:18:03 +0200 Subject: [PATCH 09/62] create TracingData dataclass for carrying around tracing data --- .../src/servicelib/fastapi/tracing.py | 89 +++++++++++-------- .../service-library/src/servicelib/tracing.py | 24 ++++- .../tests/fastapi/test_tracing.py | 35 ++++++-- .../core/application.py | 15 +++- .../core/events.py | 10 ++- 5 files changed, 124 insertions(+), 49 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index d25b37a22782..ff39185061b9 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -6,22 +6,19 @@ from fastapi import FastAPI, Request from fastapi_lifespan_manager import State from httpx import AsyncClient, Client -from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( OTLPSpanExporter as OTLPSpanExporterHTTP, ) from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor -from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased from settings_library.tracing import TracingSettings from starlette.middleware.base import BaseHTTPMiddleware from yarl import URL from ..logging_utils import log_context -from ..tracing import get_trace_id_header +from ..tracing import TracingData, get_trace_id_header _logger = logging.getLogger(__name__) @@ -79,22 +76,14 @@ def _create_span_processor(tracing_destination: str) -> SpanProcessor: return BatchSpanProcessor(otlp_exporter) -def _startup(tracing_settings: TracingSettings, service_name: str) -> None: +def _startup(tracing_settings: TracingSettings, tracing_data: TracingData) -> None: if ( not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT and not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_PORT ): _logger.warning("Skipping opentelemetry tracing setup") return - # Set up the tracer provider - resource = Resource(attributes={"service.name": service_name}) - sampler = ParentBased( - root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) - ) - trace_provider = TracerProvider(resource=resource, sampler=sampler) - trace.set_tracer_provider(trace_provider) - global_tracer_provider = trace.get_tracer_provider() - assert isinstance(global_tracer_provider, TracerProvider) # nosec + assert isinstance(tracing_data.tracer_provider, TracerProvider) # nosec opentelemetry_collector_endpoint: str = ( f"{tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT}" @@ -106,11 +95,11 @@ def _startup(tracing_settings: TracingSettings, service_name: str) -> None: _logger.info( "Trying to connect service %s to opentelemetry tracing collector at %s.", - service_name, + tracing_data.service_name, tracing_destination, ) # Add the span processor to the tracer provider - global_tracer_provider.add_span_processor( + tracing_data.tracer_provider.add_span_processor( _create_span_processor(tracing_destination) ) @@ -120,75 +109,95 @@ def _startup(tracing_settings: TracingSettings, service_name: str) -> None: logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AiopgInstrumentor().instrument() + AiopgInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) if HAS_AIOPIKA_INSTRUMENTOR: with log_context( _logger, logging.INFO, msg="Attempting to add aio_pika opentelemetry autoinstrumentation...", ): - AioPikaInstrumentor().instrument() + AioPikaInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_ASYNCPG: with log_context( _logger, logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AsyncPGInstrumentor().instrument() + AsyncPGInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_REDIS: with log_context( _logger, logging.INFO, msg="Attempting to add redis opentelemetry autoinstrumentation...", ): - RedisInstrumentor().instrument() + RedisInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) if HAS_BOTOCORE: with log_context( _logger, logging.INFO, msg="Attempting to add botocore opentelemetry autoinstrumentation...", ): - BotocoreInstrumentor().instrument() + BotocoreInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_REQUESTS: with log_context( _logger, logging.INFO, msg="Attempting to add requests opentelemetry autoinstrumentation...", ): - RequestsInstrumentor().instrument() + RequestsInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) -def _shutdown() -> None: +def _shutdown(tracing_data: TracingData) -> None: """Uninstruments all opentelemetry instrumentors that were instrumented.""" - FastAPIInstrumentor().uninstrument() + FastAPIInstrumentor().uninstrument(tracer_provider=tracing_data.tracer_provider) if HAS_AIOPG: try: - AiopgInstrumentor().uninstrument() + AiopgInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AiopgInstrumentor") if HAS_AIOPIKA_INSTRUMENTOR: try: - AioPikaInstrumentor().uninstrument() + AioPikaInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AioPikaInstrumentor") if HAS_ASYNCPG: try: - AsyncPGInstrumentor().uninstrument() + AsyncPGInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AsyncPGInstrumentor") if HAS_REDIS: try: - RedisInstrumentor().uninstrument() + RedisInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument RedisInstrumentor") if HAS_BOTOCORE: try: - BotocoreInstrumentor().uninstrument() + BotocoreInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument BotocoreInstrumentor") if HAS_REQUESTS: try: - RequestsInstrumentor().uninstrument() + RequestsInstrumentor().uninstrument( + tracer_provider=tracing_data.tracer_provider + ) except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument RequestsInstrumentor") @@ -209,19 +218,24 @@ def setup_tracing( app: FastAPI, tracing_settings: TracingSettings, service_name: str ) -> None: # NOTE: This does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - _startup(tracing_settings=tracing_settings, service_name=service_name) + assert getattr(app.state, "tracing_data", None) is None + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) + app.state.tracing_data = tracing_data + _startup(tracing_settings=tracing_settings, tracing_data=get_tracing_data(app)) def _on_shutdown() -> None: - _shutdown() + _shutdown(tracing_data=get_tracing_data(app)) app.add_event_handler("shutdown", _on_shutdown) def get_tracing_instrumentation_lifespan( - tracing_settings: TracingSettings, service_name: str + tracing_settings: TracingSettings, tracing_data: TracingData ): # NOTE: This lifespan does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - _startup(tracing_settings=tracing_settings, service_name=service_name) + _startup(tracing_settings=tracing_settings, tracing_data=tracing_data) async def tracing_instrumentation_lifespan( app: FastAPI, @@ -230,7 +244,7 @@ async def tracing_instrumentation_lifespan( yield {} - _shutdown() + _shutdown(tracing_data=tracing_data) return tracing_instrumentation_lifespan @@ -243,3 +257,8 @@ async def dispatch(self, request: Request, call_next): if trace_id_header: response.headers.update(trace_id_header) return response + + +def get_tracing_data(app: FastAPI) -> TracingData: + assert hasattr(app.state, "tracing_data"), "Tracing not setup for this app" # nosec + return app.state.tracing_data diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index a95f386495e6..b97228b3e292 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -1,14 +1,18 @@ from collections.abc import Callable, Coroutine from contextlib import contextmanager from contextvars import Token +from dataclasses import dataclass from functools import wraps -from typing import Any, Final, TypeAlias +from typing import Any, Final, Self, TypeAlias import pyinstrument import pyinstrument.renderers from opentelemetry import context as otcontext from opentelemetry import trace from opentelemetry.instrumentation.logging import LoggingInstrumentor +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased from settings_library.tracing import TracingSettings TracingContext: TypeAlias = otcontext.Context | None @@ -93,3 +97,21 @@ async def wrapper(*args: Any, **kwargs: Any) -> Any: ) return wrapper + + +@dataclass +class TracingData: + service_name: str + tracer_provider: TracerProvider + + @classmethod + def create(cls, tracing_settings: TracingSettings, service_name: str) -> Self: + resource = Resource(attributes={"service.name": service_name}) + sampler = ParentBased( + root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) + ) + trace_provider = TracerProvider(resource=resource, sampler=sampler) + return cls( + service_name=service_name, + tracer_provider=trace_provider, + ) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 4b6b37a6f6e4..7702b9c4e4e5 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -24,6 +24,7 @@ from servicelib.tracing import ( _OSPARC_TRACE_ID_HEADER, _PROFILE_ATTRIBUTE_NAME, + TracingData, with_profiled_span, ) from settings_library.tracing import TracingSettings @@ -83,13 +84,16 @@ async def test_valid_tracing_settings( tracing_settings_in: Callable[[], dict[str, Any]], ): tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-Openetlemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-Openetlemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): pass @@ -120,9 +124,12 @@ async def test_invalid_tracing_settings( app = mocked_app with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012 tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-Openetlemetry-Pytest", + tracing_data=tracing_data, )(app=app): pass @@ -176,14 +183,17 @@ async def test_tracing_setup_package_detection( package_name = manage_package importlib.import_module(package_name) tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-Openetlemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): # idempotency check async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-Openetlemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): pass @@ -210,6 +220,9 @@ async def test_trace_id_in_response_header( server_response: PlainTextResponse | HTTPException, ) -> None: tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) handler_data = dict() @@ -226,7 +239,7 @@ async def handler(handler_data: dict): async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-OpenTelemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) client = TestClient(mocked_app) @@ -259,6 +272,9 @@ async def test_with_profile_span( server_response: PlainTextResponse | HTTPException, ): tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) handler_data = dict() @@ -276,7 +292,7 @@ async def handler(handler_data: dict): async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-OpenTelemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) client = TestClient(mocked_app) @@ -315,6 +331,9 @@ async def test_tracing_sampling_probability_effective( tolerance_probability = 0.5 tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + ) async def handler(): return PlainTextResponse("ok") @@ -323,7 +342,7 @@ async def handler(): async for _ in get_tracing_instrumentation_lifespan( tracing_settings=tracing_settings, - service_name="Mock-OpenTelemetry-Pytest", + tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) client = TestClient(mocked_app) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index a2617cec567e..6a4510710d8e 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -6,8 +6,9 @@ from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import initialize_fastapi_app_tracing +from servicelib.tracing import TracingData -from .._meta import API_VERSION, API_VTAG, PROJECT_NAME, SUMMARY +from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY from ..api.frontend import initialize_frontend from ..api.rest.routes import initialize_rest_api from . import events @@ -20,6 +21,13 @@ def create_app( ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() + tracing_data: TracingData | None = None + if app_settings.DYNAMIC_SCHEDULER_TRACING: + tracing_data = TracingData.create( + tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, + service_name=APP_NAME, + ) + app = FastAPI( title=f"{PROJECT_NAME} web API", description=SUMMARY, @@ -30,7 +38,9 @@ def create_app( ), redoc_url=None, lifespan=events.create_app_lifespan( - settings=app_settings, logging_lifespan=logging_lifespan + settings=app_settings, + tracing_data=tracing_data, + logging_lifespan=logging_lifespan, ), ) override_fastapi_openapi_method(app) @@ -50,6 +60,7 @@ def create_app( initialize_profiler(app) if app_settings.DYNAMIC_SCHEDULER_TRACING: + assert tracing_data # nosec initialize_fastapi_app_tracing(app) return app diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index 1c293e78e710..4464d289a458 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -15,8 +15,9 @@ create_postgres_database_input_state, ) from servicelib.fastapi.tracing import get_tracing_instrumentation_lifespan +from servicelib.tracing import TracingData -from .._meta import APP_FINISHED_BANNER_MSG, APP_NAME, APP_STARTED_BANNER_MSG +from .._meta import APP_FINISHED_BANNER_MSG, APP_STARTED_BANNER_MSG from ..api.rpc.routes import rpc_api_routes_lifespan from ..repository.events import repository_lifespan_manager from ..services.catalog import catalog_lifespan @@ -53,7 +54,9 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]: def create_app_lifespan( - settings: ApplicationSettings, logging_lifespan: Lifespan | None + settings: ApplicationSettings, + tracing_data: TracingData | None, + logging_lifespan: Lifespan | None, ) -> LifespanManager: app_lifespan = LifespanManager() if logging_lifespan: @@ -61,10 +64,11 @@ def create_app_lifespan( app_lifespan.add(_settings_lifespan) if settings.DYNAMIC_SCHEDULER_TRACING: + assert tracing_data # nosec app_lifespan.add( get_tracing_instrumentation_lifespan( tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - service_name=APP_NAME, + tracing_data=tracing_data, ) ) From 1e4583ec8c7c95510bf28c7990809b32333b9d7c Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 10:41:57 +0200 Subject: [PATCH 10/62] propagate fastapi instrumentatoin --- .../src/servicelib/fastapi/tracing.py | 9 +++++++-- .../service-library/tests/fastapi/test_tracing.py | 12 +++++++++--- .../src/simcore_service_agent/core/application.py | 3 ++- .../src/simcore_service_catalog/core/application.py | 5 +++-- .../core/application.py | 3 ++- .../core/application.py | 3 ++- .../simcore_service_director_v2/core/application.py | 3 ++- .../src/simcore_service_director/core/application.py | 3 ++- .../core/application.py | 2 +- .../simcore_service_invitations/core/application.py | 3 ++- .../core/application.py | 3 ++- .../src/simcore_service_payments/core/application.py | 3 ++- .../core/application.py | 3 ++- .../src/simcore_service_storage/core/application.py | 3 ++- 14 files changed, 40 insertions(+), 18 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index ff39185061b9..eb9a42c9533c 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -203,11 +203,16 @@ def _shutdown(tracing_data: TracingData) -> None: def initialize_fastapi_app_tracing( - app: FastAPI, *, add_response_trace_id_header: bool = False + app: FastAPI, + *, + tracing_data: TracingData, + add_response_trace_id_header: bool = False, ): if add_response_trace_id_header: app.add_middleware(ResponseTraceIdHeaderMiddleware) - FastAPIInstrumentor.instrument_app(app) + FastAPIInstrumentor.instrument_app( + app, tracer_provider=tracing_data.tracer_provider + ) def setup_httpx_client_tracing(client: AsyncClient | Client): diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 7702b9c4e4e5..38c3232927ea 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -241,7 +241,9 @@ async def handler(handler_data: dict): tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): - initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) + initialize_fastapi_app_tracing( + mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + ) client = TestClient(mocked_app) response = client.get("/") assert _OSPARC_TRACE_ID_HEADER in response.headers @@ -294,7 +296,9 @@ async def handler(handler_data: dict): tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): - initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) + initialize_fastapi_app_tracing( + mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + ) client = TestClient(mocked_app) _ = client.get("/") trace_id = handler_data.get(_OSPARC_TRACE_ID_HEADER) @@ -344,7 +348,9 @@ async def handler(): tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): - initialize_fastapi_app_tracing(mocked_app, add_response_trace_id_header=True) + initialize_fastapi_app_tracing( + mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + ) client = TestClient(mocked_app) for _ in range(n_requests): client.get("/") diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index e7972c1042a1..5e39fda1ae01 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -7,6 +7,7 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -62,7 +63,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_rpc_api_routes(app) if settings.AGENT_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index 1d5797418624..b323fc93809d 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -11,6 +11,7 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -60,12 +61,12 @@ def create_app( # MIDDLEWARES if settings.CATALOG_TRACING: - setup_tracing(app, settings.CATALOG_TRACING, APP_NAME) + setup_tracing(app, settings.CATALOG_TRACING, service_name=APP_NAME) if settings.CATALOG_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if settings.CATALOG_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION: # middleware to time requests (ONLY for development) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index 1c8c7e448c0a..41a78ad81e66 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -5,6 +5,7 @@ setup_prometheus_instrumentation, ) from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -64,7 +65,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_clusters_management(app) if app.state.settings.CLUSTERS_KEEPER_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS # EVENTS diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index 397a686e7463..02ff59d214be 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -11,6 +11,7 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -63,7 +64,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: app.add_middleware(GZipMiddleware) if app.state.settings.DATCORE_ADAPTER_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # events app.add_event_handler("startup", on_startup) diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index 9b68f4b09a42..e25cca6246d4 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -13,6 +13,7 @@ ) from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -199,7 +200,7 @@ def create_app( # noqa: C901, PLR0912 db.setup(app, settings.POSTGRES) if settings.DIRECTOR_V2_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app, tracing_settings=settings.DIRECTOR_V2_TRACING) diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index fb14ce4e86cf..fab72eed4e54 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -5,6 +5,7 @@ from servicelib.fastapi.client_session import setup_client_session from servicelib.fastapi.http_error import set_app_default_http_error_handlers from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -55,7 +56,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_registry(app) if app.state.settings.DIRECTOR_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS set_app_default_http_error_handlers(app) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index 6a4510710d8e..473fa2c877c1 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -61,6 +61,6 @@ def create_app( if app_settings.DYNAMIC_SCHEDULER_TRACING: assert tracing_data # nosec - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) return app diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index fcfea7234dd2..ab998ba050a8 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -4,6 +4,7 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -48,7 +49,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_prometheus_instrumentation(app) if app.state.settings.INVITATIONS_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/notifications/src/simcore_service_notifications/core/application.py b/services/notifications/src/simcore_service_notifications/core/application.py index 63517b52d5b4..7cd7089774a9 100644 --- a/services/notifications/src/simcore_service_notifications/core/application.py +++ b/services/notifications/src/simcore_service_notifications/core/application.py @@ -10,6 +10,7 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -50,6 +51,6 @@ def create_app( initialize_prometheus_instrumentation(app) if settings.NOTIFICATIONS_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) return app diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index 94c6d2ee7e76..1d25c8acd74b 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -4,6 +4,7 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -78,7 +79,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_prometheus_instrumentation(app) if app.state.settings.PAYMENTS_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS # ... add here ... diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index fb3bdf2d1e84..712345445a08 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -3,6 +3,7 @@ from fastapi import FastAPI from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -74,7 +75,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_process_message_running_service(app) # Requires Rabbit if app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS setup_exception_handlers(app) diff --git a/services/storage/src/simcore_service_storage/core/application.py b/services/storage/src/simcore_service_storage/core/application.py index cf3bb4546fcc..bb489dc25fd9 100644 --- a/services/storage/src/simcore_service_storage/core/application.py +++ b/services/storage/src/simcore_service_storage/core/application.py @@ -18,6 +18,7 @@ from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.profiler import ProfilerMiddleware from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -103,7 +104,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 setup_prometheus_instrumentation(app) if settings.STORAGE_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) async def _on_startup() -> None: if settings.STORAGE_WORKER_MODE: From 604c8183e4adea41b27ab3aec15647fe2f88b0f5 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 10:42:48 +0200 Subject: [PATCH 11/62] small changes --- .../src/simcore_service_api_server/core/application.py | 5 ++++- .../src/simcore_service_autoscaling/core/application.py | 3 ++- .../src/simcore_service_dynamic_sidecar/core/application.py | 3 ++- .../src/simcore_service_efs_guardian/core/application.py | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index 32a5f6df6415..487b041415a1 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -7,6 +7,7 @@ from packaging.version import Version from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -96,7 +97,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_prometheus_instrumentation(app) if settings.API_SERVER_TRACING: - initialize_fastapi_app_tracing(app, add_response_trace_id_header=True) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app), add_response_trace_id_header=True + ) if settings.API_SERVER_WEBSERVER: webserver.setup( diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index ba833512565e..ce15f0ce0233 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -2,6 +2,7 @@ from fastapi import FastAPI from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -61,7 +62,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_redis(app) if app.state.settings.AUTOSCALING_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) setup_auto_scaler_background_task(app) setup_warm_buffer_machines_pool_task(app) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 0de264932ac1..57b4d66a33fe 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -11,6 +11,7 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -195,7 +196,7 @@ def create_app() -> FastAPI: setup_prometheus_metrics(app) if application_settings.DYNAMIC_SIDECAR_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS ------------ app.add_exception_handler( diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index d44dea344147..84da9017528d 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -2,6 +2,7 @@ from fastapi import FastAPI from servicelib.fastapi.tracing import ( + get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -61,7 +62,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_fire_and_forget(app) if app.state.settings.EFS_GUARDIAN_TRACING: - initialize_fastapi_app_tracing(app) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # EVENTS async def _on_startup() -> None: From 33e2023c8ecba44a1eb3199cebcc55e0b6d8b8d2 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 14:23:53 +0200 Subject: [PATCH 12/62] propagate tracing-data throughout fastapi apps --- .../src/servicelib/fastapi/client_session.py | 6 ++-- .../servicelib/fastapi/http_client_thin.py | 6 ++-- .../src/servicelib/fastapi/tracing.py | 30 +++++++++++++++---- .../tests/fastapi/test_http_client_thin.py | 26 +++++++++++----- .../simcore_service_agent/core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 6 ++-- .../core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 6 ++-- .../cli/_client.py | 1 + .../core/application.py | 4 ++- .../dynamic_sidecar/api_client/_thin.py | 6 ++++ .../core/application.py | 7 +++-- .../services/catalog/_thin_client.py | 2 ++ .../services/director_v0/_thin_client.py | 2 ++ .../services/director_v2/_thin_client.py | 2 ++ .../core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 4 ++- .../core/application.py | 5 +++- .../core/application.py | 10 +++++-- 24 files changed, 119 insertions(+), 36 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/client_session.py b/packages/service-library/src/servicelib/fastapi/client_session.py index f9c126272eec..059a51005ea6 100644 --- a/packages/service-library/src/servicelib/fastapi/client_session.py +++ b/packages/service-library/src/servicelib/fastapi/client_session.py @@ -2,6 +2,7 @@ import httpx from fastapi import FastAPI +from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings from .tracing import setup_httpx_client_tracing @@ -13,6 +14,7 @@ def setup_client_session( default_timeout: datetime.timedelta = datetime.timedelta(seconds=20), max_keepalive_connections: int = 20, tracing_settings: TracingSettings | None, + tracing_data: TracingData | None ) -> None: async def on_startup() -> None: session = httpx.AsyncClient( @@ -20,8 +22,8 @@ async def on_startup() -> None: limits=httpx.Limits(max_keepalive_connections=max_keepalive_connections), timeout=default_timeout.total_seconds(), ) - if tracing_settings: - setup_httpx_client_tracing(session) + if tracing_settings and tracing_data: + setup_httpx_client_tracing(session, tracing_data=tracing_data) app.state.aiohttp_client_session = session async def on_shutdown() -> None: diff --git a/packages/service-library/src/servicelib/fastapi/http_client_thin.py b/packages/service-library/src/servicelib/fastapi/http_client_thin.py index a62461f00091..ff6e280ca45e 100644 --- a/packages/service-library/src/servicelib/fastapi/http_client_thin.py +++ b/packages/service-library/src/servicelib/fastapi/http_client_thin.py @@ -8,6 +8,7 @@ from common_library.errors_classes import OsparcErrorMixin from httpx import AsyncClient, ConnectError, HTTPError, PoolTimeout, Response from httpx._types import TimeoutTypes, URLTypes +from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings from tenacity import RetryCallState from tenacity.asyncio import AsyncRetrying @@ -201,6 +202,7 @@ def __init__( *, total_retry_interval: float, tracing_settings: TracingSettings | None, + tracing_data: TracingData | None, base_url: URLTypes | None = None, default_http_client_timeout: TimeoutTypes | None = None, extra_allowed_method_names: set[str] | None = None, @@ -224,8 +226,8 @@ def __init__( client_args["timeout"] = default_http_client_timeout client = AsyncClient(**client_args) - if tracing_settings: - setup_httpx_client_tracing(client) + if tracing_settings and tracing_data: + setup_httpx_client_tracing(client, tracing_data=tracing_data) super().__init__(client=client) async def __aenter__(self): diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index eb9a42c9533c..5d1379186c29 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -2,6 +2,7 @@ import logging from collections.abc import AsyncIterator +from typing import overload from fastapi import FastAPI, Request from fastapi_lifespan_manager import State @@ -215,8 +216,12 @@ def initialize_fastapi_app_tracing( ) -def setup_httpx_client_tracing(client: AsyncClient | Client): - HTTPXClientInstrumentor.instrument_client(client) +def setup_httpx_client_tracing( + client: AsyncClient | Client, tracing_data: TracingData +) -> None: + HTTPXClientInstrumentor.instrument_client( + client, tracer_provider=tracing_data.tracer_provider + ) def setup_tracing( @@ -228,10 +233,10 @@ def setup_tracing( tracing_settings=tracing_settings, service_name=service_name ) app.state.tracing_data = tracing_data - _startup(tracing_settings=tracing_settings, tracing_data=get_tracing_data(app)) + _startup(tracing_settings=tracing_settings, tracing_data=tracing_data) def _on_shutdown() -> None: - _shutdown(tracing_data=get_tracing_data(app)) + _shutdown(tracing_data=tracing_data) app.add_event_handler("shutdown", _on_shutdown) @@ -264,6 +269,21 @@ async def dispatch(self, request: Request, call_next): return response -def get_tracing_data(app: FastAPI) -> TracingData: +@overload +def get_tracing_data( + app: FastAPI, tracing_settings: TracingSettings +) -> TracingData: ... + + +@overload +def get_tracing_data(app: FastAPI, tracing_settings: None) -> None: ... + + +def get_tracing_data( + app: FastAPI, tracing_settings: TracingSettings | None +) -> TracingData | None: + if tracing_settings is None: + return None assert hasattr(app.state, "tracing_data"), "Tracing not setup for this app" # nosec + assert isinstance(app.state.tracing_data, TracingData) return app.state.tracing_data diff --git a/packages/service-library/tests/fastapi/test_http_client_thin.py b/packages/service-library/tests/fastapi/test_http_client_thin.py index 0a1f800f5107..caaadfde67fc 100644 --- a/packages/service-library/tests/fastapi/test_http_client_thin.py +++ b/packages/service-library/tests/fastapi/test_http_client_thin.py @@ -100,7 +100,7 @@ async def test_retry_on_errors( caplog_info_level: pytest.LogCaptureFixture, ) -> None: client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None ) with pytest.raises(ClientHttpError): @@ -125,7 +125,9 @@ async def raises_request_error(self) -> Response: request=Request(method="GET", url=test_url), ) - client = ATestClient(total_retry_interval=request_timeout, tracing_settings=None) + client = ATestClient( + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + ) with pytest.raises(ClientHttpError): await client.raises_request_error() @@ -151,7 +153,9 @@ async def raises_http_error(self) -> Response: msg = "mock_http_error" raise HTTPError(msg) - client = ATestClient(total_retry_interval=request_timeout, tracing_settings=None) + client = ATestClient( + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + ) with pytest.raises(ClientHttpError): await client.raises_http_error() @@ -165,7 +169,9 @@ async def public_method_ok(self) -> Response: # type: ignore """this method will be ok even if no code is used""" # OK - OKTestClient(total_retry_interval=request_timeout, tracing_settings=None) + OKTestClient( + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + ) class FailWrongAnnotationTestClient(BaseThinClient): async def public_method_wrong_annotation(self) -> None: @@ -173,7 +179,9 @@ async def public_method_wrong_annotation(self) -> None: with pytest.raises(AssertionError, match="should return an instance"): FailWrongAnnotationTestClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, + tracing_settings=None, + tracing_data=None, ) class FailNoAnnotationTestClient(BaseThinClient): @@ -182,7 +190,9 @@ async def public_method_no_annotation(self): with pytest.raises(AssertionError, match="should return an instance"): FailNoAnnotationTestClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, + tracing_settings=None, + tracing_data=None, ) @@ -208,7 +218,7 @@ async def get_wrong_state(self) -> Response: respx_mock.get(get_wrong_state).mock(return_value=Response(codes.OK)) test_client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None ) # OK @@ -231,7 +241,7 @@ async def test_retry_timeout_overwrite( caplog_info_level: pytest.LogCaptureFixture, ) -> None: client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None ) caplog_info_level.clear() diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index 5e39fda1ae01..60ca0c907202 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -63,7 +63,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_rpc_api_routes(app) if settings.AGENT_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.AGENT_TRACING) + ) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index 487b041415a1..c281918552e3 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -98,7 +98,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if settings.API_SERVER_TRACING: initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app), add_response_trace_id_header=True + app, + tracing_data=get_tracing_data(app, settings.API_SERVER_TRACING), + add_response_trace_id_header=True, ) if settings.API_SERVER_WEBSERVER: diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index ce15f0ce0233..4fd66ac489c1 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -61,8 +61,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_ssm(app) setup_redis(app) - if app.state.settings.AUTOSCALING_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if settings.AUTOSCALING_TRACING: + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.AUTOSCALING_TRACING) + ) setup_auto_scaler_background_task(app) setup_warm_buffer_machines_pool_task(app) diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index b323fc93809d..7c2a93a094b4 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -66,7 +66,9 @@ def create_app( setup_prometheus_instrumentation(app) if settings.CATALOG_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.CATALOG_TRACING) + ) if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION: # middleware to time requests (ONLY for development) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index 41a78ad81e66..a345a21568ce 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -65,7 +65,9 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_clusters_management(app) if app.state.settings.CLUSTERS_KEEPER_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.CLUSTERS_KEEPER_TRACING) + ) # ERROR HANDLERS # EVENTS diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index 02ff59d214be..86e0adc5bab1 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -63,8 +63,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: ) app.add_middleware(GZipMiddleware) - if app.state.settings.DATCORE_ADAPTER_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if settings.DATCORE_ADAPTER_TRACING: + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.DATCORE_ADAPTER_TRACING) + ) # events app.add_event_handler("startup", on_startup) diff --git a/services/director-v2/src/simcore_service_director_v2/cli/_client.py b/services/director-v2/src/simcore_service_director_v2/cli/_client.py index 872c08f3b5f6..037e2665321f 100644 --- a/services/director-v2/src/simcore_service_director_v2/cli/_client.py +++ b/services/director-v2/src/simcore_service_director_v2/cli/_client.py @@ -15,6 +15,7 @@ def __init__(self): total_retry_interval=10, default_http_client_timeout=Timeout(5), tracing_settings=None, + tracing_data=None, ) def _get_url(self, postfix: str) -> str: diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index e25cca6246d4..a1be24824ffe 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -200,7 +200,9 @@ def create_app( # noqa: C901, PLR0912 db.setup(app, settings.POSTGRES) if settings.DIRECTOR_V2_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.DIRECTOR_V2_TRACING) + ) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app, tracing_settings=settings.DIRECTOR_V2_TRACING) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index 3a3cc1c3118d..9d5990bd217d 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -12,6 +12,8 @@ expect_status, retry_on_errors, ) +from servicelib.fastapi.tracing import get_tracing_data +from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings from ....core.dynamic_services_settings.scheduler import ( @@ -35,6 +37,9 @@ def __init__(self, app: FastAPI): tracing_settings: TracingSettings | None = ( app.state.settings.DIRECTOR_V2_TRACING ) + tracing_data: TracingData | None = None + if tracing_settings: + tracing_data = get_tracing_data(app, settings.DIRECTOR_V2_TRACING) # timeouts self._health_request_timeout = Timeout(1.0, connect=1.0) @@ -58,6 +63,7 @@ def __init__(self, app: FastAPI): connect=scheduler_settings.DYNAMIC_SIDECAR_API_CONNECT_TIMEOUT, ), tracing_settings=tracing_settings, + tracing_data=tracing_data, ) def _get_url( diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index fab72eed4e54..e41a5f24364c 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -52,11 +52,14 @@ def create_app(settings: ApplicationSettings) -> FastAPI: max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS, default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT, tracing_settings=settings.DIRECTOR_TRACING, + tracing_data=get_tracing_data(app, settings.DIRECTOR_TRACING), ) setup_registry(app) - if app.state.settings.DIRECTOR_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if settings.DIRECTOR_TRACING: + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.DIRECTOR_TRACING) + ) # ERROR HANDLERS set_app_default_http_error_handlers(app) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py index 98cf8b7e0aeb..e4a96871a0b7 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py @@ -11,6 +11,7 @@ expect_status, retry_on_errors, ) +from servicelib.fastapi.tracing import get_tracing_data from yarl import URL from ...core.settings import ApplicationSettings @@ -35,6 +36,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_CATALOG_SETTINGS.api_base_url, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, + tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py index d6d2cd272212..c95db5b07395 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py @@ -11,6 +11,7 @@ expect_status, retry_on_errors, ) +from servicelib.fastapi.tracing import get_tracing_data from yarl import URL from ...core.settings import ApplicationSettings @@ -37,6 +38,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_DIRECTOR_V0_SETTINGS.endpoint, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, + tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py index c3afea528188..1e58bcb58f10 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py @@ -24,6 +24,7 @@ expect_status, retry_on_errors, ) +from servicelib.fastapi.tracing import get_tracing_data from servicelib.rabbitmq.rpc_interfaces.dynamic_scheduler.services import ( DEFAULT_LEGACY_WB_TO_DV2_HTTP_REQUESTS_TIMEOUT_S, ) @@ -42,6 +43,7 @@ def __init__(self, app: FastAPI) -> None: ), extra_allowed_method_names={"attach_lifespan_to"}, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, + tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), ) @retry_on_errors() diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 57b4d66a33fe..8d68e21416eb 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -196,7 +196,9 @@ def create_app() -> FastAPI: setup_prometheus_metrics(app) if application_settings.DYNAMIC_SIDECAR_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.DYNAMIC_SIDECAR_TRACING) + ) # ERROR HANDLERS ------------ app.add_exception_handler( diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 84da9017528d..8a7c769a544b 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -62,7 +62,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_fire_and_forget(app) if app.state.settings.EFS_GUARDIAN_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.EFS_GUARDIAN_TRACING) + ) # EVENTS async def _on_startup() -> None: diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index ab998ba050a8..bac5bd19aee2 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -49,7 +49,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_prometheus_instrumentation(app) if app.state.settings.INVITATIONS_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.INVITATIONS_TRACING) + ) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/notifications/src/simcore_service_notifications/core/application.py b/services/notifications/src/simcore_service_notifications/core/application.py index 7cd7089774a9..0600a9f3e23f 100644 --- a/services/notifications/src/simcore_service_notifications/core/application.py +++ b/services/notifications/src/simcore_service_notifications/core/application.py @@ -51,6 +51,8 @@ def create_app( initialize_prometheus_instrumentation(app) if settings.NOTIFICATIONS_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.NOTIFICATIONS_TRACING) + ) return app diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index 1d25c8acd74b..30cc2ae267d6 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -79,7 +79,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_prometheus_instrumentation(app) if app.state.settings.PAYMENTS_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.PAYMENTS_TRACING) + ) # ERROR HANDLERS # ... add here ... diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index 712345445a08..f54ad93048e5 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -75,7 +75,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_process_message_running_service(app) # Requires Rabbit if app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, + tracing_data=get_tracing_data(app, settings.RESOURCE_USAGE_TRACKER_TRACING), + ) # ERROR HANDLERS setup_exception_handlers(app) diff --git a/services/storage/src/simcore_service_storage/core/application.py b/services/storage/src/simcore_service_storage/core/application.py index bb489dc25fd9..bc1ab984e761 100644 --- a/services/storage/src/simcore_service_storage/core/application.py +++ b/services/storage/src/simcore_service_storage/core/application.py @@ -69,7 +69,11 @@ def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 setup_db(app) setup_s3(app) - setup_client_session(app, tracing_settings=settings.STORAGE_TRACING) + setup_client_session( + app, + tracing_settings=settings.STORAGE_TRACING, + tracing_data=get_tracing_data(app, settings.STORAGE_TRACING), + ) if settings.STORAGE_CELERY: setup_task_manager(app, settings=settings.STORAGE_CELERY) @@ -104,7 +108,9 @@ def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 setup_prometheus_instrumentation(app) if settings.STORAGE_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing( + app, tracing_data=get_tracing_data(app, settings.STORAGE_TRACING) + ) async def _on_startup() -> None: if settings.STORAGE_WORKER_MODE: From 405fa861787e98526ffbd77ce92b2fbaa68a64bc Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 14:36:45 +0200 Subject: [PATCH 13/62] further propagate tracing_data --- .../utils/client_base.py | 7 +++++-- .../clients/director.py | 9 +++++++-- .../modules/catalog.py | 7 +++++-- .../modules/director_v0.py | 7 +++++-- .../modules/dynamic_services.py | 14 ++++++++------ .../modules/resource_usage_tracker_client.py | 18 ++++++++++++------ .../modules/storage.py | 11 ++++++----- .../services/payments_gateway.py | 11 ++++++++--- .../services/resource_usage_tracker.py | 12 ++++++++---- .../services/stripe.py | 11 ++++++++--- 10 files changed, 72 insertions(+), 35 deletions(-) diff --git a/services/api-server/src/simcore_service_api_server/utils/client_base.py b/services/api-server/src/simcore_service_api_server/utils/client_base.py index 173090b8965d..77c77d035d67 100644 --- a/services/api-server/src/simcore_service_api_server/utils/client_base.py +++ b/services/api-server/src/simcore_service_api_server/utils/client_base.py @@ -5,7 +5,7 @@ import httpx from fastapi import FastAPI from httpx import AsyncClient, Timeout -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from settings_library.tracing import TracingSettings from .app_data import AppDataMixin @@ -60,7 +60,10 @@ def setup_client_instance( timeout=Timeout(_DEFAULT_BASE_SERVICE_CLIENT_API_TIMEOUT_SECONDS), ) if tracing_settings: - setup_httpx_client_tracing(client) + setup_httpx_client_tracing( + client, + tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + ) # events def _create_instance() -> None: diff --git a/services/catalog/src/simcore_service_catalog/clients/director.py b/services/catalog/src/simcore_service_catalog/clients/director.py index 367f9cb0e2e4..310021fbd0ae 100644 --- a/services/catalog/src/simcore_service_catalog/clients/director.py +++ b/services/catalog/src/simcore_service_catalog/clients/director.py @@ -15,7 +15,7 @@ from models_library.services_metadata_published import ServiceMetaDataPublished from models_library.services_types import ServiceKey, ServiceVersion from pydantic import NonNegativeInt, TypeAdapter -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from servicelib.logging_utils import log_catch, log_context from starlette import status from tenacity.asyncio import AsyncRetrying @@ -146,7 +146,12 @@ def __init__(self, base_url: str, app: FastAPI): timeout=settings.CATALOG_CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT, ) if settings.CATALOG_TRACING: - setup_httpx_client_tracing(self.client) + setup_httpx_client_tracing( + self.client, + tracing_data=get_tracing_data( + app=app, tracing_settings=settings.CATALOG_TRACING + ), + ) assert settings.CATALOG_DIRECTOR # nosec self.vtag = settings.CATALOG_DIRECTOR.DIRECTOR_VTAG diff --git a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py index d9d4c3e61440..4adefda216b0 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py @@ -11,7 +11,7 @@ from models_library.services_resources import ServiceResourcesDict from models_library.users import UserID from pydantic import TypeAdapter -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from settings_library.catalog import CatalogSettings from settings_library.tracing import TracingSettings @@ -35,7 +35,10 @@ async def on_startup() -> None: timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT, ) if tracing_settings: - setup_httpx_client_tracing(client=client) + setup_httpx_client_tracing( + client=client, + tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + ) CatalogClient.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py index 8b8d10468125..556837889efb 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py @@ -13,7 +13,7 @@ from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from models_library.users import UserID -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from servicelib.logging_utils import log_decorator from settings_library.director_v0 import DirectorV0Settings from settings_library.tracing import TracingSettings @@ -40,7 +40,10 @@ def on_startup() -> None: timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT, ) if tracing_settings: - setup_httpx_client_tracing(client=client) + setup_httpx_client_tracing( + client=client, + tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + ) DirectorV0Client.create( app, client=client, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py index acbc08849a69..eb84a85419af 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py @@ -1,14 +1,11 @@ -""" Module that takes care of communications with dynamic services v0 - - -""" +"""Module that takes care of communications with dynamic services v0""" import logging from dataclasses import dataclass import httpx from fastapi import FastAPI -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from settings_library.tracing import TracingSettings from ..utils.client_decorators import handle_errors, handle_retry @@ -22,7 +19,12 @@ def on_startup() -> None: timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT ) if tracing_settings: - setup_httpx_client_tracing(client=client) + setup_httpx_client_tracing( + client=client, + tracing_data=get_tracing_data( + app=app, tracing_settings=tracing_settings + ), + ) ServicesClient.create( app, client=client, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py index 550b2eddfeff..d66668c44ec8 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py @@ -1,5 +1,4 @@ -""" Interface to communicate with the resource usage tracker -""" +"""Interface to communicate with the resource usage tracker""" import contextlib import logging @@ -23,7 +22,7 @@ ) from models_library.services import ServiceKey, ServiceVersion from models_library.wallets import WalletID -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from ..core.errors import PricingPlanUnitNotFoundError from ..core.settings import AppSettings @@ -37,12 +36,19 @@ class ResourceUsageTrackerClient: exit_stack: contextlib.AsyncExitStack @classmethod - def create(cls, settings: AppSettings) -> "ResourceUsageTrackerClient": + def create( + cls, app: FastAPI, settings: AppSettings + ) -> "ResourceUsageTrackerClient": client = httpx.AsyncClient( base_url=settings.DIRECTOR_V2_RESOURCE_USAGE_TRACKER.api_base_url, ) if settings.DIRECTOR_V2_TRACING: - setup_httpx_client_tracing(client=client) + setup_httpx_client_tracing( + client=client, + tracing_data=get_tracing_data( + app=app, tracing_settings=settings.DIRECTOR_V2_TRACING + ), + ) exit_stack = contextlib.AsyncExitStack() return cls(client=client, exit_stack=exit_stack) @@ -166,7 +172,7 @@ def setup(cls, app: FastAPI): assert not hasattr(app.state, "resource_usage_api") # nosec app_settings: AppSettings = app.state.settings - app.state.resource_usage_api = api = cls.create(app_settings) + app.state.resource_usage_api = api = cls.create(app, app_settings) async def on_startup(): await api.start() diff --git a/services/director-v2/src/simcore_service_director_v2/modules/storage.py b/services/director-v2/src/simcore_service_director_v2/modules/storage.py index 08e18de0aeb6..2faa3d97e30e 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/storage.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/storage.py @@ -1,14 +1,12 @@ -""" Module that takes care of communications with director v0 service +"""Module that takes care of communications with director v0 service""" - -""" import logging from dataclasses import dataclass import httpx from fastapi import FastAPI, HTTPException from models_library.users import UserID -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from servicelib.logging_utils import log_decorator from settings_library.s3 import S3Settings from settings_library.storage import StorageSettings @@ -40,7 +38,10 @@ def on_startup() -> None: timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT, ) if tracing_settings: - setup_httpx_client_tracing(client=client) + setup_httpx_client_tracing( + client=client, + tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + ) StorageClient.create( app, client=client, diff --git a/services/payments/src/simcore_service_payments/services/payments_gateway.py b/services/payments/src/simcore_service_payments/services/payments_gateway.py index 812ab0870742..615ff4713887 100644 --- a/services/payments/src/simcore_service_payments/services/payments_gateway.py +++ b/services/payments/src/simcore_service_payments/services/payments_gateway.py @@ -1,4 +1,4 @@ -""" Interface to communicate with the payment's gateway +"""Interface to communicate with the payment's gateway - httpx client with base_url to PAYMENTS_GATEWAY_URL - Fake gateway service in services/payments/scripts/example_payment_gateway.py @@ -25,7 +25,7 @@ HealthMixinMixin, ) from servicelib.fastapi.httpx_utils import to_curl_command -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from ..core.settings import ApplicationSettings from ..models.payments_gateway import ( @@ -216,6 +216,11 @@ def setup_payments_gateway(app: FastAPI): ), ) if settings.PAYMENTS_TRACING: - setup_httpx_client_tracing(api.client) + setup_httpx_client_tracing( + api.client, + tracing_data=get_tracing_data( + app, tracing_settings=settings.PAYMENTS_TRACING + ), + ) api.attach_lifespan_to(app) api.set_to_app_state(app) diff --git a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py index 6ae5d424fdf8..9d1fce3e344b 100644 --- a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py +++ b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py @@ -1,10 +1,9 @@ -""" Interface to communicate with the Resource Usage Tracker (RUT) +"""Interface to communicate with the Resource Usage Tracker (RUT) - httpx client with base_url to PAYMENTS_RESOURCE_USAGE_TRACKER """ - import logging from datetime import datetime from decimal import Decimal @@ -25,7 +24,7 @@ BaseHTTPApi, HealthMixinMixin, ) -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from ..core.settings import ApplicationSettings @@ -75,6 +74,11 @@ def setup_resource_usage_tracker(app: FastAPI): base_url=settings.PAYMENTS_RESOURCE_USAGE_TRACKER.base_url, ) if settings.PAYMENTS_TRACING: - setup_httpx_client_tracing(api.client) + setup_httpx_client_tracing( + api.client, + tracing_data=get_tracing_data( + app, tracing_settings=settings.PAYMENTS_TRACING + ), + ) api.set_to_app_state(app) api.attach_lifespan_to(app) diff --git a/services/payments/src/simcore_service_payments/services/stripe.py b/services/payments/src/simcore_service_payments/services/stripe.py index 349de908d7e5..3b1e35867242 100644 --- a/services/payments/src/simcore_service_payments/services/stripe.py +++ b/services/payments/src/simcore_service_payments/services/stripe.py @@ -1,4 +1,4 @@ -""" Interface to communicate with the Resource Usage Tracker (RUT) +"""Interface to communicate with the Resource Usage Tracker (RUT) - httpx client with base_url to PAYMENTS_RESOURCE_USAGE_TRACKER @@ -19,7 +19,7 @@ BaseHTTPApi, HealthMixinMixin, ) -from servicelib.fastapi.tracing import setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing from ..core.errors import StripeRuntimeError from ..core.settings import ApplicationSettings @@ -93,7 +93,12 @@ def setup_stripe(app: FastAPI): auth=_StripeBearerAuth(settings.PAYMENTS_STRIPE_API_SECRET.get_secret_value()), ) if settings.PAYMENTS_TRACING: - setup_httpx_client_tracing(api.client) + setup_httpx_client_tracing( + api.client, + tracing_data=get_tracing_data( + app, tracing_settings=settings.PAYMENTS_TRACING + ), + ) api.set_to_app_state(app) api.attach_lifespan_to(app) From bbc5d12725fd39c7c4b2f0a3ffa7d2c8796b7053 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 14:44:44 +0200 Subject: [PATCH 14/62] further cleanup --- .../src/simcore_service_clusters_keeper/core/application.py | 2 +- .../modules/dynamic_sidecar/api_client/_thin.py | 5 +---- .../src/simcore_service_dynamic_sidecar/core/application.py | 5 ++++- .../src/simcore_service_efs_guardian/core/application.py | 4 ++-- .../src/simcore_service_invitations/core/application.py | 4 ++-- .../src/simcore_service_payments/core/application.py | 4 ++-- .../core/application.py | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index a345a21568ce..3a1bf84044f7 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -64,7 +64,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_redis(app) setup_clusters_management(app) - if app.state.settings.CLUSTERS_KEEPER_TRACING: + if settings.CLUSTERS_KEEPER_TRACING: initialize_fastapi_app_tracing( app, tracing_data=get_tracing_data(app, settings.CLUSTERS_KEEPER_TRACING) ) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index 9d5990bd217d..e8b19a2a4bd6 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -13,7 +13,6 @@ retry_on_errors, ) from servicelib.fastapi.tracing import get_tracing_data -from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings from ....core.dynamic_services_settings.scheduler import ( @@ -37,9 +36,7 @@ def __init__(self, app: FastAPI): tracing_settings: TracingSettings | None = ( app.state.settings.DIRECTOR_V2_TRACING ) - tracing_data: TracingData | None = None - if tracing_settings: - tracing_data = get_tracing_data(app, settings.DIRECTOR_V2_TRACING) + tracing_data = get_tracing_data(app, tracing_settings) # timeouts self._health_request_timeout = Timeout(1.0, connect=1.0) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 8d68e21416eb..e3d40519bf60 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -197,7 +197,10 @@ def create_app() -> FastAPI: if application_settings.DYNAMIC_SIDECAR_TRACING: initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.DYNAMIC_SIDECAR_TRACING) + app, + tracing_data=get_tracing_data( + app, application_settings.DYNAMIC_SIDECAR_TRACING + ), ) # ERROR HANDLERS ------------ diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 8a7c769a544b..1736def33355 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -61,9 +61,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_fire_and_forget(app) - if app.state.settings.EFS_GUARDIAN_TRACING: + if app_settings.EFS_GUARDIAN_TRACING: initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.EFS_GUARDIAN_TRACING) + app, tracing_data=get_tracing_data(app, app_settings.EFS_GUARDIAN_TRACING) ) # EVENTS diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index bac5bd19aee2..2cab4b10e249 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -48,9 +48,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.INVITATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if app.state.settings.INVITATIONS_TRACING: + if tracing_settings := app.state.settings.INVITATIONS_TRACING: initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.INVITATIONS_TRACING) + app, tracing_data=get_tracing_data(app, tracing_settings) ) # ERROR HANDLERS diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index 30cc2ae267d6..f46a0474ddd7 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -78,9 +78,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.PAYMENTS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if app.state.settings.PAYMENTS_TRACING: + if app_settings.PAYMENTS_TRACING: initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.PAYMENTS_TRACING) + app, tracing_data=get_tracing_data(app, app_settings.PAYMENTS_TRACING) ) # ERROR HANDLERS diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index f54ad93048e5..d025323cfa9d 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -74,10 +74,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_process_message_running_service(app) # Requires Rabbit - if app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: + if tracing_settings := app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_data(app, settings.RESOURCE_USAGE_TRACKER_TRACING), + tracing_data=get_tracing_data(app, tracing_settings), ) # ERROR HANDLERS From d1aba9b2d502490977963b809c5996e75548c135 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 15:56:30 +0200 Subject: [PATCH 15/62] propagate tracing_data --- .../src/servicelib/aiohttp/tracing.py | 49 +++++++++---------- .../tests/aiohttp/test_tracing.py | 30 +++++++----- .../src/simcore_service_webserver/tracing.py | 7 ++- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 1f939a5ef05a..910fdd3f48f1 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -5,7 +5,6 @@ from typing import Final from aiohttp import web -from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( OTLPSpanExporter as OTLPSpanExporterHTTP, ) @@ -15,15 +14,13 @@ from opentelemetry.instrumentation.aiohttp_server import ( middleware as aiohttp_server_opentelemetry_middleware, # pylint:disable=no-name-in-module ) -from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk.trace import SpanProcessor, TracerProvider +from opentelemetry.sdk.trace import SpanProcessor from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased from settings_library.tracing import TracingSettings from yarl import URL from ..logging_utils import log_context -from ..tracing import get_trace_id_header +from ..tracing import TracingData, get_trace_id_header _logger = logging.getLogger(__name__) try: @@ -77,7 +74,7 @@ def _startup( *, app: web.Application, tracing_settings: TracingSettings, - service_name: str, + tracing_data: TracingData, add_response_trace_id_header: bool = False, ) -> None: """ @@ -100,13 +97,6 @@ def _startup( "unset. Provide both or remove both." ) raise RuntimeError(msg) - resource = Resource(attributes={"service.name": service_name}) - sampler = ParentBased( - root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) - ) - tracer_provider = TracerProvider(resource=resource, sampler=sampler) - trace.set_tracer_provider(tracer_provider=tracer_provider) - tracer_provider: trace.TracerProvider = trace.get_tracer_provider() tracing_destination: str = ( f"{URL(opentelemetry_collector_endpoint).with_port(opentelemetry_collector_port).with_path('/v1/traces')}" @@ -114,12 +104,12 @@ def _startup( _logger.info( "Trying to connect service %s to tracing collector at %s.", - service_name, + tracing_data.service_name, tracing_destination, ) # Add the span processor to the tracer provider - tracer_provider.add_span_processor(_create_span_processor(tracing_destination)) # type: ignore[attr-defined] # https://github.com/open-telemetry/opentelemetry-python/issues/3713 + tracing_data.tracer_provider.add_span_processor(_create_span_processor(tracing_destination)) # type: ignore[attr-defined] # https://github.com/open-telemetry/opentelemetry-python/issues/3713 # Instrument aiohttp server # Explanation for custom middleware call DK 10/2024: # OpenTelemetry Aiohttp autoinstrumentation is meant to be used by only calling `AioHttpServerInstrumentor().instrument()` @@ -140,35 +130,41 @@ def _startup( # - opentelemetry-instrumentation==0.48b0 # Instrument aiohttp client - AioHttpClientInstrumentor().instrument() + AioHttpClientInstrumentor().instrument(tracer_provier=tracing_data.tracer_provider) if HAS_AIOPG: with log_context( _logger, logging.INFO, msg="Attempting to add aio-pg opentelemetry autoinstrumentation...", ): - AiopgInstrumentor().instrument() + AiopgInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) if HAS_ASYNCPG: with log_context( _logger, logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AsyncPGInstrumentor().instrument() + AsyncPGInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_BOTOCORE: with log_context( _logger, logging.INFO, msg="Attempting to add botocore opentelemetry autoinstrumentation...", ): - BotocoreInstrumentor().instrument() + BotocoreInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_REQUESTS: with log_context( _logger, logging.INFO, msg="Attempting to add requests opentelemetry autoinstrumentation...", ): - RequestsInstrumentor().instrument() + RequestsInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) if HAS_AIO_PIKA: with log_context( @@ -176,7 +172,9 @@ def _startup( logging.INFO, msg="Attempting to add aio_pika opentelemetry autoinstrumentation...", ): - AioPikaInstrumentor().instrument() + AioPikaInstrumentor().instrument( + tracer_provider=tracing_data.tracer_provider + ) @web.middleware @@ -194,8 +192,9 @@ async def response_trace_id_header_middleware(request: web.Request, handler): return response -def _shutdown() -> None: +def _shutdown(tracing_data: TracingData) -> None: """Uninstruments all opentelemetry instrumentors that were instrumented.""" + assert tracing_data # nosec try: AioHttpClientInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught @@ -231,19 +230,19 @@ def get_tracing_lifespan( *, app: web.Application, tracing_settings: TracingSettings, - service_name: str, + tracing_data: TracingData, add_response_trace_id_header: bool = False, ) -> Callable[[web.Application], AsyncIterator]: _startup( app=app, tracing_settings=tracing_settings, - service_name=service_name, + tracing_data=tracing_data, add_response_trace_id_header=add_response_trace_id_header, ) async def tracing_lifespan(app: web.Application): assert app # nosec yield - _shutdown() + _shutdown(tracing_data=tracing_data) return tracing_lifespan diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index 2a50d4758fda..ae35e084f343 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -16,7 +16,7 @@ from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from pydantic import ValidationError from servicelib.aiohttp.tracing import get_tracing_lifespan -from servicelib.tracing import _OSPARC_TRACE_ID_HEADER +from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingData from settings_library.tracing import TracingSettings @@ -70,8 +70,11 @@ async def test_valid_tracing_settings( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) async for _ in get_tracing_lifespan( - app=app, service_name=service_name, tracing_settings=tracing_settings + app=app, tracing_settings=tracing_settings, tracing_data=tracing_data )(app): pass @@ -147,16 +150,15 @@ async def test_tracing_setup_package_detection( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) async for _ in get_tracing_lifespan( - app=app, - service_name=service_name, - tracing_settings=tracing_settings, + app=app, tracing_settings=tracing_settings, tracing_data=tracing_data )(app): # idempotency async for _ in get_tracing_lifespan( - app=app, - service_name=service_name, - tracing_settings=tracing_settings, + app=app, tracing_settings=tracing_settings, tracing_data=tracing_data )(app): pass @@ -181,6 +183,9 @@ async def test_trace_id_in_response_header( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) async def handler(handler_data: dict, request: web.Request) -> web.Response: current_span = trace.get_current_span() @@ -196,8 +201,8 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: async for _ in get_tracing_lifespan( app=app, - service_name=service_name, tracing_settings=tracing_settings, + tracing_data=tracing_data, add_response_trace_id_header=True, )(app): client = await aiohttp_client(app) @@ -234,6 +239,9 @@ async def test_tracing_sampling_probability_effective( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) async def handler(request: web.Request) -> web.Response: return web.Response(text="ok") @@ -241,9 +249,7 @@ async def handler(request: web.Request) -> web.Response: app.router.add_get("/", handler) async for _ in get_tracing_lifespan( - app=app, - service_name=service_name, - tracing_settings=tracing_settings, + app=app, tracing_settings=tracing_settings, tracing_data=tracing_data )(app): client = await aiohttp_client(app) diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index 552fb8393c64..33e55c19f577 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -2,8 +2,10 @@ from aiohttp import web from servicelib.aiohttp.tracing import get_tracing_lifespan +from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings +from ._meta import APP_NAME from .application_keys import APP_SETTINGS_APPKEY from .application_settings import get_application_settings from .application_setup import ModuleCategory, app_setup_func @@ -34,12 +36,15 @@ def setup_app_tracing(app: web.Application): app_settings = get_application_settings(app) tracing_settings: TracingSettings = get_plugin_settings(app) + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=APP_NAME + ) app.cleanup_ctx.append( get_tracing_lifespan( app=app, tracing_settings=tracing_settings, - service_name=app_settings.APP_NAME, add_response_trace_id_header=True, + tracing_data=tracing_data, ) ) From 8f711f899861d3b6e56d6042ceb9736a8427b3ef Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 16:01:31 +0200 Subject: [PATCH 16/62] fix pylint ignore --- packages/service-library/src/servicelib/aiohttp/tracing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 910fdd3f48f1..8825211e9779 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -109,7 +109,9 @@ def _startup( ) # Add the span processor to the tracer provider - tracing_data.tracer_provider.add_span_processor(_create_span_processor(tracing_destination)) # type: ignore[attr-defined] # https://github.com/open-telemetry/opentelemetry-python/issues/3713 + tracing_data.tracer_provider.add_span_processor( + _create_span_processor(tracing_destination) + ) # Instrument aiohttp server # Explanation for custom middleware call DK 10/2024: # OpenTelemetry Aiohttp autoinstrumentation is meant to be used by only calling `AioHttpServerInstrumentor().instrument()` From 8e5605a1051bad3b5b93085745e218f632576eda Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 16:15:53 +0200 Subject: [PATCH 17/62] attach tracing_data to app in webserver --- .../src/simcore_service_webserver/tracing.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index 33e55c19f577..d9db28a5c2f7 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -1,4 +1,5 @@ import logging +from typing import Final from aiohttp import web from servicelib.aiohttp.tracing import get_tracing_lifespan @@ -7,11 +8,12 @@ from ._meta import APP_NAME from .application_keys import APP_SETTINGS_APPKEY -from .application_settings import get_application_settings from .application_setup import ModuleCategory, app_setup_func log = logging.getLogger(__name__) +_TRACING_DATA_KEY: Final[str] = "tracing_data" + def get_plugin_settings(app: web.Application) -> TracingSettings: settings = app[APP_SETTINGS_APPKEY].WEBSERVER_TRACING @@ -20,6 +22,12 @@ def get_plugin_settings(app: web.Application) -> TracingSettings: return settings +def _setup_tracing_data(app: web.Application, tracing_settings: TracingSettings): + app[_TRACING_DATA_KEY] = TracingData.create( + tracing_settings=tracing_settings, service_name=APP_NAME + ) + + @app_setup_func( __name__, ModuleCategory.ADDON, settings_name="WEBSERVER_TRACING", logger=log ) @@ -34,17 +42,14 @@ def setup_app_tracing(app: web.Application): """ - app_settings = get_application_settings(app) tracing_settings: TracingSettings = get_plugin_settings(app) - tracing_data = TracingData.create( - tracing_settings=tracing_settings, service_name=APP_NAME - ) + _setup_tracing_data(app, tracing_settings=tracing_settings) app.cleanup_ctx.append( get_tracing_lifespan( app=app, tracing_settings=tracing_settings, add_response_trace_id_header=True, - tracing_data=tracing_data, + tracing_data=app[_TRACING_DATA_KEY], ) ) From dbb4e64ff1ccb82e8981d82d3dc73dc48d1ba598 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 16:17:25 +0200 Subject: [PATCH 18/62] fix test --- packages/service-library/tests/fastapi/test_http_client_thin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-library/tests/fastapi/test_http_client_thin.py b/packages/service-library/tests/fastapi/test_http_client_thin.py index caaadfde67fc..eed9331fb5bf 100644 --- a/packages/service-library/tests/fastapi/test_http_client_thin.py +++ b/packages/service-library/tests/fastapi/test_http_client_thin.py @@ -72,7 +72,7 @@ def request_timeout() -> int: @pytest.fixture async def thick_client(request_timeout: int) -> AsyncIterable[FakeThickClient]: async with FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None ) as client: yield client From 0897ada7e56f53e344169754feb8e8c11fec4905 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 29 Sep 2025 16:48:12 +0200 Subject: [PATCH 19/62] bugfix for aiohttp --- packages/service-library/src/servicelib/aiohttp/tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 8825211e9779..dd1c46af5ac1 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -132,7 +132,7 @@ def _startup( # - opentelemetry-instrumentation==0.48b0 # Instrument aiohttp client - AioHttpClientInstrumentor().instrument(tracer_provier=tracing_data.tracer_provider) + AioHttpClientInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) if HAS_AIOPG: with log_context( _logger, From 869c2a795cbfdc493b9e65450a044d06125fe141 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 30 Sep 2025 10:09:53 +0200 Subject: [PATCH 20/62] simplify tests --- .../tests/aiohttp/test_tracing.py | 16 ++++++++-------- .../tests/fastapi/test_tracing.py | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index ae35e084f343..dd25d1cc1995 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -257,18 +257,18 @@ async def make_request(): await client.get("/") await asyncio.gather(*(make_request() for _ in range(n_requests))) - spans = mock_otel_collector.get_finished_spans() - trace_ids = set() - for span in spans: - if span.context is not None: - trace_ids.add(span.context.trace_id) - num_traces = len(trace_ids) + trace_ids = { + span.context.trace_id + for span in mock_otel_collector.get_finished_spans() + if span.context is not None + } + n_traces = len(trace_ids) expected_num_traces = int( tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests ) tolerance = int(tolerance_probability * expected_num_traces) assert ( expected_num_traces - tolerance - <= num_traces + <= n_traces <= expected_num_traces + tolerance - ), f"Expected roughly {expected_num_traces} distinct trace ids, got {num_traces}" + ), f"Expected roughly {expected_num_traces} distinct trace ids, got {n_traces}" diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 38c3232927ea..b09574357d76 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -354,12 +354,12 @@ async def handler(): client = TestClient(mocked_app) for _ in range(n_requests): client.get("/") - spans = mock_otel_collector.get_finished_spans() - trace_ids = set() - for span in spans: - if span.context is not None: - trace_ids.add(span.context.trace_id) - num_traces = len(trace_ids) + trace_ids = { + span.context.trace_id + for span in mock_otel_collector.get_finished_spans() + if span.context is not None + } + n_traces = len(trace_ids) expected_num_traces = int( tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests ) @@ -367,6 +367,6 @@ async def handler(): tolerance = int(tolerance_probability * expected_num_traces) assert ( expected_num_traces - tolerance - <= num_traces + <= n_traces <= expected_num_traces + tolerance - ), f"Expected roughly {expected_num_traces} distinct trace ids, got {num_traces}" + ), f"Expected roughly {expected_num_traces} distinct trace ids, got {n_traces}" From 4883380ea5870a9facf7614d91014986f3f971bc Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 30 Sep 2025 15:27:29 +0200 Subject: [PATCH 21/62] fix test for profiles span --- .../service-library/src/servicelib/tracing.py | 72 ++++++++----------- .../tests/fastapi/test_tracing.py | 18 ++--- 2 files changed, 40 insertions(+), 50 deletions(-) diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index b97228b3e292..c3a5425be6e1 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -1,9 +1,7 @@ -from collections.abc import Callable, Coroutine from contextlib import contextmanager from contextvars import Token from dataclasses import dataclass -from functools import wraps -from typing import Any, Final, Self, TypeAlias +from typing import Final, Self, TypeAlias import pyinstrument import pyinstrument.renderers @@ -61,44 +59,6 @@ def get_trace_id_header() -> dict[str, str] | None: return None -def with_profiled_span( - func: Callable[..., Coroutine[Any, Any, Any]], -) -> Callable[..., Coroutine[Any, Any, Any]]: - """Decorator that wraps an async function in an OpenTelemetry span with pyinstrument profiling.""" - - @wraps(func) - async def wrapper(*args: Any, **kwargs: Any) -> Any: - if not _is_tracing(): - return await func(*args, **kwargs) - - tracer = trace.get_tracer(_TRACER_NAME) - span_name = f"{func.__module__}.{func.__qualname__}" - - with tracer.start_as_current_span(span_name) as span: - profiler = pyinstrument.Profiler(async_mode="enabled") - profiler.start() - - try: - return await func(*args, **kwargs) - - except Exception as e: - span.record_exception(e) - span.set_status(trace.Status(trace.StatusCode.ERROR, f"{e}")) - raise - - finally: - profiler.stop() - renderer = pyinstrument.renderers.ConsoleRenderer( - unicode=True, color=False, show_all=True - ) - span.set_attribute( - _PROFILE_ATTRIBUTE_NAME, - profiler.output(renderer=renderer), - ) - - return wrapper - - @dataclass class TracingData: service_name: str @@ -115,3 +75,33 @@ def create(cls, tracing_settings: TracingSettings, service_name: str) -> Self: service_name=service_name, tracer_provider=trace_provider, ) + + +@contextmanager +def profiled_span(*, tracing_data: TracingData, span_name: str): + if not _is_tracing(): + return + tracer = trace.get_tracer( + _TRACER_NAME, tracer_provider=tracing_data.tracer_provider + ) + with tracer.start_as_current_span(span_name) as span: + profiler = pyinstrument.Profiler(async_mode="enabled") + profiler.start() + + try: + yield + + except Exception as e: + span.record_exception(e) + span.set_status(trace.Status(trace.StatusCode.ERROR, f"{e}")) + raise + + finally: + profiler.stop() + renderer = pyinstrument.renderers.ConsoleRenderer( + unicode=True, color=False, show_all=True + ) + span.set_attribute( + _PROFILE_ATTRIBUTE_NAME, + profiler.output(renderer=renderer), + ) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index b09574357d76..4447af8126e4 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -25,7 +25,7 @@ _OSPARC_TRACE_ID_HEADER, _PROFILE_ATTRIBUTE_NAME, TracingData, - with_profiled_span, + profiled_span, ) from settings_library.tracing import TracingSettings @@ -280,15 +280,15 @@ async def test_with_profile_span( handler_data = dict() - @with_profiled_span async def handler(handler_data: dict): - current_span = trace.get_current_span() - handler_data[_OSPARC_TRACE_ID_HEADER] = format( - current_span.get_span_context().trace_id, "032x" - ) - if isinstance(server_response, HTTPException): - raise server_response - return server_response + with profiled_span(tracing_data=tracing_data, span_name="my favorite span"): + current_span = trace.get_current_span() + handler_data[_OSPARC_TRACE_ID_HEADER] = format( + current_span.get_span_context().trace_id, "032x" + ) + if isinstance(server_response, HTTPException): + raise server_response + return server_response mocked_app.get("/")(partial(handler, handler_data)) From 7dd9918611d1c346080f5d8d7de4d750983acadf Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 30 Sep 2025 15:27:56 +0200 Subject: [PATCH 22/62] remove profiled spans from codebase --- .../director_v2/_controller/computations_rest.py | 2 -- .../_controller/rest/user_notification_rest.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/director_v2/_controller/computations_rest.py b/services/web/server/src/simcore_service_webserver/director_v2/_controller/computations_rest.py index 1b204b21e4b1..299c2574b7ba 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/_controller/computations_rest.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/_controller/computations_rest.py @@ -28,7 +28,6 @@ ) from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.rest_constants import RESPONSE_MODEL_POLICY -from servicelib.tracing import with_profiled_span from ..._meta import API_VTAG as VTAG from ...constants import RQ_PRODUCT_KEY @@ -203,7 +202,6 @@ async def list_computations_latest_iteration_tasks( name="list_computation_collection_runs", ) @login_required -@with_profiled_span @permission_required("services.pipeline.*") @permission_required("project.read") async def list_computation_collection_runs(request: web.Request) -> web.Response: diff --git a/services/web/server/src/simcore_service_webserver/user_notifications/_controller/rest/user_notification_rest.py b/services/web/server/src/simcore_service_webserver/user_notifications/_controller/rest/user_notification_rest.py index 679179857025..010d15a325ff 100644 --- a/services/web/server/src/simcore_service_webserver/user_notifications/_controller/rest/user_notification_rest.py +++ b/services/web/server/src/simcore_service_webserver/user_notifications/_controller/rest/user_notification_rest.py @@ -9,7 +9,6 @@ parse_request_body_as, parse_request_path_parameters_as, ) -from servicelib.tracing import with_profiled_span from ...._meta import API_VTAG from ....login.decorators import login_required @@ -74,7 +73,6 @@ async def mark_notification_as_read(request: web.Request) -> web.Response: @routes.get(f"/{API_VTAG}/me/permissions", name="list_user_permissions") @login_required -@with_profiled_span @permission_required("user.permissions.read") async def list_user_permissions(request: web.Request) -> web.Response: req_ctx = UsersRequestContext.model_validate(request) From 40cc94a0884f0c085f949a48e713c551f765edb9 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 1 Oct 2025 11:09:38 +0200 Subject: [PATCH 23/62] implement aiohttp middleware to support TracerProvider --- .../src/servicelib/aiohttp/tracing.py | 75 ++++++++++++++++++- .../src/servicelib/fastapi/tracing.py | 3 +- .../service-library/src/servicelib/tracing.py | 24 +++--- .../tests/aiohttp/test_tracing.py | 28 +++---- 4 files changed, 95 insertions(+), 35 deletions(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index dd1c46af5ac1..6d276ea04e65 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -1,10 +1,12 @@ """Adds aiohttp middleware for tracing using opentelemetry instrumentation.""" import logging +import time from collections.abc import AsyncIterator, Callable from typing import Final from aiohttp import web +from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( OTLPSpanExporter as OTLPSpanExporterHTTP, ) @@ -12,7 +14,15 @@ AioHttpClientInstrumentor, ) from opentelemetry.instrumentation.aiohttp_server import ( - middleware as aiohttp_server_opentelemetry_middleware, # pylint:disable=no-name-in-module + MetricInstruments, + _parse_active_request_count_attrs, + _parse_duration_attrs, + collect_request_attributes, + extract, + get_default_span_details, + getter, + meter, + set_status_code, ) from opentelemetry.sdk.trace import SpanProcessor from opentelemetry.sdk.trace.export import BatchSpanProcessor @@ -23,6 +33,9 @@ from ..tracing import TracingData, get_trace_id_header _logger = logging.getLogger(__name__) + +TRACING_DATA_KEY: Final[str] = "tracing_data" + try: from opentelemetry.instrumentation.botocore import ( # type: ignore[import-not-found] BotocoreInstrumentor, @@ -63,6 +76,56 @@ ) +@web.middleware +async def aiohttp_server_opentelemetry_middleware(request: web.Request, handler): + """This middleware is extracted from https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py + and adapted to allow passing the tracer provider via the app instead of using the global object. The original code for the function is licensed under https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/LICENSE. + I have recorded this limitation in the official source here: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3801 and plan on providing a fix soon. + """ + + span_name, additional_attributes = get_default_span_details(request) + + req_attrs = collect_request_attributes(request) + duration_attrs = _parse_duration_attrs(req_attrs) + active_requests_count_attrs = _parse_active_request_count_attrs(req_attrs) + + duration_histogram = meter.create_histogram( + name=MetricInstruments.HTTP_SERVER_DURATION, + unit="ms", + description="Measures the duration of inbound HTTP requests.", + ) + + active_requests_counter = meter.create_up_down_counter( + name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS, + unit="requests", + description="measures the number of concurrent HTTP requests those are currently in flight", + ) + tracing_data = request.app[TRACING_DATA_KEY] + assert isinstance(tracing_data, TracingData) + tracer = tracing_data.tracer_provider.get_tracer(__name__) + with tracer.start_as_current_span( + span_name, + context=extract(request, getter=getter), + kind=trace.SpanKind.SERVER, + ) as span: + attributes = collect_request_attributes(request) + attributes.update(additional_attributes) + span.set_attributes(attributes) + start = time.perf_counter() + active_requests_counter.add(1, active_requests_count_attrs) + try: + resp = await handler(request) + set_status_code(span, resp.status) + except web.HTTPException as ex: + set_status_code(span, ex.status_code) + raise + finally: + duration = max((time.perf_counter() - start) * 1000, 0) + duration_histogram.record(duration, duration_attrs) + active_requests_counter.add(-1, active_requests_count_attrs) + return resp + + def _create_span_processor(tracing_destination: str) -> SpanProcessor: otlp_exporter = OTLPSpanExporterHTTP( endpoint=tracing_destination, @@ -80,7 +143,6 @@ def _startup( """ Sets up this service for a distributed tracing system (opentelemetry) """ - _ = app opentelemetry_collector_endpoint = ( f"{tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT}" ) @@ -228,13 +290,18 @@ def _shutdown(tracing_data: TracingData) -> None: _logger.exception("Failed to uninstrument AioPikaInstrumentor") -def get_tracing_lifespan( +def setup_tracing( *, app: web.Application, tracing_settings: TracingSettings, - tracing_data: TracingData, + service_name: str, add_response_trace_id_header: bool = False, ) -> Callable[[web.Application], AsyncIterator]: + + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) + app[TRACING_DATA_KEY] = tracing_data _startup( app=app, tracing_settings=tracing_settings, diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 5d1379186c29..665510d1f6f1 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -12,7 +12,7 @@ ) from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor -from opentelemetry.sdk.trace import SpanProcessor, TracerProvider +from opentelemetry.sdk.trace import SpanProcessor from opentelemetry.sdk.trace.export import BatchSpanProcessor from settings_library.tracing import TracingSettings from starlette.middleware.base import BaseHTTPMiddleware @@ -84,7 +84,6 @@ def _startup(tracing_settings: TracingSettings, tracing_data: TracingData) -> No ): _logger.warning("Skipping opentelemetry tracing setup") return - assert isinstance(tracing_data.tracer_provider, TracerProvider) # nosec opentelemetry_collector_endpoint: str = ( f"{tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT}" diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index c3a5425be6e1..54fa0c567f1d 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -47,18 +47,6 @@ def setup_log_tracing(tracing_settings: TracingSettings): LoggingInstrumentor().instrument(set_logging_format=False) -def get_trace_id_header() -> dict[str, str] | None: - """Generates a dictionary containing the trace ID header if tracing is active.""" - span = trace.get_current_span() - if span.is_recording(): - trace_id = span.get_span_context().trace_id - trace_id_hex = format( - trace_id, "032x" - ) # Convert trace_id to 32-character hex string - return {_OSPARC_TRACE_ID_HEADER: trace_id_hex} - return None - - @dataclass class TracingData: service_name: str @@ -77,6 +65,18 @@ def create(cls, tracing_settings: TracingSettings, service_name: str) -> Self: ) +def get_trace_id_header() -> dict[str, str] | None: + """Generates a dictionary containing the trace ID header if tracing is active.""" + span = trace.get_current_span() + if span.is_recording(): + trace_id = span.get_span_context().trace_id + trace_id_hex = format( + trace_id, "032x" + ) # Convert trace_id to 32-character hex string + return {_OSPARC_TRACE_ID_HEADER: trace_id_hex} + return None + + @contextmanager def profiled_span(*, tracing_data: TracingData, span_name: str): if not _is_tracing(): diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index dd25d1cc1995..d68a46ff514d 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -15,7 +15,7 @@ from opentelemetry import trace from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from pydantic import ValidationError -from servicelib.aiohttp.tracing import get_tracing_lifespan +from servicelib.aiohttp.tracing import setup_tracing from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingData from settings_library.tracing import TracingSettings @@ -70,11 +70,8 @@ async def test_valid_tracing_settings( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( - tracing_settings=tracing_settings, service_name=service_name - ) - async for _ in get_tracing_lifespan( - app=app, tracing_settings=tracing_settings, tracing_data=tracing_data + async for _ in setup_tracing( + app=app, tracing_settings=tracing_settings, service_name=service_name )(app): pass @@ -150,15 +147,12 @@ async def test_tracing_setup_package_detection( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( - tracing_settings=tracing_settings, service_name=service_name - ) - async for _ in get_tracing_lifespan( - app=app, tracing_settings=tracing_settings, tracing_data=tracing_data + async for _ in setup_tracing( + app=app, tracing_settings=tracing_settings, service_name=service_name )(app): # idempotency - async for _ in get_tracing_lifespan( - app=app, tracing_settings=tracing_settings, tracing_data=tracing_data + async for _ in setup_tracing( + app=app, tracing_settings=tracing_settings, service_name=service_name )(app): pass @@ -199,10 +193,10 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: handler_data = dict() app.router.add_get("/", partial(handler, handler_data)) - async for _ in get_tracing_lifespan( + async for _ in setup_tracing( app=app, tracing_settings=tracing_settings, - tracing_data=tracing_data, + service_name=service_name, add_response_trace_id_header=True, )(app): client = await aiohttp_client(app) @@ -248,8 +242,8 @@ async def handler(request: web.Request) -> web.Response: app.router.add_get("/", handler) - async for _ in get_tracing_lifespan( - app=app, tracing_settings=tracing_settings, tracing_data=tracing_data + async for _ in setup_tracing( + app=app, tracing_settings=tracing_settings, service_name=service_name )(app): client = await aiohttp_client(app) From dc8ea567e3179871312d98aff6278b2667f27e71 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 1 Oct 2025 11:11:59 +0200 Subject: [PATCH 24/62] further changes --- .../src/simcore_service_webserver/tracing.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index d9db28a5c2f7..6e4893ddf4ba 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -1,9 +1,7 @@ import logging -from typing import Final from aiohttp import web -from servicelib.aiohttp.tracing import get_tracing_lifespan -from servicelib.tracing import TracingData +from servicelib.aiohttp.tracing import setup_tracing from settings_library.tracing import TracingSettings from ._meta import APP_NAME @@ -12,8 +10,6 @@ log = logging.getLogger(__name__) -_TRACING_DATA_KEY: Final[str] = "tracing_data" - def get_plugin_settings(app: web.Application) -> TracingSettings: settings = app[APP_SETTINGS_APPKEY].WEBSERVER_TRACING @@ -22,12 +18,6 @@ def get_plugin_settings(app: web.Application) -> TracingSettings: return settings -def _setup_tracing_data(app: web.Application, tracing_settings: TracingSettings): - app[_TRACING_DATA_KEY] = TracingData.create( - tracing_settings=tracing_settings, service_name=APP_NAME - ) - - @app_setup_func( __name__, ModuleCategory.ADDON, settings_name="WEBSERVER_TRACING", logger=log ) @@ -43,13 +33,12 @@ def setup_app_tracing(app: web.Application): """ tracing_settings: TracingSettings = get_plugin_settings(app) - _setup_tracing_data(app, tracing_settings=tracing_settings) app.cleanup_ctx.append( - get_tracing_lifespan( + setup_tracing( app=app, tracing_settings=tracing_settings, add_response_trace_id_header=True, - tracing_data=app[_TRACING_DATA_KEY], + service_name=APP_NAME, ) ) From 63ac26acfcd928543a29039e401da774a126984e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 1 Oct 2025 13:50:44 +0200 Subject: [PATCH 25/62] start porting the log instrumentation --- .../service-library/src/servicelib/logging_utils.py | 10 ++++++++-- packages/service-library/src/servicelib/tracing.py | 12 +++++++----- .../celery_worker/worker_main.py | 8 ++++++++ .../src/simcore_service_dask_sidecar/scheduler.py | 1 - .../src/simcore_service_dask_sidecar/utils/logs.py | 1 + .../modules/celery/worker_main.py | 8 ++++++++ 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/packages/service-library/src/servicelib/logging_utils.py b/packages/service-library/src/servicelib/logging_utils.py index 27bd08dd87f6..b94fabb51f6a 100644 --- a/packages/service-library/src/servicelib/logging_utils.py +++ b/packages/service-library/src/servicelib/logging_utils.py @@ -29,7 +29,7 @@ ) from settings_library.tracing import TracingSettings -from .tracing import setup_log_tracing +from .tracing import TracingData, setup_log_tracing from .utils_secrets import mask_sensitive_data _logger = logging.getLogger(__name__) @@ -183,6 +183,7 @@ def _configure_common_logging_settings( *, log_format_local_dev_enabled: bool, tracing_settings: TracingSettings | None, + tracing_data: TracingData | None, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> logging.Formatter: @@ -195,7 +196,8 @@ def _configure_common_logging_settings( if noisy_loggers is not None: _dampen_noisy_loggers(noisy_loggers) if tracing_settings is not None: - setup_log_tracing(tracing_settings=tracing_settings) + assert tracing_data is not None # nosec + setup_log_tracing(tracing_settings=tracing_settings, tracing_data=tracing_data) return _setup_logging_formatter( log_format_local_dev_enabled=log_format_local_dev_enabled, @@ -221,6 +223,7 @@ def setup_loggers( log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], tracing_settings: TracingSettings | None, + tracing_data: TracingData | None, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> None: @@ -263,6 +266,7 @@ def setup_loggers( formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, tracing_settings=tracing_settings, + tracing_data=tracing_data, log_base_level=log_base_level, noisy_loggers=noisy_loggers, ) @@ -329,6 +333,7 @@ def async_loggers( log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], tracing_settings: TracingSettings | None, + tracing_data: TracingData | None, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Iterator[None]: @@ -377,6 +382,7 @@ def async_loggers( formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, tracing_settings=tracing_settings, + tracing_data=tracing_data, log_base_level=log_base_level, noisy_loggers=noisy_loggers, ) diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index 54fa0c567f1d..74ae8e6ea51a 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -42,11 +42,6 @@ def use_tracing_context(context: TracingContext): otcontext.detach(token) -def setup_log_tracing(tracing_settings: TracingSettings): - _ = tracing_settings - LoggingInstrumentor().instrument(set_logging_format=False) - - @dataclass class TracingData: service_name: str @@ -65,6 +60,13 @@ def create(cls, tracing_settings: TracingSettings, service_name: str) -> Self: ) +def setup_log_tracing(tracing_settings: TracingSettings, tracing_data: TracingData): + _ = tracing_settings + LoggingInstrumentor().instrument( + set_logging_format=False, tracer_provider=tracing_data.tracer_provider + ) + + def get_trace_id_header() -> dict[str, str] | None: """Generates a dictionary containing the trace ID header if tracing is active.""" span = trace.get_current_span() diff --git a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py index 82881b6af698..e4c39b116aba 100644 --- a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py +++ b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py @@ -8,6 +8,7 @@ ) from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.logging_utils import setup_loggers +from servicelib.tracing import TracingData from ..core.application import create_app from ..core.settings import ApplicationSettings @@ -16,11 +17,18 @@ def get_app(): _settings = ApplicationSettings.create_from_envs() + tracing_data: TracingData | None = None + if _settings.API_SERVER_TRACING: + tracing_data = TracingData.create( + tracing_settings=_settings.API_SERVER_TRACING, + service_name="api-server-celery-worker", + ) setup_loggers( log_format_local_dev_enabled=_settings.API_SERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.API_SERVER_LOG_FILTER_MAPPING, tracing_settings=_settings.API_SERVER_TRACING, + tracing_data=tracing_data, log_base_level=_settings.log_level, noisy_loggers=None, ) diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/scheduler.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/scheduler.py index 0813da017416..9a17363136bd 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/scheduler.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/scheduler.py @@ -16,7 +16,6 @@ async def dask_setup(scheduler: distributed.Scheduler) -> None: """This is a special function recognized by dask when starting with flag --preload""" assert scheduler # nosec - settings = ApplicationSettings.create_from_envs() setup_app_logging(settings) diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index 76eaef674313..0252179065a6 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -16,6 +16,7 @@ def setup_app_logging(settings: ApplicationSettings) -> None: log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=settings.DASK_LOG_FILTER_MAPPING, tracing_settings=None, # no tracing for dask sidecar + tracing_data=None, log_base_level=settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index f2e90e900244..2b34b921086c 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -8,17 +8,25 @@ ) from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.logging_utils import setup_loggers +from servicelib.tracing import TracingData from ...api._worker_tasks.tasks import setup_worker_tasks from ...core.application import create_app from ...core.settings import ApplicationSettings _settings = ApplicationSettings.create_from_envs() +_tracing_data: TracingData | None = None +if _settings.STORAGE_TRACING: + _tracing_data = TracingData.create( + tracing_settings=_settings.STORAGE_TRACING, + service_name="storage-celery-worker", + ) setup_loggers( log_format_local_dev_enabled=_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.STORAGE_LOG_FILTER_MAPPING, tracing_settings=_settings.STORAGE_TRACING, + tracing_data=_tracing_data, log_base_level=_settings.log_level, noisy_loggers=None, ) From b4718a2e8a91e2326421548842f9286a9731b4f9 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 6 Oct 2025 15:29:41 +0200 Subject: [PATCH 26/62] start factoring out TracingData --- .../servicelib/fastapi/logging_lifespan.py | 10 +- .../src/servicelib/fastapi/tracing.py | 117 +++++++----------- .../src/servicelib/logging_utils.py | 17 +-- .../service-library/src/servicelib/tracing.py | 48 ++++--- .../simcore_service_agent/core/application.py | 16 ++- .../agent/src/simcore_service_agent/main.py | 10 +- .../celery_worker/worker_main.py | 15 +-- .../core/application.py | 17 ++- .../src/simcore_service_api_server/main.py | 10 +- .../core/application.py | 13 +- .../core/application.py | 10 +- .../src/simcore_service_catalog/main.py | 13 +- .../utils/logs.py | 3 +- .../modules/celery/worker_main.py | 1 - 14 files changed, 157 insertions(+), 143 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/logging_lifespan.py b/packages/service-library/src/servicelib/fastapi/logging_lifespan.py index 035d9bc10aa7..dd147c269b31 100644 --- a/packages/service-library/src/servicelib/fastapi/logging_lifespan.py +++ b/packages/service-library/src/servicelib/fastapi/logging_lifespan.py @@ -4,7 +4,7 @@ from common_library.logging.logging_utils_filtering import LoggerName, MessageSubstring from fastapi import FastAPI -from settings_library.tracing import TracingSettings +from servicelib.tracing import TracingData from ..logging_utils import ( LogLevelInt, @@ -20,7 +20,7 @@ def create_logging_lifespan( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_settings: TracingSettings | None, + tracing_data: TracingData, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Lifespan: @@ -32,7 +32,7 @@ def create_logging_lifespan( noisy_loggers=noisy_loggers, log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping=logger_filter_mapping, - tracing_settings=tracing_settings, + tracing_data=tracing_data, ) ) @@ -49,7 +49,7 @@ def create_logging_shutdown_event( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_settings: TracingSettings | None, + tracing_data: TracingData, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Callable[[], Awaitable[None]]: @@ -67,7 +67,7 @@ def create_logging_shutdown_event( noisy_loggers=noisy_loggers, log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping=logger_filter_mapping, - tracing_settings=tracing_settings, + tracing_data=tracing_data, ) ) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 665510d1f6f1..31f77dd93df3 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -2,7 +2,6 @@ import logging from collections.abc import AsyncIterator -from typing import overload from fastapi import FastAPI, Request from fastapi_lifespan_manager import State @@ -12,7 +11,7 @@ ) from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor -from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from settings_library.tracing import TracingSettings from starlette.middleware.base import BaseHTTPMiddleware @@ -77,7 +76,11 @@ def _create_span_processor(tracing_destination: str) -> SpanProcessor: return BatchSpanProcessor(otlp_exporter) -def _startup(tracing_settings: TracingSettings, tracing_data: TracingData) -> None: +def _startup( + tracing_settings: TracingSettings, + service_name: str, + tracer_provider: TracerProvider, +) -> None: if ( not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT and not tracing_settings.TRACING_OPENTELEMETRY_COLLECTOR_PORT @@ -95,13 +98,11 @@ def _startup(tracing_settings: TracingSettings, tracing_data: TracingData) -> No _logger.info( "Trying to connect service %s to opentelemetry tracing collector at %s.", - tracing_data.service_name, + service_name, tracing_destination, ) # Add the span processor to the tracer provider - tracing_data.tracer_provider.add_span_processor( - _create_span_processor(tracing_destination) - ) + tracer_provider.add_span_processor(_create_span_processor(tracing_destination)) if HAS_AIOPG: with log_context( @@ -109,95 +110,75 @@ def _startup(tracing_settings: TracingSettings, tracing_data: TracingData) -> No logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AiopgInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) + AiopgInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_AIOPIKA_INSTRUMENTOR: with log_context( _logger, logging.INFO, msg="Attempting to add aio_pika opentelemetry autoinstrumentation...", ): - AioPikaInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + AioPikaInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_ASYNCPG: with log_context( _logger, logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AsyncPGInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + AsyncPGInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_REDIS: with log_context( _logger, logging.INFO, msg="Attempting to add redis opentelemetry autoinstrumentation...", ): - RedisInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) + RedisInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_BOTOCORE: with log_context( _logger, logging.INFO, msg="Attempting to add botocore opentelemetry autoinstrumentation...", ): - BotocoreInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + BotocoreInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_REQUESTS: with log_context( _logger, logging.INFO, msg="Attempting to add requests opentelemetry autoinstrumentation...", ): - RequestsInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + RequestsInstrumentor().instrument(tracer_provider=tracer_provider) -def _shutdown(tracing_data: TracingData) -> None: +def _shutdown() -> None: """Uninstruments all opentelemetry instrumentors that were instrumented.""" - FastAPIInstrumentor().uninstrument(tracer_provider=tracing_data.tracer_provider) + FastAPIInstrumentor().uninstrument() if HAS_AIOPG: try: - AiopgInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + AiopgInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AiopgInstrumentor") if HAS_AIOPIKA_INSTRUMENTOR: try: - AioPikaInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + AioPikaInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AioPikaInstrumentor") if HAS_ASYNCPG: try: - AsyncPGInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + AsyncPGInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument AsyncPGInstrumentor") if HAS_REDIS: try: - RedisInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + RedisInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument RedisInstrumentor") if HAS_BOTOCORE: try: - BotocoreInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + BotocoreInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument BotocoreInstrumentor") if HAS_REQUESTS: try: - RequestsInstrumentor().uninstrument( - tracer_provider=tracing_data.tracer_provider - ) + RequestsInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught _logger.exception("Failed to uninstrument RequestsInstrumentor") @@ -223,28 +204,38 @@ def setup_httpx_client_tracing( ) -def setup_tracing( - app: FastAPI, tracing_settings: TracingSettings, service_name: str -) -> None: +def setup_tracing(app: FastAPI, tracing_data: TracingData) -> None: # NOTE: This does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - assert getattr(app.state, "tracing_data", None) is None - tracing_data = TracingData.create( - tracing_settings=tracing_settings, service_name=service_name + if not tracing_data.tracing_enabled: + msg = "Tracing is not enabled in tracing_data" + raise ValueError(msg) + assert tracing_data.tracing_settings # nosec + assert tracing_data.tracer_provider # nosec + + _startup( + tracing_settings=tracing_data.tracing_settings, + service_name=tracing_data.service_name, + tracer_provider=tracing_data.tracer_provider, ) - app.state.tracing_data = tracing_data - _startup(tracing_settings=tracing_settings, tracing_data=tracing_data) def _on_shutdown() -> None: - _shutdown(tracing_data=tracing_data) + _shutdown() app.add_event_handler("shutdown", _on_shutdown) -def get_tracing_instrumentation_lifespan( - tracing_settings: TracingSettings, tracing_data: TracingData -): +def get_tracing_instrumentation_lifespan(tracing_data: TracingData): # NOTE: This lifespan does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - _startup(tracing_settings=tracing_settings, tracing_data=tracing_data) + if not tracing_data.tracing_enabled: + msg = "Tracing is not enabled in tracing_data" + raise ValueError(msg) + assert tracing_data.tracing_settings # nosec + assert tracing_data.tracer_provider # nosec + _startup( + tracing_settings=tracing_data.tracing_settings, + service_name=tracing_data.service_name, + tracer_provider=tracing_data.tracer_provider, + ) async def tracing_instrumentation_lifespan( app: FastAPI, @@ -253,7 +244,7 @@ async def tracing_instrumentation_lifespan( yield {} - _shutdown(tracing_data=tracing_data) + _shutdown() return tracing_instrumentation_lifespan @@ -268,21 +259,7 @@ async def dispatch(self, request: Request, call_next): return response -@overload -def get_tracing_data( - app: FastAPI, tracing_settings: TracingSettings -) -> TracingData: ... - - -@overload -def get_tracing_data(app: FastAPI, tracing_settings: None) -> None: ... - - -def get_tracing_data( - app: FastAPI, tracing_settings: TracingSettings | None -) -> TracingData | None: - if tracing_settings is None: - return None +def get_tracing_data(app: FastAPI) -> TracingData: assert hasattr(app.state, "tracing_data"), "Tracing not setup for this app" # nosec assert isinstance(app.state.tracing_data, TracingData) return app.state.tracing_data diff --git a/packages/service-library/src/servicelib/logging_utils.py b/packages/service-library/src/servicelib/logging_utils.py index b94fabb51f6a..aec0fd2aca8e 100644 --- a/packages/service-library/src/servicelib/logging_utils.py +++ b/packages/service-library/src/servicelib/logging_utils.py @@ -27,7 +27,6 @@ LoggerName, MessageSubstring, ) -from settings_library.tracing import TracingSettings from .tracing import TracingData, setup_log_tracing from .utils_secrets import mask_sensitive_data @@ -182,8 +181,7 @@ def _dampen_noisy_loggers( def _configure_common_logging_settings( *, log_format_local_dev_enabled: bool, - tracing_settings: TracingSettings | None, - tracing_data: TracingData | None, + tracing_data: TracingData, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> logging.Formatter: @@ -195,10 +193,7 @@ def _configure_common_logging_settings( _setup_base_logging_level(log_base_level) if noisy_loggers is not None: _dampen_noisy_loggers(noisy_loggers) - if tracing_settings is not None: - assert tracing_data is not None # nosec - setup_log_tracing(tracing_settings=tracing_settings, tracing_data=tracing_data) - + setup_log_tracing(tracing_data=tracing_data) return _setup_logging_formatter( log_format_local_dev_enabled=log_format_local_dev_enabled, ) @@ -222,8 +217,7 @@ def setup_loggers( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_settings: TracingSettings | None, - tracing_data: TracingData | None, + tracing_data: TracingData, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> None: @@ -265,7 +259,6 @@ def setup_loggers( """ formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, - tracing_settings=tracing_settings, tracing_data=tracing_data, log_base_level=log_base_level, noisy_loggers=noisy_loggers, @@ -332,8 +325,7 @@ def async_loggers( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_settings: TracingSettings | None, - tracing_data: TracingData | None, + tracing_data: TracingData, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Iterator[None]: @@ -381,7 +373,6 @@ def async_loggers( """ formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, - tracing_settings=tracing_settings, tracing_data=tracing_data, log_base_level=log_base_level, noisy_loggers=noisy_loggers, diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index 74ae8e6ea51a..cdf36f62f628 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -1,6 +1,5 @@ from contextlib import contextmanager from contextvars import Token -from dataclasses import dataclass from typing import Final, Self, TypeAlias import pyinstrument @@ -11,6 +10,7 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased +from pydantic import BaseModel, model_validator from settings_library.tracing import TracingSettings TracingContext: TypeAlias = otcontext.Context | None @@ -42,29 +42,45 @@ def use_tracing_context(context: TracingContext): otcontext.detach(token) -@dataclass -class TracingData: +class TracingData(BaseModel): service_name: str - tracer_provider: TracerProvider + tracing_settings: TracingSettings | None + tracer_provider: TracerProvider | None + + @model_validator(mode="after") + def _check_tracing_fields(self): + if (self.tracing_settings is None) != (self.tracer_provider is None): + msg = "Both 'tracing_settings' and 'tracer_provider' must be None or both not None." + raise ValueError(msg) + return self + + @property + def tracing_enabled(self) -> bool: + return self.tracer_provider is not None and self.tracing_settings is not None @classmethod - def create(cls, tracing_settings: TracingSettings, service_name: str) -> Self: - resource = Resource(attributes={"service.name": service_name}) - sampler = ParentBased( - root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) - ) - trace_provider = TracerProvider(resource=resource, sampler=sampler) + def create( + cls, tracing_settings: TracingSettings | None, service_name: str + ) -> Self: + tracer_provider: TracerProvider | None = None + if tracing_settings: + resource = Resource(attributes={"service.name": service_name}) + sampler = ParentBased( + root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) + ) + tracer_provider = TracerProvider(resource=resource, sampler=sampler) return cls( service_name=service_name, - tracer_provider=trace_provider, + tracing_settings=tracing_settings, + tracer_provider=tracer_provider, ) -def setup_log_tracing(tracing_settings: TracingSettings, tracing_data: TracingData): - _ = tracing_settings - LoggingInstrumentor().instrument( - set_logging_format=False, tracer_provider=tracing_data.tracer_provider - ) +def setup_log_tracing(tracing_data: TracingData): + if tracing_data.tracing_enabled: + LoggingInstrumentor().instrument( + set_logging_format=False, tracer_provider=tracing_data.tracer_provider + ) def get_trace_id_header() -> dict[str, str] | None: diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index 60ca0c907202..809267ad46dc 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -11,6 +11,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VTAG, @@ -31,13 +32,19 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings | None = None) -> FastAPI: +def create_app( + settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None +) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() _logger.info( "Application settings: %s", json_dumps(settings, indent=2, sort_keys=True), ) + if tracing_data is None: + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=settings.AGENT_TRACING + ) assert settings.SC_BOOT_MODE # nosec app = FastAPI( @@ -50,9 +57,10 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: ) override_fastapi_openapi_method(app) app.state.settings = settings + app.state.tracing_data = tracing_data if settings.AGENT_TRACING: - setup_tracing(app, settings.AGENT_TRACING, APP_NAME) + setup_tracing(app, get_tracing_data(app)) setup_instrumentation(app) @@ -63,9 +71,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_rpc_api_routes(app) if settings.AGENT_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.AGENT_TRACING) - ) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/agent/src/simcore_service_agent/main.py b/services/agent/src/simcore_service_agent/main.py index 1af4eb695c24..9b68e5c98438 100644 --- a/services/agent/src/simcore_service_agent/main.py +++ b/services/agent/src/simcore_service_agent/main.py @@ -4,9 +4,12 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_agent.core.application import create_app from simcore_service_agent.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -19,10 +22,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.AGENT_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.AGENT_VOLUMES_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.AGENT_VOLUMES_LOG_FILTER_MAPPING, - tracing_settings=app_settings.AGENT_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -31,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py index e4c39b116aba..a150e0ab8a51 100644 --- a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py +++ b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py @@ -17,18 +17,15 @@ def get_app(): _settings = ApplicationSettings.create_from_envs() - tracing_data: TracingData | None = None - if _settings.API_SERVER_TRACING: - tracing_data = TracingData.create( - tracing_settings=_settings.API_SERVER_TRACING, - service_name="api-server-celery-worker", - ) - + _tracing_settings = _settings.API_SERVER_TRACING + _tracing_data = TracingData.create( + tracing_settings=_tracing_settings, + service_name="api-server-celery-worker", + ) setup_loggers( log_format_local_dev_enabled=_settings.API_SERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.API_SERVER_LOG_FILTER_MAPPING, - tracing_settings=_settings.API_SERVER_TRACING, - tracing_data=tracing_data, + tracing_data=_tracing_data, log_base_level=_settings.log_level, noisy_loggers=None, ) diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index c281918552e3..c8bd579af51a 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -7,10 +7,10 @@ from packaging.version import Version from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .. import exceptions from .._meta import API_VERSION, API_VTAG, APP_NAME @@ -50,14 +50,22 @@ def _label_title_and_version(settings: ApplicationSettings, title: str, version: return title, version -def create_app(settings: ApplicationSettings | None = None) -> FastAPI: +def create_app( + settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None +) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() _logger.info( "Application settings: %s", json_dumps(settings, indent=2, sort_keys=True), ) + if tracing_data is None: + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=settings.API_SERVER_TRACING + ) + assert settings # nosec + assert tracing_data # nosec # Labeling title = "osparc.io public API" @@ -81,9 +89,10 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: add_pagination(app) app.state.settings = settings + app.state.tracing_data = tracing_data if settings.API_SERVER_TRACING: - setup_tracing(app, settings.API_SERVER_TRACING, APP_NAME) + setup_tracing(app, tracing_data) if settings.API_SERVER_POSTGRES: setup_postgres(app) @@ -99,7 +108,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if settings.API_SERVER_TRACING: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_data(app, settings.API_SERVER_TRACING), + tracing_data=tracing_data, add_response_trace_id_header=True, ) diff --git a/services/api-server/src/simcore_service_api_server/main.py b/services/api-server/src/simcore_service_api_server/main.py index 6b8ccc1783f1..0a1e8921bdc0 100644 --- a/services/api-server/src/simcore_service_api_server/main.py +++ b/services/api-server/src/simcore_service_api_server/main.py @@ -6,9 +6,12 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_api_server.core.application import create_app from simcore_service_api_server.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -21,10 +24,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.API_SERVER_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.API_SERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.API_SERVER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.API_SERVER_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -33,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index 4fd66ac489c1..648c554523da 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -2,10 +2,10 @@ from fastapi import FastAPI from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -35,7 +35,7 @@ logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: app = FastAPI( debug=settings.AUTOSCALING_DEBUG, title=APP_NAME, @@ -47,11 +47,12 @@ def create_app(settings: ApplicationSettings) -> FastAPI: ) # STATE app.state.settings = settings + app.state.tracing_data = tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP if app.state.settings.AUTOSCALING_TRACING: - setup_tracing(app, app.state.settings.AUTOSCALING_TRACING, APP_NAME) + setup_tracing(app, tracing_data=tracing_data) setup_instrumentation(app) setup_api_routes(app) @@ -61,10 +62,8 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_ssm(app) setup_redis(app) - if settings.AUTOSCALING_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.AUTOSCALING_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) setup_auto_scaler_background_task(app) setup_warm_buffer_machines_pool_task(app) diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index 7c2a93a094b4..b73a18bc01ab 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -15,12 +15,12 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from starlette.middleware.base import BaseHTTPMiddleware from .._meta import ( API_VERSION, API_VTAG, - APP_NAME, PROJECT_NAME, SUMMARY, ) @@ -33,6 +33,7 @@ def create_app( *, + tracing_data: TracingData, settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, ) -> FastAPI: @@ -58,17 +59,16 @@ def create_app( # STATE app.state.settings = settings + app.state.tracing_data = tracing_data # MIDDLEWARES if settings.CATALOG_TRACING: - setup_tracing(app, settings.CATALOG_TRACING, service_name=APP_NAME) + setup_tracing(app, tracing_data=get_tracing_data(app)) if settings.CATALOG_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if settings.CATALOG_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.CATALOG_TRACING) - ) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION: # middleware to time requests (ONLY for development) diff --git a/services/catalog/src/simcore_service_catalog/main.py b/services/catalog/src/simcore_service_catalog/main.py index 60f5da962d47..c863df057564 100644 --- a/services/catalog/src/simcore_service_catalog/main.py +++ b/services/catalog/src/simcore_service_catalog/main.py @@ -6,6 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_lifespan +from servicelib.tracing import TracingData from simcore_service_catalog.core.application import create_app from simcore_service_catalog.core.settings import ApplicationSettings @@ -24,10 +25,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + tracing_settings=app_settings.CATALOG_TRACING, + service_name="catalog", + ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.CATALOG_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.CATALOG_LOG_FILTER_MAPPING, - tracing_settings=app_settings.CATALOG_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -37,4 +42,8 @@ def app_factory() -> FastAPI: json_dumps(app_settings, indent=2, sort_keys=True), ) - return create_app(settings=app_settings, logging_lifespan=logging_lifespan) + return create_app( + settings=app_settings, + tracing_data=tracing_data, + logging_lifespan=logging_lifespan, + ) diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index 0252179065a6..d8c52b7eb7d6 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -15,8 +15,7 @@ def setup_app_logging(settings: ApplicationSettings) -> None: setup_loggers( log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=settings.DASK_LOG_FILTER_MAPPING, - tracing_settings=None, # no tracing for dask sidecar - tracing_data=None, + tracing_data=None, # no tracing for the sidecar log_base_level=settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index 2b34b921086c..2c4dc4ad4e6a 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -25,7 +25,6 @@ setup_loggers( log_format_local_dev_enabled=_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.STORAGE_LOG_FILTER_MAPPING, - tracing_settings=_settings.STORAGE_TRACING, tracing_data=_tracing_data, log_base_level=_settings.log_level, noisy_loggers=None, From 972eb5976be27b9279ea4568e03bab20fa452216 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 6 Oct 2025 16:38:35 +0200 Subject: [PATCH 27/62] refactor tracing_data creation --- .../src/servicelib/fastapi/client_session.py | 4 +--- .../core/application.py | 2 +- .../src/simcore_service_autoscaling/main.py | 10 ++++++-- .../core/application.py | 9 ++++---- .../core/application.py | 16 ++++++------- .../simcore_service_clusters_keeper/main.py | 10 ++++++-- .../core/application.py | 16 ++++++------- .../simcore_service_datcore_adapter/main.py | 10 ++++++-- .../core/application.py | 19 ++++++++------- .../modules/dynamic_services.py | 9 +++----- .../core/application.py | 17 +++++++------- .../src/simcore_service_director/main.py | 9 ++++++-- .../core/application.py | 23 +++++++++++-------- .../core/application.py | 21 ++++++++++------- .../src/simcore_service_efs_guardian/main.py | 9 ++++++-- .../core/application.py | 18 +++++++++------ .../src/simcore_service_invitations/main.py | 9 ++++++-- .../core/application.py | 17 ++++++++------ .../src/simcore_service_notifications/main.py | 14 +++++++++-- .../core/application.py | 21 +++++++++-------- .../src/simcore_service_payments/main.py | 9 ++++++-- .../core/application.py | 13 +++++------ .../main.py | 9 ++++++-- .../core/application.py | 19 +++++++-------- .../src/simcore_service_storage/main.py | 10 ++++++-- .../modules/celery/worker_main.py | 12 ++++------ services/storage/tests/conftest.py | 15 ++++++++++-- .../test__legacy_storage_sdk_compatibility.py | 7 +++++- 28 files changed, 220 insertions(+), 137 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/client_session.py b/packages/service-library/src/servicelib/fastapi/client_session.py index 059a51005ea6..615b05312d6e 100644 --- a/packages/service-library/src/servicelib/fastapi/client_session.py +++ b/packages/service-library/src/servicelib/fastapi/client_session.py @@ -3,7 +3,6 @@ import httpx from fastapi import FastAPI from servicelib.tracing import TracingData -from settings_library.tracing import TracingSettings from .tracing import setup_httpx_client_tracing @@ -13,7 +12,6 @@ def setup_client_session( *, default_timeout: datetime.timedelta = datetime.timedelta(seconds=20), max_keepalive_connections: int = 20, - tracing_settings: TracingSettings | None, tracing_data: TracingData | None ) -> None: async def on_startup() -> None: @@ -22,7 +20,7 @@ async def on_startup() -> None: limits=httpx.Limits(max_keepalive_connections=max_keepalive_connections), timeout=default_timeout.total_seconds(), ) - if tracing_settings and tracing_data: + if tracing_data: setup_httpx_client_tracing(session, tracing_data=tracing_data) app.state.aiohttp_client_session = session diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index 648c554523da..b7b44e1c2157 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -51,7 +51,7 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> Fast assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app.state.settings.AUTOSCALING_TRACING: + if tracing_data.tracing_enabled: setup_tracing(app, tracing_data=tracing_data) setup_instrumentation(app) diff --git a/services/autoscaling/src/simcore_service_autoscaling/main.py b/services/autoscaling/src/simcore_service_autoscaling/main.py index b1f7055d75df..5b709d8e6a80 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/main.py +++ b/services/autoscaling/src/simcore_service_autoscaling/main.py @@ -5,10 +5,13 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI +from servicelib import tracing from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event from simcore_service_autoscaling.core.application import create_app from simcore_service_autoscaling.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -22,10 +25,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = tracing.TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.AUTOSCALING_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.AUTOSCALING_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.AUTOSCALING_LOG_FILTER_MAPPING, - tracing_settings=app_settings.AUTOSCALING_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -34,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index b73a18bc01ab..026cc0fbb934 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -11,7 +11,6 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) @@ -62,13 +61,13 @@ def create_app( app.state.tracing_data = tracing_data # MIDDLEWARES - if settings.CATALOG_TRACING: - setup_tracing(app, tracing_data=get_tracing_data(app)) + if tracing_data.tracing_enabled: + setup_tracing(app, tracing_data=tracing_data) if settings.CATALOG_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if settings.CATALOG_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION: # middleware to time requests (ONLY for development) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index 3a1bf84044f7..b258e5fb2966 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -5,10 +5,10 @@ setup_prometheus_instrumentation, ) from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -30,7 +30,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: _logger.info("app settings: %s", settings.model_dump_json(indent=1)) app = FastAPI( @@ -44,13 +44,13 @@ def create_app(settings: ApplicationSettings) -> FastAPI: ) # STATE app.state.settings = settings + app.state.tracing_data = tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec - if app.state.settings.CLUSTERS_KEEPER_TRACING: + if tracing_data.tracing_enabled: setup_tracing( app, - app.state.settings.CLUSTERS_KEEPER_TRACING, - APP_NAME, + tracing_data, ) if app.state.settings.CLUSTERS_KEEPER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) @@ -64,10 +64,8 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_redis(app) setup_clusters_management(app) - if settings.CLUSTERS_KEEPER_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.CLUSTERS_KEEPER_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) # ERROR HANDLERS # EVENTS diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py index d4e4bdf99ee4..132817af4268 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py @@ -6,9 +6,12 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_clusters_keeper.core.application import create_app from simcore_service_clusters_keeper.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -22,10 +25,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.CLUSTERS_KEEPER_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.CLUSTERS_KEEPER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.CLUSTERS_KEEPER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.CLUSTERS_KEEPER_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -34,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index 86e0adc5bab1..f6e3a658c903 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -11,10 +11,10 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from starlette.middleware.base import BaseHTTPMiddleware from .._meta import API_VERSION, API_VTAG, APP_NAME @@ -31,7 +31,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], @@ -46,12 +46,12 @@ def create_app(settings: ApplicationSettings) -> FastAPI: add_pagination(app) app.state.settings = settings + app.state.tracing_data = tracing_data - if app.state.settings.DATCORE_ADAPTER_TRACING: + if tracing_data.tracing_enabled: setup_tracing( app, - app.state.settings.DATCORE_ADAPTER_TRACING, - APP_NAME, + tracing_data, ) if app.state.settings.DATCORE_ADAPTER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) @@ -63,10 +63,8 @@ def create_app(settings: ApplicationSettings) -> FastAPI: ) app.add_middleware(GZipMiddleware) - if settings.DATCORE_ADAPTER_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.DATCORE_ADAPTER_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) # events app.add_event_handler("startup", on_startup) diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py index 0a46179524df..6a138a687eb3 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py @@ -5,10 +5,13 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI +from servicelib import tracing from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event from simcore_service_datcore_adapter.core.application import create_app from simcore_service_datcore_adapter.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -20,10 +23,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = tracing.TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.DATCORE_ADAPTER_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DATCORE_ADAPTER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DATCORE_ADAPTER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.DATCORE_ADAPTER_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -32,6 +38,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index a1be24824ffe..401172e3ca6b 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -17,6 +17,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY from ..api.entrypoints import api_router @@ -120,10 +121,13 @@ def create_base_app( if app_settings is None: app_settings = AppSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.DIRECTOR_V2_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DIRECTOR_V2_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DIRECTOR_V2_LOG_FILTER_MAPPING, - tracing_settings=app_settings.DIRECTOR_V2_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -148,6 +152,7 @@ def create_base_app( ) override_fastapi_openapi_method(app) app.state.settings = app_settings + app.state.tracing_data = tracing_data app.include_router(api_router) @@ -170,8 +175,8 @@ def create_app( # noqa: C901, PLR0912 substitutions.setup(app) - if settings.DIRECTOR_V2_TRACING: - setup_tracing(app, settings.DIRECTOR_V2_TRACING, APP_NAME) + if get_tracing_data(app).tracing_enabled: + setup_tracing(app, get_tracing_data(app)) if settings.DIRECTOR_V2_PROMETHEUS_INSTRUMENTATION_ENABLED: instrumentation.setup(app) @@ -199,13 +204,11 @@ def create_app( # noqa: C901, PLR0912 db.setup(app, settings.POSTGRES) - if settings.DIRECTOR_V2_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.DIRECTOR_V2_TRACING) - ) + if get_tracing_data(app).tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: - dynamic_services.setup(app, tracing_settings=settings.DIRECTOR_V2_TRACING) + dynamic_services.setup(app) dynamic_scheduler_enabled = settings.DYNAMIC_SERVICES.DYNAMIC_SIDECAR and ( settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py index eb84a85419af..d796e37237ca 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py @@ -6,24 +6,21 @@ import httpx from fastapi import FastAPI from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing -from settings_library.tracing import TracingSettings from ..utils.client_decorators import handle_errors, handle_retry logger = logging.getLogger(__name__) -def setup(app: FastAPI, tracing_settings: TracingSettings | None) -> None: +def setup(app: FastAPI) -> None: def on_startup() -> None: client = httpx.AsyncClient( timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT ) - if tracing_settings: + if get_tracing_data(app).tracing_enabled: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data( - app=app, tracing_settings=tracing_settings - ), + tracing_data=get_tracing_data(app=app), ) ServicesClient.create( app, diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index e41a5f24364c..d0f0b6f780db 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -5,10 +5,10 @@ from servicelib.fastapi.client_session import setup_client_session from servicelib.fastapi.http_error import set_app_default_http_error_handlers from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -25,7 +25,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: app = FastAPI( debug=settings.DIRECTOR_DEBUG, title=APP_NAME, @@ -37,11 +37,12 @@ def create_app(settings: ApplicationSettings) -> FastAPI: ) # STATE app.state.settings = settings + app.state.tracing_data = tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app.state.settings.DIRECTOR_TRACING: - setup_tracing(app, app.state.settings.DIRECTOR_TRACING, APP_NAME) + if tracing_data.tracing_enabled: + setup_tracing(app, tracing_data) setup_api_routes(app) @@ -52,14 +53,12 @@ def create_app(settings: ApplicationSettings) -> FastAPI: max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS, default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT, tracing_settings=settings.DIRECTOR_TRACING, - tracing_data=get_tracing_data(app, settings.DIRECTOR_TRACING), + tracing_data=tracing_data, ) setup_registry(app) - if settings.DIRECTOR_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.DIRECTOR_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) # ERROR HANDLERS set_app_default_http_error_handlers(app) diff --git a/services/director/src/simcore_service_director/main.py b/services/director/src/simcore_service_director/main.py index 5ad1c4b03d9a..7cb875c7e3be 100644 --- a/services/director/src/simcore_service_director/main.py +++ b/services/director/src/simcore_service_director/main.py @@ -6,6 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_director.core.application import create_app from simcore_service_director.core.settings import ApplicationSettings @@ -20,10 +21,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.DIRECTOR_TRACING, + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DIRECTOR_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DIRECTOR_LOG_FILTER_MAPPING, - tracing_settings=app_settings.DIRECTOR_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -32,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index e3d40519bf60..4463612a6a66 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -15,9 +15,10 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from simcore_sdk.node_ports_common.exceptions import NodeNotFound -from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY, __version__ +from .._meta import API_VERSION, API_VTAG, APP_NAME, SUMMARY, __version__ from ..api.rest import get_main_router from ..api.rpc.routes import setup_rpc_api_routes from ..models.schemas.application_health import ApplicationHealth @@ -119,10 +120,13 @@ def compose_spec(self) -> str | None: def create_base_app() -> FastAPI: # settings app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.DYNAMIC_SIDECAR_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( - log_format_local_dev_enabled=app_settings.DY_SIDECAR_LOG_FORMAT_LOCAL_DEV_ENABLED, - logger_filter_mapping=app_settings.DY_SIDECAR_LOG_FILTER_MAPPING, - tracing_settings=app_settings.DYNAMIC_SIDECAR_TRACING, + log_format_local_dev_enabled=app_settings.DYNAMIC_SIDECAR_LOG_FORMAT_LOCAL_DEV_ENABLED, + logger_filter_mapping=app_settings.DYNAMIC_SIDECAR_LOG_FILTER_MAPPING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -146,6 +150,7 @@ def create_base_app() -> FastAPI: ) override_fastapi_openapi_method(app) app.state.settings = app_settings + app.state.tracing_data = tracing_data app.include_router(get_main_router(app)) @@ -172,8 +177,8 @@ def create_app() -> FastAPI: app.state.application_health = ApplicationHealth() application_settings: ApplicationSettings = app.state.settings - if application_settings.DYNAMIC_SIDECAR_TRACING: - setup_tracing(app, application_settings.DYNAMIC_SIDECAR_TRACING, PROJECT_NAME) + if get_tracing_data(app).tracing_enabled: + setup_tracing(app, get_tracing_data(app)) setup_rabbitmq(app) setup_rpc_api_routes(app) @@ -195,12 +200,10 @@ def create_app() -> FastAPI: if application_settings.are_prometheus_metrics_enabled: setup_prometheus_metrics(app) - if application_settings.DYNAMIC_SIDECAR_TRACING: + if get_tracing_data(app).tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_data( - app, application_settings.DYNAMIC_SIDECAR_TRACING - ), + tracing_data=get_tracing_data(app), ) # ERROR HANDLERS ------------ diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 1736def33355..3b99f01ce5b3 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -2,10 +2,10 @@ from fastapi import FastAPI from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -29,8 +29,14 @@ logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings | None = None) -> FastAPI: +def create_app( + settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None +) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() + tracing_data = tracing_data or TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.EFS_GUARDIAN_TRACING, + ) app = FastAPI( debug=app_settings.EFS_GUARDIAN_DEBUG, @@ -43,9 +49,10 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: ) # STATE app.state.settings = app_settings + app.state.tracing_data = tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec - if app.state.settings.EFS_GUARDIAN_TRACING: - setup_tracing(app, app.state.settings.EFS_GUARDIAN_TRACING, APP_NAME) + if tracing_data.tracing_enabled: + setup_tracing(app, tracing_data) # PLUGINS SETUP setup_rabbitmq(app) @@ -61,10 +68,8 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_fire_and_forget(app) - if app_settings.EFS_GUARDIAN_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, app_settings.EFS_GUARDIAN_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) # EVENTS async def _on_startup() -> None: diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/main.py b/services/efs-guardian/src/simcore_service_efs_guardian/main.py index 230016b548c2..6006eff158ac 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/main.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/main.py @@ -5,6 +5,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI +from servicelib import tracing from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event from simcore_service_efs_guardian.core.application import create_app from simcore_service_efs_guardian.core.settings import ApplicationSettings @@ -22,10 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = tracing.TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.EFS_GUARDIAN_TRACING, + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.EFS_GUARDIAN_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.EFS_GUARDIAN_LOG_FILTER_MAPPING, - tracing_settings=app_settings.EFS_GUARDIAN_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -34,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index 2cab4b10e249..c3130fc1e53a 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -8,6 +8,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -23,7 +24,9 @@ from .settings import ApplicationSettings -def create_app(settings: ApplicationSettings | None = None) -> FastAPI: +def create_app( + settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None +) -> FastAPI: app = FastAPI( title=f"{PROJECT_NAME} web API", @@ -37,10 +40,13 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: # STATE app.state.settings = settings or ApplicationSettings() # type: ignore[call-arg] + app.state.tracing_data = tracing_data or TracingData.create( + service_name=APP_NAME, tracing_settings=app.state.settings.INVITATIONS_TRACING + ) assert app.state.settings.API_VERSION == API_VERSION # nosec - if app.state.settings.INVITATIONS_TRACING: - setup_tracing(app, app.state.settings.INVITATIONS_TRACING, APP_NAME) + if get_tracing_data(app).tracing_enabled: + setup_tracing(app, tracing_data=get_tracing_data(app)) # PLUGINS SETUP setup_api_routes(app) @@ -48,10 +54,8 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.INVITATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if tracing_settings := app.state.settings.INVITATIONS_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, tracing_settings) - ) + if get_tracing_data(app).tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/invitations/src/simcore_service_invitations/main.py b/services/invitations/src/simcore_service_invitations/main.py index d59e54918a07..f72f16a7b3f8 100644 --- a/services/invitations/src/simcore_service_invitations/main.py +++ b/services/invitations/src/simcore_service_invitations/main.py @@ -6,6 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_invitations.core.application import create_app from simcore_service_invitations.core.settings import ApplicationSettings @@ -19,10 +20,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.INVITATIONS_TRACING, + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.INVITATIONS_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.INVITATIONS_LOG_FILTER_MAPPING, - tracing_settings=app_settings.INVITATIONS_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -31,6 +36,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/notifications/src/simcore_service_notifications/core/application.py b/services/notifications/src/simcore_service_notifications/core/application.py index 0600a9f3e23f..a85162a441d5 100644 --- a/services/notifications/src/simcore_service_notifications/core/application.py +++ b/services/notifications/src/simcore_service_notifications/core/application.py @@ -10,10 +10,10 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import API_VTAG, APP_NAME, SUMMARY, VERSION from ..api.rest.routing import initialize_rest_api @@ -26,8 +26,12 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, + tracing_data: TracingData | None = None, ) -> FastAPI: settings = settings or ApplicationSettings.create_from_envs() + tracing_data = tracing_data or TracingData.create( + service_name=APP_NAME, tracing_settings=settings.NOTIFICATIONS_TRACING + ) assert settings.SC_BOOT_MODE # nosec app = FastAPI( @@ -41,18 +45,17 @@ def create_app( ) override_fastapi_openapi_method(app) app.state.settings = settings + app.state.tracing_data = tracing_data - if settings.NOTIFICATIONS_TRACING: - setup_tracing(app, settings.NOTIFICATIONS_TRACING, APP_NAME) # pragma: no cover + if tracing_data.tracing_enabled: + setup_tracing(app, tracing_data=tracing_data) initialize_rest_api(app) if settings.NOTIFICATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: initialize_prometheus_instrumentation(app) - if settings.NOTIFICATIONS_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.NOTIFICATIONS_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) return app diff --git a/services/notifications/src/simcore_service_notifications/main.py b/services/notifications/src/simcore_service_notifications/main.py index cda95f9dd9f5..82bc592c58a7 100644 --- a/services/notifications/src/simcore_service_notifications/main.py +++ b/services/notifications/src/simcore_service_notifications/main.py @@ -4,11 +4,14 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_lifespan +from servicelib.tracing import TracingData from simcore_service_notifications.core.application import create_app from simcore_service_notifications.core.settings import ( ApplicationSettings, ) +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -19,10 +22,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.NOTIFICATIONS_TRACING + ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.NOTIFICATIONS_VOLUMES_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.NOTIFICATIONS_VOLUMES_LOG_FILTER_MAPPING, - tracing_settings=app_settings.NOTIFICATIONS_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -31,4 +37,8 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - return create_app(settings=app_settings, logging_lifespan=logging_lifespan) + return create_app( + settings=app_settings, + logging_lifespan=logging_lifespan, + tracing_data=tracing_data, + ) diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index f46a0474ddd7..aff95c9f9b15 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -4,10 +4,10 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -31,10 +31,14 @@ from .settings import ApplicationSettings -def create_app(settings: ApplicationSettings | None = None) -> FastAPI: +def create_app( + settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None +) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - + app_tracing_data = tracing_data or TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.PAYMENTS_TRACING + ) app = FastAPI( title=f"{PROJECT_NAME} web API", description=SUMMARY, @@ -47,11 +51,12 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: # STATE app.state.settings = app_settings + app.state.tracing_data = app_tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app.state.settings.PAYMENTS_TRACING: - setup_tracing(app, app.state.settings.PAYMENTS_TRACING, APP_NAME) + if app_tracing_data: + setup_tracing(app, app_tracing_data) # API w/ postgres db setup_postgres(app) @@ -78,10 +83,8 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.PAYMENTS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if app_settings.PAYMENTS_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, app_settings.PAYMENTS_TRACING) - ) + if app_tracing_data: + initialize_fastapi_app_tracing(app, tracing_data=app_tracing_data) # ERROR HANDLERS # ... add here ... diff --git a/services/payments/src/simcore_service_payments/main.py b/services/payments/src/simcore_service_payments/main.py index 604d4adaa1bd..a8d65908c193 100644 --- a/services/payments/src/simcore_service_payments/main.py +++ b/services/payments/src/simcore_service_payments/main.py @@ -6,6 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_payments.core.application import create_app from simcore_service_payments.core.settings import ApplicationSettings @@ -22,10 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.PAYMENTS_TRACING, + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.PAYMENTS_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.PAYMENTS_LOG_FILTER_MAPPING, - tracing_settings=app_settings.PAYMENTS_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -34,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index d025323cfa9d..0044497436bb 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -3,10 +3,10 @@ from fastapi import FastAPI from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_data, initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from .._meta import ( API_VERSION, @@ -35,7 +35,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: app = FastAPI( debug=settings.RESOURCE_USAGE_TRACKER_DEBUG, title=f"{PROJECT_NAME} web API", @@ -52,11 +52,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: + if tracing_data.tracing_enabled: setup_tracing( app, - app.state.settings.RESOURCE_USAGE_TRACKER_TRACING, - app.state.settings.APP_NAME, + tracing_data, ) setup_api_routes(app) fire_and_forget_setup(app) @@ -74,10 +73,10 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_process_message_running_service(app) # Requires Rabbit - if tracing_settings := app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: + if tracing_data.tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_data(app, tracing_settings), + tracing_data=tracing_data, ) # ERROR HANDLERS diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py index 42d3184f155f..5a6344389f44 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py @@ -6,6 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_resource_usage_tracker.core.application import create_app from simcore_service_resource_usage_tracker.core.settings import ApplicationSettings @@ -22,10 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=app_settings.APP_NAME, + tracing_settings=app_settings.RESOURCE_USAGE_TRACKER_TRACING, + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.RESOURCE_USAGE_TRACKER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.RESOURCE_USAGE_TRACKER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.RESOURCE_USAGE_TRACKER_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -34,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/storage/src/simcore_service_storage/core/application.py b/services/storage/src/simcore_service_storage/core/application.py index bc1ab984e761..177238122143 100644 --- a/services/storage/src/simcore_service_storage/core/application.py +++ b/services/storage/src/simcore_service_storage/core/application.py @@ -22,6 +22,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) +from servicelib.tracing import TracingData from starlette.middleware.base import BaseHTTPMiddleware from .._meta import ( @@ -47,7 +48,9 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 +def create_app( + settings: ApplicationSettings, tracing_data: TracingData +) -> FastAPI: # noqa: C901 app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], @@ -63,16 +66,16 @@ def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 # STATE app.state.settings = settings + app.state.tracing_data = tracing_data - if settings.STORAGE_TRACING: - setup_tracing(app, settings.STORAGE_TRACING, APP_NAME) + if tracing_data.tracing_enabled: + setup_tracing(app, tracing_data) setup_db(app) setup_s3(app) setup_client_session( app, - tracing_settings=settings.STORAGE_TRACING, - tracing_data=get_tracing_data(app, settings.STORAGE_TRACING), + tracing_data=get_tracing_data(app), ) if settings.STORAGE_CELERY: @@ -107,10 +110,8 @@ def create_app(settings: ApplicationSettings) -> FastAPI: # noqa: C901 if settings.STORAGE_MONITORING_ENABLED: setup_prometheus_instrumentation(app) - if settings.STORAGE_TRACING: - initialize_fastapi_app_tracing( - app, tracing_data=get_tracing_data(app, settings.STORAGE_TRACING) - ) + if tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=tracing_data) async def _on_startup() -> None: if settings.STORAGE_WORKER_MODE: diff --git a/services/storage/src/simcore_service_storage/main.py b/services/storage/src/simcore_service_storage/main.py index f2282decaa59..76e8e0779e01 100644 --- a/services/storage/src/simcore_service_storage/main.py +++ b/services/storage/src/simcore_service_storage/main.py @@ -6,9 +6,12 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event +from servicelib.tracing import TracingData from simcore_service_storage.core.application import create_app from simcore_service_storage.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -24,10 +27,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.STORAGE_TRACING + ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.STORAGE_LOG_FILTER_MAPPING, - tracing_settings=app_settings.STORAGE_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -36,6 +42,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings) + app = create_app(settings=app_settings, tracing_data=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index 2c4dc4ad4e6a..a90ea39e47b4 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -15,12 +15,10 @@ from ...core.settings import ApplicationSettings _settings = ApplicationSettings.create_from_envs() -_tracing_data: TracingData | None = None -if _settings.STORAGE_TRACING: - _tracing_data = TracingData.create( - tracing_settings=_settings.STORAGE_TRACING, - service_name="storage-celery-worker", - ) +_tracing_data = TracingData.create( + tracing_settings=_settings.STORAGE_TRACING, + service_name="storage-celery-worker", +) setup_loggers( log_format_local_dev_enabled=_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, @@ -34,7 +32,7 @@ assert _settings.STORAGE_CELERY # nosec app = create_celery_app(_settings.STORAGE_CELERY) -app_server = FastAPIAppServer(app=create_app(_settings)) +app_server = FastAPIAppServer(app=create_app(_settings, tracing_data=_tracing_data)) def worker_init_wrapper(sender, **kwargs): diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index 802c3fab387c..a864ab85883a 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -65,6 +65,7 @@ from servicelib.aiohttp import status from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient +from servicelib.tracing import TracingData from servicelib.utils import limited_gather from settings_library.rabbit import RabbitSettings from simcore_postgres_database.models.tokens import tokens @@ -236,7 +237,11 @@ async def initialized_app( mock_celery_app: None, app_settings: ApplicationSettings, ) -> AsyncIterator[FastAPI]: - app = create_app(app_settings) + tracing_data = TracingData.create( + tracing_settings=app_settings.STORAGE_TRACING, + service_name="storage-api", + ) + app = create_app(app_settings, tracing_data=tracing_data) # NOTE: the timeout is sometime too small for CI machines, and even larger machines async with LifespanManager( app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT @@ -1013,8 +1018,14 @@ async def with_storage_celery_worker( # Signals must be explicitily connected monkeypatch.setenv("STORAGE_WORKER_MODE", "true") app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + tracing_settings=app_settings.STORAGE_TRACING, + service_name="storage-api", + ) - app_server = FastAPIAppServer(app=create_app(app_settings)) + app_server = FastAPIAppServer( + app=create_app(app_settings, tracing_data=tracing_data) + ) def _on_worker_init_wrapper(sender: WorkController, **_kwargs): return on_worker_init(sender, app_server, **_kwargs) diff --git a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py index 0531f02c6b10..a72558bae465 100644 --- a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py +++ b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py @@ -24,6 +24,7 @@ from models_library.projects_nodes_io import SimcoreS3FileID from models_library.users import UserID from pytest_simcore.helpers.logging_tools import log_context +from servicelib.tracing import TracingData from servicelib.utils import unused_port from simcore_service_storage._meta import API_VTAG from simcore_service_storage.core.application import create_app @@ -63,7 +64,11 @@ async def _wait_for_server_ready(server: URL) -> None: @pytest.fixture async def real_storage_server(app_settings: ApplicationSettings) -> AsyncIterator[URL]: settings = ApplicationSettings.create_from_envs() - app = create_app(settings) + tracing_data = TracingData.create( + tracing_settings=settings.STORAGE_TRACING, + service_name="storage-api", + ) + app = create_app(settings, tracing_data=tracing_data) storage_port = unused_port() with log_context( logging.INFO, From d9aff4527148d9c7b06a8ae63264b724533b21d6 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 6 Oct 2025 16:39:55 +0200 Subject: [PATCH 28/62] fix lifespan creator in fastapi --- packages/service-library/tests/fastapi/test_tracing.py | 8 -------- .../src/simcore_service_dynamic_scheduler/core/events.py | 1 - 2 files changed, 9 deletions(-) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 4447af8126e4..25b547448225 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -88,11 +88,9 @@ async def test_valid_tracing_settings( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): pass @@ -128,7 +126,6 @@ async def test_invalid_tracing_settings( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=app): pass @@ -187,12 +184,10 @@ async def test_tracing_setup_package_detection( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): # idempotency check async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): pass @@ -238,7 +233,6 @@ async def handler(handler_data: dict): mocked_app.get("/")(partial(handler, handler_data)) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing( @@ -293,7 +287,6 @@ async def handler(handler_data: dict): mocked_app.get("/")(partial(handler, handler_data)) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing( @@ -345,7 +338,6 @@ async def handler(): mocked_app.get("/")(handler) async for _ in get_tracing_instrumentation_lifespan( - tracing_settings=tracing_settings, tracing_data=tracing_data, )(app=mocked_app): initialize_fastapi_app_tracing( diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index 05eb6c36c3ca..2f893d9b5256 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -68,7 +68,6 @@ def create_app_lifespan( assert tracing_data # nosec app_lifespan.add( get_tracing_instrumentation_lifespan( - tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, tracing_data=tracing_data, ) ) From 874a26fc1ad1b0b5be205d9c92aa25ce57ee5a47 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 6 Oct 2025 16:47:34 +0200 Subject: [PATCH 29/62] refactor tracing_data creation in aiohttp case --- .../src/servicelib/aiohttp/tracing.py | 52 ++++++++----------- .../src/simcore_service_webserver/tracing.py | 12 +++-- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 6d276ea04e65..b6d02ac98d7d 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -24,7 +24,7 @@ meter, set_status_code, ) -from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from settings_library.tracing import TracingSettings from yarl import URL @@ -137,7 +137,8 @@ def _startup( *, app: web.Application, tracing_settings: TracingSettings, - tracing_data: TracingData, + service_name: str, + tracer_provider: TracerProvider, add_response_trace_id_header: bool = False, ) -> None: """ @@ -166,14 +167,12 @@ def _startup( _logger.info( "Trying to connect service %s to tracing collector at %s.", - tracing_data.service_name, + service_name, tracing_destination, ) # Add the span processor to the tracer provider - tracing_data.tracer_provider.add_span_processor( - _create_span_processor(tracing_destination) - ) + tracer_provider.add_span_processor(_create_span_processor(tracing_destination)) # Instrument aiohttp server # Explanation for custom middleware call DK 10/2024: # OpenTelemetry Aiohttp autoinstrumentation is meant to be used by only calling `AioHttpServerInstrumentor().instrument()` @@ -194,41 +193,35 @@ def _startup( # - opentelemetry-instrumentation==0.48b0 # Instrument aiohttp client - AioHttpClientInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) + AioHttpClientInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_AIOPG: with log_context( _logger, logging.INFO, msg="Attempting to add aio-pg opentelemetry autoinstrumentation...", ): - AiopgInstrumentor().instrument(tracer_provider=tracing_data.tracer_provider) + AiopgInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_ASYNCPG: with log_context( _logger, logging.INFO, msg="Attempting to add asyncpg opentelemetry autoinstrumentation...", ): - AsyncPGInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + AsyncPGInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_BOTOCORE: with log_context( _logger, logging.INFO, msg="Attempting to add botocore opentelemetry autoinstrumentation...", ): - BotocoreInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + BotocoreInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_REQUESTS: with log_context( _logger, logging.INFO, msg="Attempting to add requests opentelemetry autoinstrumentation...", ): - RequestsInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + RequestsInstrumentor().instrument(tracer_provider=tracer_provider) if HAS_AIO_PIKA: with log_context( @@ -236,9 +229,7 @@ def _startup( logging.INFO, msg="Attempting to add aio_pika opentelemetry autoinstrumentation...", ): - AioPikaInstrumentor().instrument( - tracer_provider=tracing_data.tracer_provider - ) + AioPikaInstrumentor().instrument(tracer_provider=tracer_provider) @web.middleware @@ -256,9 +247,8 @@ async def response_trace_id_header_middleware(request: web.Request, handler): return response -def _shutdown(tracing_data: TracingData) -> None: +def _shutdown() -> None: """Uninstruments all opentelemetry instrumentors that were instrumented.""" - assert tracing_data # nosec try: AioHttpClientInstrumentor().uninstrument() except Exception: # pylint:disable=broad-exception-caught @@ -293,25 +283,27 @@ def _shutdown(tracing_data: TracingData) -> None: def setup_tracing( *, app: web.Application, - tracing_settings: TracingSettings, - service_name: str, + tracing_data: TracingData, add_response_trace_id_header: bool = False, ) -> Callable[[web.Application], AsyncIterator]: - tracing_data = TracingData.create( - tracing_settings=tracing_settings, service_name=service_name - ) + if tracing_data.tracing_enabled is False: + msg = "Tracing is not enabled" + raise ValueError(msg) + assert tracing_data.tracer_provider # nosec + assert tracing_data.tracing_settings # nosec app[TRACING_DATA_KEY] = tracing_data _startup( app=app, - tracing_settings=tracing_settings, - tracing_data=tracing_data, + tracing_settings=tracing_data.tracing_settings, + tracer_provider=tracing_data.tracer_provider, + service_name=tracing_data.service_name, add_response_trace_id_header=add_response_trace_id_header, ) async def tracing_lifespan(app: web.Application): assert app # nosec yield - _shutdown(tracing_data=tracing_data) + _shutdown() return tracing_lifespan diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index 6e4893ddf4ba..6a394cfc38ef 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -1,10 +1,10 @@ import logging from aiohttp import web -from servicelib.aiohttp.tracing import setup_tracing +from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing +from servicelib.tracing import TracingData from settings_library.tracing import TracingSettings -from ._meta import APP_NAME from .application_keys import APP_SETTINGS_APPKEY from .application_setup import ModuleCategory, app_setup_func @@ -33,12 +33,16 @@ def setup_app_tracing(app: web.Application): """ tracing_settings: TracingSettings = get_plugin_settings(app) + tracing_data = TracingData.create( + tracing_settings=tracing_settings, + service_name=app[APP_SETTINGS_APPKEY].APP_NAME, + ) + app[TRACING_DATA_KEY] = tracing_data app.cleanup_ctx.append( setup_tracing( app=app, - tracing_settings=tracing_settings, + tracing_data=tracing_data, add_response_trace_id_header=True, - service_name=APP_NAME, ) ) From dd1180d15283d8f5c563568db72ca6ca2d98b15a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 09:52:13 +0200 Subject: [PATCH 30/62] fix which was not commited yesterday --- packages/service-library/src/servicelib/aiohttp/tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index b6d02ac98d7d..f67c385bd303 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -292,7 +292,7 @@ def setup_tracing( raise ValueError(msg) assert tracing_data.tracer_provider # nosec assert tracing_data.tracing_settings # nosec - app[TRACING_DATA_KEY] = tracing_data + _startup( app=app, tracing_settings=tracing_data.tracing_settings, From 209b01aa90c186e4b9ade2e0d83f301970f1f1e2 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 10:29:23 +0200 Subject: [PATCH 31/62] make TracingData frozen --- packages/service-library/src/servicelib/tracing.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index cdf36f62f628..14ef06e48928 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -10,7 +10,7 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased -from pydantic import BaseModel, model_validator +from pydantic import BaseModel, ConfigDict, model_validator from settings_library.tracing import TracingSettings TracingContext: TypeAlias = otcontext.Context | None @@ -43,6 +43,7 @@ def use_tracing_context(context: TracingContext): class TracingData(BaseModel): + model_config = ConfigDict(frozen=True) service_name: str tracing_settings: TracingSettings | None tracer_provider: TracerProvider | None From a63d628cb58f0a3bea08c14bf7c6f8c1f761b650 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 10:51:51 +0200 Subject: [PATCH 32/62] several fixes and cleanups --- .../service-library/src/servicelib/tracing.py | 2 +- .../utils/client_base.py | 2 +- .../clients/director.py | 4 +--- .../dynamic_sidecar/api_client/_thin.py | 2 +- .../core/application.py | 1 - .../core/application.py | 20 +++++++++---------- .../core/events.py | 5 ++--- .../simcore_service_dynamic_scheduler/main.py | 15 ++++++++++++-- 8 files changed, 28 insertions(+), 23 deletions(-) diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index 14ef06e48928..00e3a3608953 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -43,7 +43,7 @@ def use_tracing_context(context: TracingContext): class TracingData(BaseModel): - model_config = ConfigDict(frozen=True) + model_config = ConfigDict(frozen=True, arbitrary_types_allowed=True) service_name: str tracing_settings: TracingSettings | None tracer_provider: TracerProvider | None diff --git a/services/api-server/src/simcore_service_api_server/utils/client_base.py b/services/api-server/src/simcore_service_api_server/utils/client_base.py index 77c77d035d67..7847aba08156 100644 --- a/services/api-server/src/simcore_service_api_server/utils/client_base.py +++ b/services/api-server/src/simcore_service_api_server/utils/client_base.py @@ -62,7 +62,7 @@ def setup_client_instance( if tracing_settings: setup_httpx_client_tracing( client, - tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + tracing_data=get_tracing_data(app), ) # events diff --git a/services/catalog/src/simcore_service_catalog/clients/director.py b/services/catalog/src/simcore_service_catalog/clients/director.py index 310021fbd0ae..4b791b580212 100644 --- a/services/catalog/src/simcore_service_catalog/clients/director.py +++ b/services/catalog/src/simcore_service_catalog/clients/director.py @@ -148,9 +148,7 @@ def __init__(self, base_url: str, app: FastAPI): if settings.CATALOG_TRACING: setup_httpx_client_tracing( self.client, - tracing_data=get_tracing_data( - app=app, tracing_settings=settings.CATALOG_TRACING - ), + tracing_data=get_tracing_data(app=app), ) assert settings.CATALOG_DIRECTOR # nosec diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index e8b19a2a4bd6..7cd44412e5c0 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI): tracing_settings: TracingSettings | None = ( app.state.settings.DIRECTOR_V2_TRACING ) - tracing_data = get_tracing_data(app, tracing_settings) + tracing_data = get_tracing_data(app) # timeouts self._health_request_timeout = Timeout(1.0, connect=1.0) diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index d0f0b6f780db..df8458592d75 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -52,7 +52,6 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> Fast app, max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS, default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT, - tracing_settings=settings.DIRECTOR_TRACING, tracing_data=tracing_data, ) setup_registry(app) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index 473fa2c877c1..88a88c42f07e 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -18,15 +18,13 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, + tracing_data: TracingData | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - - tracing_data: TracingData | None = None - if app_settings.DYNAMIC_SCHEDULER_TRACING: - tracing_data = TracingData.create( - tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, - service_name=APP_NAME, - ) + app_tracing_data = tracing_data or TracingData.create( + tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, + service_name=APP_NAME, + ) app = FastAPI( title=f"{PROJECT_NAME} web API", @@ -39,7 +37,7 @@ def create_app( redoc_url=None, lifespan=events.create_app_lifespan( settings=app_settings, - tracing_data=tracing_data, + tracing_data=app_tracing_data, logging_lifespan=logging_lifespan, ), ) @@ -47,6 +45,7 @@ def create_app( # STATE app.state.settings = app_settings + app.state.tracing_data = app_tracing_data assert app.state.settings.API_VERSION == API_VERSION # nosec initialize_rest_api(app) @@ -59,8 +58,7 @@ def create_app( if app_settings.DYNAMIC_SCHEDULER_PROFILING: initialize_profiler(app) - if app_settings.DYNAMIC_SCHEDULER_TRACING: - assert tracing_data # nosec - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if app_tracing_data.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=app_tracing_data) return app diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index 2f893d9b5256..2b0d65fc8ae7 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -56,7 +56,7 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]: def create_app_lifespan( settings: ApplicationSettings, - tracing_data: TracingData | None, + tracing_data: TracingData, logging_lifespan: Lifespan | None, ) -> LifespanManager: app_lifespan = LifespanManager() @@ -64,8 +64,7 @@ def create_app_lifespan( app_lifespan.add(logging_lifespan) app_lifespan.add(_settings_lifespan) - if settings.DYNAMIC_SCHEDULER_TRACING: - assert tracing_data # nosec + if tracing_data.tracing_enabled: app_lifespan.add( get_tracing_instrumentation_lifespan( tracing_data=tracing_data, diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py index bf1f22e27e61..dc4135999a24 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py @@ -8,9 +8,12 @@ from servicelib.fastapi.logging_lifespan import ( create_logging_lifespan, ) +from servicelib.tracing import TracingData from simcore_service_dynamic_scheduler.core.application import create_app from simcore_service_dynamic_scheduler.core.settings import ApplicationSettings +from ._meta import APP_NAME + _logger = logging.getLogger(__name__) _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -24,10 +27,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, + service_name=APP_NAME, + ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.DYNAMIC_SCHEDULER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DYNAMIC_SCHEDULER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, + tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -36,4 +43,8 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - return create_app(settings=app_settings, logging_lifespan=logging_lifespan) + return create_app( + settings=app_settings, + logging_lifespan=logging_lifespan, + tracing_data=tracing_data, + ) From 598f1b283934c5f19ffd83dd068db85d44fa1c0f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 10:58:17 +0200 Subject: [PATCH 33/62] ensure settings are not passed when getting tracing data --- .../src/simcore_service_director_v2/modules/catalog.py | 2 +- .../src/simcore_service_director_v2/modules/director_v0.py | 2 +- .../modules/resource_usage_tracker_client.py | 4 +--- .../src/simcore_service_director_v2/modules/storage.py | 2 +- .../services/catalog/_thin_client.py | 2 +- .../services/director_v0/_thin_client.py | 2 +- .../services/director_v2/_thin_client.py | 2 +- .../src/simcore_service_payments/services/payments_gateway.py | 4 +--- .../services/resource_usage_tracker.py | 4 +--- .../payments/src/simcore_service_payments/services/stripe.py | 4 +--- 10 files changed, 10 insertions(+), 18 deletions(-) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py index 4adefda216b0..aa9a095e87f2 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py @@ -37,7 +37,7 @@ async def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + tracing_data=get_tracing_data(app), ) CatalogClient.create( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py index 556837889efb..f0196f7936f9 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py @@ -42,7 +42,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + tracing_data=get_tracing_data(app), ) DirectorV0Client.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py index d66668c44ec8..3fa39c555d4a 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py @@ -45,9 +45,7 @@ def create( if settings.DIRECTOR_V2_TRACING: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data( - app=app, tracing_settings=settings.DIRECTOR_V2_TRACING - ), + tracing_data=get_tracing_data(app), ) exit_stack = contextlib.AsyncExitStack() diff --git a/services/director-v2/src/simcore_service_director_v2/modules/storage.py b/services/director-v2/src/simcore_service_director_v2/modules/storage.py index 2faa3d97e30e..a50d40f84c97 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/storage.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/storage.py @@ -40,7 +40,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app, tracing_settings=tracing_settings), + tracing_data=get_tracing_data(app), ) StorageClient.create( app, diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py index e4a96871a0b7..84480255445c 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_CATALOG_SETTINGS.api_base_url, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), + tracing_data=get_tracing_data(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py index c95db5b07395..fd31bf23d7b9 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py @@ -38,7 +38,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_DIRECTOR_V0_SETTINGS.endpoint, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), + tracing_data=get_tracing_data(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py index 1e58bcb58f10..26981cdd478a 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py @@ -43,7 +43,7 @@ def __init__(self, app: FastAPI) -> None: ), extra_allowed_method_names={"attach_lifespan_to"}, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app, settings.DYNAMIC_SCHEDULER_TRACING), + tracing_data=get_tracing_data(app), ) @retry_on_errors() diff --git a/services/payments/src/simcore_service_payments/services/payments_gateway.py b/services/payments/src/simcore_service_payments/services/payments_gateway.py index 615ff4713887..d748c0cc6030 100644 --- a/services/payments/src/simcore_service_payments/services/payments_gateway.py +++ b/services/payments/src/simcore_service_payments/services/payments_gateway.py @@ -218,9 +218,7 @@ def setup_payments_gateway(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data( - app, tracing_settings=settings.PAYMENTS_TRACING - ), + tracing_data=get_tracing_data(app), ) api.attach_lifespan_to(app) api.set_to_app_state(app) diff --git a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py index 9d1fce3e344b..95bb80267733 100644 --- a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py +++ b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py @@ -76,9 +76,7 @@ def setup_resource_usage_tracker(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data( - app, tracing_settings=settings.PAYMENTS_TRACING - ), + tracing_data=get_tracing_data(app), ) api.set_to_app_state(app) api.attach_lifespan_to(app) diff --git a/services/payments/src/simcore_service_payments/services/stripe.py b/services/payments/src/simcore_service_payments/services/stripe.py index 3b1e35867242..710b3dd773a9 100644 --- a/services/payments/src/simcore_service_payments/services/stripe.py +++ b/services/payments/src/simcore_service_payments/services/stripe.py @@ -95,9 +95,7 @@ def setup_stripe(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data( - app, tracing_settings=settings.PAYMENTS_TRACING - ), + tracing_data=get_tracing_data(app), ) api.set_to_app_state(app) From c6f1c5f243f4e4bb29637755ea6a04952fbf106d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 11:42:08 +0200 Subject: [PATCH 34/62] several fixes --- .../simcore_service_webserver/application.py | 9 +++++++-- .../src/simcore_service_webserver/cli.py | 19 +++++++++++++++---- .../src/simcore_service_webserver/log.py | 7 +++++-- .../src/simcore_service_webserver/tracing.py | 19 +------------------ 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/application.py b/services/web/server/src/simcore_service_webserver/application.py index c996e7af5ad8..354a75ec6bea 100644 --- a/services/web/server/src/simcore_service_webserver/application.py +++ b/services/web/server/src/simcore_service_webserver/application.py @@ -8,8 +8,10 @@ from aiohttp import web from servicelib.aiohttp.application import create_safe_application +from servicelib.tracing import TracingData from ._meta import ( + APP_NAME, WELCOME_AUTH_APP_MSG, WELCOME_DB_LISTENER_MSG, WELCOME_GC_MSG, @@ -61,7 +63,7 @@ from .studies_dispatcher.plugin import setup_studies_dispatcher from .tags.plugin import setup_tags from .tasks.plugin import setup_tasks -from .tracing import setup_app_tracing +from .tracing import TRACING_DATA_KEY, setup_app_tracing from .trash.plugin import setup_trash from .users.plugin import setup_users from .wallets.plugin import setup_wallets @@ -98,12 +100,13 @@ async def _finished_banner(app: web.Application): return _finished_banner -def create_application() -> web.Application: +def create_application(tracing_data: TracingData) -> web.Application: """ Initializes service """ app = create_safe_application() setup_settings(app) + app[TRACING_DATA_KEY] = tracing_data # WARNING: setup order matters # NOTE: compute setup order https://github.com/ITISFoundation/osparc-simcore/issues/1142 @@ -201,6 +204,8 @@ def create_application_auth() -> web.Application: app = create_safe_application() settings = setup_settings(app) + tracing_data = TracingData.create(settings.WEBSERVER_TRACING, service_name=APP_NAME) + app[TRACING_DATA_KEY] = tracing_data assert settings.WEBSERVER_APP_FACTORY_NAME == "WEBSERVER_AUTHZ_APP_FACTORY" # nosec # Monitoring and diagnostics diff --git a/services/web/server/src/simcore_service_webserver/cli.py b/services/web/server/src/simcore_service_webserver/cli.py index de59ad46ddfe..41fd9c3552d6 100644 --- a/services/web/server/src/simcore_service_webserver/cli.py +++ b/services/web/server/src/simcore_service_webserver/cli.py @@ -20,8 +20,10 @@ import typer from aiohttp import web from common_library.json_serialization import json_dumps +from servicelib.tracing import TracingData from settings_library.utils_cli import create_settings_command +from ._meta import APP_NAME from .application_settings import ApplicationSettings from .login import cli as login_cli @@ -37,6 +39,7 @@ def _setup_app_from_settings( settings: ApplicationSettings, + tracing_data: TracingData, ) -> tuple[web.Application, dict]: # NOTE: keeping imports here to reduce CLI load time from .application import create_application @@ -49,7 +52,7 @@ def _setup_app_from_settings( # given configs and changing those would not have # a meaningful RoI. config = convert_to_app_config(settings) - app = create_application() + app = create_application(tracing_data=tracing_data) return (app, config) @@ -62,6 +65,9 @@ async def app_factory() -> web.Application: from .log import setup_logging app_settings = ApplicationSettings.create_from_envs() + tracing_data = TracingData.create( + app_settings.WEBSERVER_TRACING, service_name=APP_NAME + ) _logger.info( "Application settings: %s", @@ -72,12 +78,14 @@ async def app_factory() -> web.Application: "Using application factory: %s", app_settings.WEBSERVER_APP_FACTORY_NAME ) - logging_lifespan_cleanup_event = setup_logging(app_settings) + logging_lifespan_cleanup_event = setup_logging( + app_settings, tracing_data=tracing_data + ) if app_settings.WEBSERVER_APP_FACTORY_NAME == "WEBSERVER_AUTHZ_APP_FACTORY": app = create_application_auth() else: - app, _ = _setup_app_from_settings(app_settings) + app, _ = _setup_app_from_settings(app_settings, tracing_data) app.on_cleanup.append(logging_lifespan_cleanup_event) return app @@ -120,5 +128,8 @@ def run(): from .application import run_service app_settings = ApplicationSettings.create_from_envs() - app, cfg = _setup_app_from_settings(app_settings) + app_tracing_data = TracingData.create( + app_settings.WEBSERVER_TRACING, service_name=APP_NAME + ) + app, cfg = _setup_app_from_settings(app_settings, app_tracing_data) run_service(app, cfg) diff --git a/services/web/server/src/simcore_service_webserver/log.py b/services/web/server/src/simcore_service_webserver/log.py index 271c28bd7b95..143aafb9b77b 100644 --- a/services/web/server/src/simcore_service_webserver/log.py +++ b/services/web/server/src/simcore_service_webserver/log.py @@ -9,6 +9,7 @@ from aiohttp import web from aiohttp.log import access_logger from servicelib.logging_utils import async_loggers +from servicelib.tracing import TracingData from simcore_service_webserver.application_settings import ApplicationSettings _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -30,7 +31,9 @@ CleanupEvent: TypeAlias = Callable[[web.Application], Awaitable[None]] -def setup_logging(app_settings: ApplicationSettings) -> CleanupEvent: +def setup_logging( + app_settings: ApplicationSettings, tracing_data: TracingData +) -> CleanupEvent: exit_stack = AsyncExitStack() exit_stack.enter_context( async_loggers( @@ -38,7 +41,7 @@ def setup_logging(app_settings: ApplicationSettings) -> CleanupEvent: noisy_loggers=_NOISY_LOGGERS, log_format_local_dev_enabled=app_settings.WEBSERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.WEBSERVER_LOG_FILTER_MAPPING, - tracing_settings=app_settings.WEBSERVER_TRACING, + tracing_data=tracing_data, ) ) diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index 6a394cfc38ef..14e50ad20ac8 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -2,22 +2,12 @@ from aiohttp import web from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing -from servicelib.tracing import TracingData -from settings_library.tracing import TracingSettings -from .application_keys import APP_SETTINGS_APPKEY from .application_setup import ModuleCategory, app_setup_func log = logging.getLogger(__name__) -def get_plugin_settings(app: web.Application) -> TracingSettings: - settings = app[APP_SETTINGS_APPKEY].WEBSERVER_TRACING - assert settings, "setup_settings not called?" # nosec - assert isinstance(settings, TracingSettings) # nosec - return settings - - @app_setup_func( __name__, ModuleCategory.ADDON, settings_name="WEBSERVER_TRACING", logger=log ) @@ -32,17 +22,10 @@ def setup_app_tracing(app: web.Application): """ - tracing_settings: TracingSettings = get_plugin_settings(app) - tracing_data = TracingData.create( - tracing_settings=tracing_settings, - service_name=app[APP_SETTINGS_APPKEY].APP_NAME, - ) - app[TRACING_DATA_KEY] = tracing_data - app.cleanup_ctx.append( setup_tracing( app=app, - tracing_data=tracing_data, + tracing_data=app[TRACING_DATA_KEY], add_response_trace_id_header=True, ) ) From d32f87e7980d8fa5ca044a082cdd6f139d348377 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 11:49:06 +0200 Subject: [PATCH 35/62] minor fixes to be able to generate OAS --- .../src/simcore_service_dynamic_sidecar/core/application.py | 4 ++-- .../payments/src/simcore_service_payments/core/application.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 4463612a6a66..e783d773b64d 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -124,8 +124,8 @@ def create_base_app() -> FastAPI: service_name=APP_NAME, tracing_settings=app_settings.DYNAMIC_SIDECAR_TRACING ) logging_shutdown_event = create_logging_shutdown_event( - log_format_local_dev_enabled=app_settings.DYNAMIC_SIDECAR_LOG_FORMAT_LOCAL_DEV_ENABLED, - logger_filter_mapping=app_settings.DYNAMIC_SIDECAR_LOG_FILTER_MAPPING, + log_format_local_dev_enabled=app_settings.DY_SIDECAR_LOG_FORMAT_LOCAL_DEV_ENABLED, + logger_filter_mapping=app_settings.DY_SIDECAR_LOG_FILTER_MAPPING, tracing_data=tracing_data, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index aff95c9f9b15..49c8ca633b18 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -55,7 +55,7 @@ def create_app( assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app_tracing_data: + if app_tracing_data.tracing_enabled: setup_tracing(app, app_tracing_data) # API w/ postgres db From 6ebc7a803fe7d45ee4bdecde31fb276a3fb32b2b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 11:52:36 +0200 Subject: [PATCH 36/62] fix import - make pylint hapy --- .../web/server/src/simcore_service_webserver/application.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/application.py b/services/web/server/src/simcore_service_webserver/application.py index 354a75ec6bea..4c79b982b8a7 100644 --- a/services/web/server/src/simcore_service_webserver/application.py +++ b/services/web/server/src/simcore_service_webserver/application.py @@ -8,6 +8,7 @@ from aiohttp import web from servicelib.aiohttp.application import create_safe_application +from servicelib.aiohttp.tracing import TRACING_DATA_KEY from servicelib.tracing import TracingData from ._meta import ( @@ -63,7 +64,7 @@ from .studies_dispatcher.plugin import setup_studies_dispatcher from .tags.plugin import setup_tags from .tasks.plugin import setup_tasks -from .tracing import TRACING_DATA_KEY, setup_app_tracing +from .tracing import setup_app_tracing from .trash.plugin import setup_trash from .users.plugin import setup_users from .wallets.plugin import setup_wallets From 193e35aa2b98e61f095d1a36a954fa7243e85bba Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 11:55:38 +0200 Subject: [PATCH 37/62] fix --- services/director/tests/unit/conftest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 68c20076f76f..9415c0ed8c04 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -13,6 +13,7 @@ from fastapi import FastAPI from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict +from servicelib.tracing import TracingData from settings_library.docker_registry import RegistrySettings from simcore_service_director.core.application import create_app from simcore_service_director.core.settings import ApplicationSettings @@ -163,7 +164,10 @@ def app_settings(app_environment: EnvVarsDict) -> ApplicationSettings: async def app( app_settings: ApplicationSettings, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: - the_test_app = create_app(settings=app_settings) + tracing_data = TracingData.create( + service_name="director", tracing_settings=app_settings.DIRECTOR_TRACING + ) + the_test_app = create_app(settings=app_settings, tracing_data=tracing_data) async with LifespanManager( the_test_app, startup_timeout=None if is_pdb_enabled else MAX_TIME_FOR_APP_TO_STARTUP, From e6d53032bbe20760e6890afaee79534868c63200 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 11:57:55 +0200 Subject: [PATCH 38/62] fix in dask sidecar --- .../src/simcore_service_dask_sidecar/utils/logs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index d8c52b7eb7d6..59b67f3a55cf 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -1,7 +1,9 @@ from typing import Final from servicelib.logging_utils import setup_loggers +from servicelib.tracing import TracingData +from .._meta import PROJECT_NAME from ..settings import ApplicationSettings _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -12,10 +14,11 @@ def setup_app_logging(settings: ApplicationSettings) -> None: + tracing_data = TracingData.create(service_name=PROJECT_NAME, tracing_settings=None) setup_loggers( log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=settings.DASK_LOG_FILTER_MAPPING, - tracing_data=None, # no tracing for the sidecar + tracing_data=tracing_data, log_base_level=settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) From d2d21c8fe9856917b8265b9404071c1cc6889d5f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 12:31:17 +0200 Subject: [PATCH 39/62] Fix calls to create_application in webserver tests --- .../web/server/tests/unit/isolated/test_tracing.py | 13 ++++++++----- .../tests/unit/with_dbs/03/test__openapi_specs.py | 6 +++++- .../server/tests/unit/with_dbs/03/test_session.py | 6 +++++- services/web/server/tests/unit/with_dbs/conftest.py | 6 +++++- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/services/web/server/tests/unit/isolated/test_tracing.py b/services/web/server/tests/unit/isolated/test_tracing.py index 88eec9626a0f..0098da3ced2e 100644 --- a/services/web/server/tests/unit/isolated/test_tracing.py +++ b/services/web/server/tests/unit/isolated/test_tracing.py @@ -4,11 +4,11 @@ import pytest -from opentelemetry.instrumentation.aiohttp_server import ( - middleware as aiohttp_opentelemetry_middleware, -) from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict +from servicelib.aiohttp.tracing import aiohttp_server_opentelemetry_middleware +from servicelib.tracing import TracingData +from simcore_service_api_server._meta import APP_NAME from simcore_service_webserver.application import create_application from simcore_service_webserver.application_settings import ApplicationSettings @@ -32,7 +32,10 @@ def test_middleware_restrictions_opentelemetry_is_second_middleware( ): settings = ApplicationSettings.create_from_envs() assert settings.WEBSERVER_TRACING + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=settings.WEBSERVER_TRACING + ) - app = create_application() + app = create_application(tracing_data=tracing_data) assert app.middlewares - assert app.middlewares[0] is aiohttp_opentelemetry_middleware + assert app.middlewares[0] is aiohttp_server_opentelemetry_middleware diff --git a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py index 1d1b7303f6ed..b7e8013a795e 100644 --- a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py +++ b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py @@ -13,6 +13,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from pytest_simcore.openapi_specs import Entrypoint +from servicelib.tracing import TracingData from simcore_service_webserver.application import create_application from simcore_service_webserver.application_settings import get_application_settings from simcore_service_webserver.rest._utils import get_openapi_specs_path @@ -59,7 +60,10 @@ def app(app_environment: EnvVarsDict) -> web.Application: # - routings happen during setup! # - all plugins are setup but app is NOT started (i.e events are not triggered) # - app_ = create_application() + tracing_data = TracingData.create( + service_name="test-webserver", tracing_settings=None + ) + app_ = create_application(tracing_data=tracing_data) print(get_application_settings(app_).model_dump_json(indent=1)) return app_ diff --git a/services/web/server/tests/unit/with_dbs/03/test_session.py b/services/web/server/tests/unit/with_dbs/03/test_session.py index 2bf9a190e994..5edd8f745c98 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_session.py +++ b/services/web/server/tests/unit/with_dbs/03/test_session.py @@ -14,6 +14,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from pytest_simcore.helpers.webserver_login import NewUser +from servicelib.tracing import TracingData from simcore_service_webserver.application import create_application from simcore_service_webserver.session._cookie_storage import ( SharedCookieEncryptedCookieStorage, @@ -57,7 +58,10 @@ async def _get_user_session(request: web.Request): session = await get_session(request) return web.json_response(dict(session)) - app = create_application() + tracing_data = TracingData.create( + service_name="test-webserver", tracing_settings=None + ) + app = create_application(tracing_data=tracing_data) disable_static_webserver(app) app.add_routes(extra_routes) diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index b5040eb6455e..5c8d35ba577b 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -53,6 +53,7 @@ from pytest_simcore.helpers.webserver_projects import NewProject from pytest_simcore.helpers.webserver_users import UserInfoDict from redis import Redis +from servicelib import tracing from servicelib.common_aiopg_utils import DSN from servicelib.rabbitmq import RabbitMQRPCClient from servicelib.rabbitmq.rpc_interfaces.async_jobs.async_jobs import ( @@ -227,7 +228,10 @@ async def web_server( assert app_environment # original APP - app = create_application() + tracing_data = tracing.TracingData.create( + service_name="test-webserver", tracing_settings=None + ) + app = create_application(tracing_data=tracing_data) disable_static_webserver(app) From 884c07dce3619f72c434750fae6b0763e47b64d3 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 12:35:05 +0200 Subject: [PATCH 40/62] fix import in webserver --- services/web/server/tests/unit/isolated/test_tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/tests/unit/isolated/test_tracing.py b/services/web/server/tests/unit/isolated/test_tracing.py index 0098da3ced2e..430d8d6323be 100644 --- a/services/web/server/tests/unit/isolated/test_tracing.py +++ b/services/web/server/tests/unit/isolated/test_tracing.py @@ -8,7 +8,7 @@ from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.aiohttp.tracing import aiohttp_server_opentelemetry_middleware from servicelib.tracing import TracingData -from simcore_service_api_server._meta import APP_NAME +from simcore_service_webserver._meta import APP_NAME from simcore_service_webserver.application import create_application from simcore_service_webserver.application_settings import ApplicationSettings From 2bf090176f233c017054f051e5d47635198ab125 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 12:37:49 +0200 Subject: [PATCH 41/62] fix clusters keeper tests --- services/clusters-keeper/tests/unit/conftest.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/clusters-keeper/tests/unit/conftest.py b/services/clusters-keeper/tests/unit/conftest.py index f6c4283f77f9..013f9b38faea 100644 --- a/services/clusters-keeper/tests/unit/conftest.py +++ b/services/clusters-keeper/tests/unit/conftest.py @@ -26,9 +26,11 @@ from pytest_mock.plugin import MockerFixture from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict from servicelib.rabbitmq import RabbitMQRPCClient +from servicelib.tracing import TracingData from settings_library.ec2 import EC2Settings from settings_library.rabbit import RabbitSettings from settings_library.ssm import SSMSettings +from simcore_service_clusters_keeper._meta import APP_NAME from simcore_service_clusters_keeper.core.application import create_app from simcore_service_clusters_keeper.core.settings import ( CLUSTERS_KEEPER_ENV_PREFIX, @@ -253,7 +255,10 @@ async def initialized_app( app_environment: EnvVarsDict, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - app = create_app(settings) + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=settings.CLUSTERS_KEEPER_TRACING + ) + app = create_app(settings, tracing_data=tracing_data) async with LifespanManager(app, shutdown_timeout=None if is_pdb_enabled else 20): yield app From 2dc15df2b5fa8438b5f4e652ba966edd83e26056 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 12:44:27 +0200 Subject: [PATCH 42/62] fix imports and typechecks in aiohttp tracing --- packages/service-library/src/servicelib/aiohttp/tracing.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index f67c385bd303..6375b3030c0a 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -14,18 +14,18 @@ AioHttpClientInstrumentor, ) from opentelemetry.instrumentation.aiohttp_server import ( - MetricInstruments, _parse_active_request_count_attrs, _parse_duration_attrs, collect_request_attributes, - extract, get_default_span_details, getter, meter, set_status_code, ) +from opentelemetry.propagate import extract from opentelemetry.sdk.trace import SpanProcessor, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.semconv.metrics import MetricInstruments from settings_library.tracing import TracingSettings from yarl import URL @@ -101,7 +101,8 @@ async def aiohttp_server_opentelemetry_middleware(request: web.Request, handler) description="measures the number of concurrent HTTP requests those are currently in flight", ) tracing_data = request.app[TRACING_DATA_KEY] - assert isinstance(tracing_data, TracingData) + assert isinstance(tracing_data, TracingData) # nosec + assert tracing_data.tracer_provider # nosec tracer = tracing_data.tracer_provider.get_tracer(__name__) with tracer.start_as_current_span( span_name, From 41f68a850ca1dbcdc111146148686edd965e3a8f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 12:49:26 +0200 Subject: [PATCH 43/62] fix various test fixtures --- services/catalog/tests/unit/conftest.py | 12 ++++++++++-- .../test_modules_dynamic_sidecar_client_api_thin.py | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index 0088fa436a0b..ac4ce0c0faf7 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -32,6 +32,8 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.rabbitmq import RabbitMQRPCClient +from servicelib.tracing import TracingData +from simcore_service_catalog._meta import APP_NAME from simcore_service_catalog.core.application import create_app from simcore_service_catalog.core.settings import ApplicationSettings @@ -145,7 +147,10 @@ async def app( # create instance assert app_environment - app_under_test = create_app() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.CATALOG_TRACING + ) + app_under_test = create_app(tracing_data=tracing_data) assert spy_app.on_startup.call_count == 0 assert spy_app.on_shutdown.call_count == 0 @@ -172,7 +177,10 @@ def client( # create instance assert app_environment - app_under_test = create_app() + tracing_data = TracingData.create( + service_name=APP_NAME, tracing_settings=app_settings.CATALOG_TRACING + ) + app_under_test = create_app(tracing_data=tracing_data) assert ( spy_app.on_startup.call_count == 0 diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py index 7e9d4f429a49..e5113739a8c1 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py @@ -16,6 +16,8 @@ from respx import MockRouter, Route from respx.types import SideEffectTypes from servicelib.docker_constants import SUFFIX_EGRESS_PROXY_NAME +from servicelib.tracing import TracingData +from simcore_service_director_v2._meta import APP_NAME from simcore_service_director_v2.core.settings import AppSettings from simcore_service_director_v2.modules.dynamic_sidecar.api_client._thin import ( ThinSidecarsClient, @@ -52,6 +54,11 @@ def mocked_app( app = FastAPI() app.state.settings = AppSettings.create_from_envs() + tracing_data = TracingData.create( + service_name=APP_NAME, + tracing_settings=app.state.settings.DIRECTOR_V2_TRACING, + ) + app.state.tracing_data = tracing_data return app From 2aa10fcf473262b93cfbe9c26d71023b6ce2eb40 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:18:05 +0200 Subject: [PATCH 44/62] disable tracing in tests --- services/catalog/tests/unit/conftest.py | 4 ++-- services/clusters-keeper/tests/unit/conftest.py | 2 +- .../unit/test_modules_dynamic_sidecar_client_api_thin.py | 2 +- services/director/tests/unit/conftest.py | 2 +- services/storage/tests/conftest.py | 4 ++-- .../tests/unit/test__legacy_storage_sdk_compatibility.py | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index ac4ce0c0faf7..35f2979a6849 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -148,7 +148,7 @@ async def app( # create instance assert app_environment tracing_data = TracingData.create( - service_name=APP_NAME, tracing_settings=app_settings.CATALOG_TRACING + service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app_under_test = create_app(tracing_data=tracing_data) @@ -178,7 +178,7 @@ def client( # create instance assert app_environment tracing_data = TracingData.create( - service_name=APP_NAME, tracing_settings=app_settings.CATALOG_TRACING + service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app_under_test = create_app(tracing_data=tracing_data) diff --git a/services/clusters-keeper/tests/unit/conftest.py b/services/clusters-keeper/tests/unit/conftest.py index 013f9b38faea..d0f5167b59ad 100644 --- a/services/clusters-keeper/tests/unit/conftest.py +++ b/services/clusters-keeper/tests/unit/conftest.py @@ -256,7 +256,7 @@ async def initialized_app( ) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() tracing_data = TracingData.create( - service_name=APP_NAME, tracing_settings=settings.CLUSTERS_KEEPER_TRACING + service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app = create_app(settings, tracing_data=tracing_data) async with LifespanManager(app, shutdown_timeout=None if is_pdb_enabled else 20): diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py index e5113739a8c1..9bd6bb84f783 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py @@ -56,7 +56,7 @@ def mocked_app( app.state.settings = AppSettings.create_from_envs() tracing_data = TracingData.create( service_name=APP_NAME, - tracing_settings=app.state.settings.DIRECTOR_V2_TRACING, + tracing_settings=None, # disable tracing in tests ) app.state.tracing_data = tracing_data return app diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 9415c0ed8c04..8318f5c7751a 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -165,7 +165,7 @@ async def app( app_settings: ApplicationSettings, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: tracing_data = TracingData.create( - service_name="director", tracing_settings=app_settings.DIRECTOR_TRACING + service_name="director", tracing_settings=None # disable tracing in tests ) the_test_app = create_app(settings=app_settings, tracing_data=tracing_data) async with LifespanManager( diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index a864ab85883a..71302a41d93b 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -238,7 +238,7 @@ async def initialized_app( app_settings: ApplicationSettings, ) -> AsyncIterator[FastAPI]: tracing_data = TracingData.create( - tracing_settings=app_settings.STORAGE_TRACING, + tracing_settings=None, # disable tracing in tests service_name="storage-api", ) app = create_app(app_settings, tracing_data=tracing_data) @@ -1019,7 +1019,7 @@ async def with_storage_celery_worker( monkeypatch.setenv("STORAGE_WORKER_MODE", "true") app_settings = ApplicationSettings.create_from_envs() tracing_data = TracingData.create( - tracing_settings=app_settings.STORAGE_TRACING, + tracing_settings=None, # disable tracing in tests service_name="storage-api", ) diff --git a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py index a72558bae465..a9b1bd9b23e5 100644 --- a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py +++ b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py @@ -65,7 +65,7 @@ async def _wait_for_server_ready(server: URL) -> None: async def real_storage_server(app_settings: ApplicationSettings) -> AsyncIterator[URL]: settings = ApplicationSettings.create_from_envs() tracing_data = TracingData.create( - tracing_settings=settings.STORAGE_TRACING, + tracing_settings=None, # disable tracing in tests service_name="storage-api", ) app = create_app(settings, tracing_data=tracing_data) From a340f9870b081163b6e639c0439559e03e8a304b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:27:02 +0200 Subject: [PATCH 45/62] fix sidecars_client fixture --- ...modules_dynamic_sidecar_client_api_public.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py index c748fc1cd1b0..89a1449d5272 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py @@ -1,23 +1,24 @@ # pylint:disable=unused-argument # pylint:disable=redefined-outer-name +from collections.abc import AsyncIterable, Callable, Iterator from contextlib import contextmanager -from typing import Any, AsyncIterable, Callable, Iterator +from typing import Any from unittest.mock import AsyncMock -from models_library.api_schemas_dynamic_sidecar.containers import ( - ActivityInfoOrNone -) import pytest from common_library.json_serialization import json_dumps from faker import Faker from fastapi import FastAPI, status from httpx import HTTPError, Response +from models_library.api_schemas_dynamic_sidecar.containers import ActivityInfoOrNone from models_library.sidecar_volumes import VolumeCategory, VolumeStatus from pydantic import AnyHttpUrl, TypeAdapter from pytest_mock import MockerFixture from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.fastapi.http_client_thin import ClientHttpError, UnexpectedStatusError +from servicelib.tracing import TracingData +from simcore_service_director_v2._meta import APP_NAME from simcore_service_director_v2.core.settings import AppSettings from simcore_service_director_v2.modules.dynamic_sidecar.api_client._public import ( SidecarsClient, @@ -65,6 +66,10 @@ async def sidecars_client( ) -> AsyncIterable[SidecarsClient]: app = FastAPI() app.state.settings = AppSettings.create_from_envs() + app.state.tracing_data = TracingData.create( + service_name=APP_NAME, + tracing_settings=None, # disable tracing in tests + ) # WARNING: pytest gets confused with 'setup', use instead alias 'api_client_setup' await api_client_setup(app) @@ -369,7 +374,9 @@ async def test_get_service_activity( status_code=status.HTTP_200_OK, text=json_dumps(mock_dict) ), ) as client: - assert await client.get_service_activity(dynamic_sidecar_endpoint) == TypeAdapter(ActivityInfoOrNone).validate_python(mock_dict) + assert await client.get_service_activity( + dynamic_sidecar_endpoint + ) == TypeAdapter(ActivityInfoOrNone).validate_python(mock_dict) async def test_free_reserved_disk_space( From 84049f3be39b7132e34ea68c4cdbab194a0113da Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:29:35 +0200 Subject: [PATCH 46/62] fix initilaized_app fixture in autoscaling --- services/autoscaling/tests/unit/conftest.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/autoscaling/tests/unit/conftest.py b/services/autoscaling/tests/unit/conftest.py index 8af62e808c8f..1b6f6fb699b5 100644 --- a/services/autoscaling/tests/unit/conftest.py +++ b/services/autoscaling/tests/unit/conftest.py @@ -63,6 +63,7 @@ delenvs_from_dict, setenvs_from_dict, ) +from servicelib.tracing import TracingData from settings_library.rabbit import RabbitSettings from settings_library.ssm import SSMSettings from simcore_service_autoscaling.constants import PRE_PULLED_IMAGES_EC2_TAG_KEY @@ -415,7 +416,11 @@ def enabled_rabbitmq( @pytest.fixture async def initialized_app(app_environment: EnvVarsDict) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - app = create_app(settings) + tracing_data = TracingData.create( + service_name=settings.APP_NAME, + tracing_settings=None, # disable tracing in tests + ) + app = create_app(settings, tracing_data=tracing_data) # NOTE: the timeout is sometime too small for CI machines, and even larger machines async with LifespanManager( app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT From eea9fe98108ca7f7107097d666a3fe265151ed6e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:37:40 +0200 Subject: [PATCH 47/62] fex test fixture in RUT --- .../tests/unit/with_dbs/conftest.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py index 8bf5e5ce5ba7..d5c1a0c0800a 100644 --- a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py +++ b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py @@ -3,10 +3,10 @@ # pylint: disable=unused-argument # pylint: disable=unused-variable -from collections.abc import AsyncIterable, Callable +from collections.abc import AsyncIterable, Awaitable, Callable from datetime import datetime, timezone from random import choice -from typing import Any, Awaitable +from typing import Any import httpx import pytest @@ -24,6 +24,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.rabbitmq import RabbitMQRPCClient +from servicelib.tracing import TracingData from settings_library.rabbit import RabbitSettings from simcore_postgres_database.models.resource_tracker_credit_transactions import ( CreditTransactionClassification, @@ -67,7 +68,11 @@ async def initialized_app( postgres_host_config: dict[str, str], ) -> AsyncIterable[FastAPI]: settings = ApplicationSettings.create_from_envs() - app = create_app(settings) + tracing_data = TracingData.create( + service_name="resource-usage-tracker", + tracing_settings=None, # disable tracing in tests + ) + app = create_app(settings, tracing_data=tracing_data) async with LifespanManager(app): yield app From efc359d8d65b0032d1fb62be867526e6d86d83bc Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:44:49 +0200 Subject: [PATCH 48/62] fix more tests in RUT --- .../tests/unit/conftest.py | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/services/resource-usage-tracker/tests/unit/conftest.py b/services/resource-usage-tracker/tests/unit/conftest.py index 7269ffae0096..bc303fbf2752 100644 --- a/services/resource-usage-tracker/tests/unit/conftest.py +++ b/services/resource-usage-tracker/tests/unit/conftest.py @@ -22,6 +22,7 @@ from pytest_mock import MockerFixture from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict +from servicelib.tracing import TracingData from settings_library.rabbit import RabbitSettings from simcore_service_resource_usage_tracker.core.application import create_app from simcore_service_resource_usage_tracker.core.settings import ApplicationSettings @@ -121,15 +122,27 @@ def app_settings( @pytest.fixture -async def initialized_app(app_settings: ApplicationSettings) -> AsyncIterator[FastAPI]: - app = create_app(app_settings) +def tracing_data(app_settings: ApplicationSettings) -> TracingData: + return TracingData.create( + service_name="resource-usage-tracker-tests", + tracing_settings=None, # disable tracing in tests + ) + + +@pytest.fixture +async def initialized_app( + app_settings: ApplicationSettings, tracing_data: TracingData +) -> AsyncIterator[FastAPI]: + app = create_app(app_settings, tracing_data=tracing_data) async with LifespanManager(app): yield app @pytest.fixture -def client(app_settings: ApplicationSettings) -> Iterator[TestClient]: - app = create_app(app_settings) +def client( + app_settings: ApplicationSettings, tracing_data: TracingData +) -> Iterator[TestClient]: + app = create_app(app_settings, tracing_data=tracing_data) with TestClient(app, base_url="http://testserver.test") as client: yield client From ef7c3d51e4e0a22abcd1e40a9280f0007d3b97bd Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 13:53:51 +0200 Subject: [PATCH 49/62] fix service lib tests --- .../tests/aiohttp/test_tracing.py | 25 ++++++++----------- .../tests/test_logging_utils.py | 24 ++++++++++++++---- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index d68a46ff514d..e697c40cdb8a 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -70,9 +70,10 @@ async def test_valid_tracing_settings( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - async for _ in setup_tracing( - app=app, tracing_settings=tracing_settings, service_name=service_name - )(app): + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) + async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): pass @@ -147,13 +148,12 @@ async def test_tracing_setup_package_detection( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - async for _ in setup_tracing( - app=app, tracing_settings=tracing_settings, service_name=service_name - )(app): + tracing_data = TracingData.create( + tracing_settings=tracing_settings, service_name=service_name + ) + async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): # idempotency - async for _ in setup_tracing( - app=app, tracing_settings=tracing_settings, service_name=service_name - )(app): + async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): pass @@ -195,8 +195,7 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: async for _ in setup_tracing( app=app, - tracing_settings=tracing_settings, - service_name=service_name, + tracing_data=tracing_data, add_response_trace_id_header=True, )(app): client = await aiohttp_client(app) @@ -242,9 +241,7 @@ async def handler(request: web.Request) -> web.Response: app.router.add_get("/", handler) - async for _ in setup_tracing( - app=app, tracing_settings=tracing_settings, service_name=service_name - )(app): + async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): client = await aiohttp_client(app) async def make_request(): diff --git a/packages/service-library/tests/test_logging_utils.py b/packages/service-library/tests/test_logging_utils.py index 63f0d69c7883..ad58f7bf473e 100644 --- a/packages/service-library/tests/test_logging_utils.py +++ b/packages/service-library/tests/test_logging_utils.py @@ -25,6 +25,7 @@ log_exceptions, set_parent_module_log_level, ) +from servicelib.tracing import TracingData from tenacity import ( retry, retry_if_exception_type, @@ -439,10 +440,19 @@ def test_set_parent_module_log_level_(caplog: pytest.LogCaptureFixture): assert "child warning" in caplog.text +@pytest.fixture +def tracing_data() -> TracingData: + return TracingData.create( + service_name="test-service", + tracing_settings=None, # disable tracing in tests + ) + + @pytest.mark.parametrize("log_format_local_dev_enabled", [True, False]) def test_setup_async_loggers_basic( caplog: pytest.LogCaptureFixture, log_format_local_dev_enabled: bool, + tracing_data: TracingData, ): """Test basic async logging setup without filters.""" caplog.clear() @@ -451,7 +461,7 @@ def test_setup_async_loggers_basic( with async_loggers( log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping={}, # No filters for this test - tracing_settings=None, # No tracing for this test + tracing_data=tracing_data, # No tracing for this test log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -463,6 +473,7 @@ def test_setup_async_loggers_basic( def test_setup_async_loggers_with_filters( caplog: pytest.LogCaptureFixture, + tracing_data: TracingData, ): caplog.clear() caplog.set_level(logging.INFO) @@ -475,7 +486,7 @@ def test_setup_async_loggers_with_filters( with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping=filter_mapping, - tracing_settings=None, # No tracing for this test + tracing_data=tracing_data, # no tracing in this test log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -502,6 +513,7 @@ def test_setup_async_loggers_with_filters( def test_setup_async_loggers_with_tracing_settings( caplog: pytest.LogCaptureFixture, + tracing_data: TracingData, ): """Test async logging setup with tracing settings.""" caplog.clear() @@ -512,7 +524,7 @@ def test_setup_async_loggers_with_tracing_settings( with async_loggers( log_format_local_dev_enabled=False, logger_filter_mapping={}, # No filters for this test - tracing_settings=None, + tracing_data=tracing_data, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -524,6 +536,7 @@ def test_setup_async_loggers_with_tracing_settings( def test_setup_async_loggers_context_manager_cleanup( caplog: pytest.LogCaptureFixture, + tracing_data: TracingData, ): """Test that async logging context manager properly cleans up.""" caplog.clear() @@ -534,7 +547,7 @@ def test_setup_async_loggers_context_manager_cleanup( with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping={}, - tracing_settings=None, + tracing_data=tracing_data, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -546,6 +559,7 @@ def test_setup_async_loggers_context_manager_cleanup( def test_setup_async_loggers_exception_handling( caplog: pytest.LogCaptureFixture, + tracing_data: TracingData, ): """Test that async logging handles exceptions gracefully.""" caplog.clear() @@ -560,7 +574,7 @@ def _raise_test_exception(): with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping={}, - tracing_settings=None, + tracing_data=tracing_data, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): From e8f90fbf42b258932d2400c4e9c5636616cce142 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 14:01:48 +0200 Subject: [PATCH 50/62] minor fix in servicelib tracing --- packages/service-library/tests/aiohttp/test_tracing.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index e697c40cdb8a..7b483a3ba472 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -244,10 +244,7 @@ async def handler(request: web.Request) -> web.Response: async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): client = await aiohttp_client(app) - async def make_request(): - await client.get("/") - - await asyncio.gather(*(make_request() for _ in range(n_requests))) + await asyncio.gather(*(client.get("/") for _ in range(n_requests))) trace_ids = { span.context.trace_id for span in mock_otel_collector.get_finished_spans() From 6a0cce0dd34ed888c3de3290f082ef1c45f63420 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 16:04:20 +0200 Subject: [PATCH 51/62] several fixes --- .../src/simcore_service_dynamic_scheduler/core/application.py | 1 - .../src/simcore_service_dynamic_scheduler/core/events.py | 1 - .../web/server/src/simcore_service_webserver/application.py | 3 ++- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index 88a88c42f07e..bfbf621e644c 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -36,7 +36,6 @@ def create_app( ), redoc_url=None, lifespan=events.create_app_lifespan( - settings=app_settings, tracing_data=app_tracing_data, logging_lifespan=logging_lifespan, ), diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index 2b0d65fc8ae7..286693b16367 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -55,7 +55,6 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]: def create_app_lifespan( - settings: ApplicationSettings, tracing_data: TracingData, logging_lifespan: Lifespan | None, ) -> LifespanManager: diff --git a/services/web/server/src/simcore_service_webserver/application.py b/services/web/server/src/simcore_service_webserver/application.py index 4c79b982b8a7..8ff5633b45a8 100644 --- a/services/web/server/src/simcore_service_webserver/application.py +++ b/services/web/server/src/simcore_service_webserver/application.py @@ -113,7 +113,8 @@ def create_application(tracing_data: TracingData) -> web.Application: # NOTE: compute setup order https://github.com/ITISFoundation/osparc-simcore/issues/1142 # core modules - setup_app_tracing(app) # WARNING: must be UPPERMOST middleware + if tracing_data.tracing_enabled: + setup_app_tracing(app) # WARNING: must be UPPERMOST middleware setup_db(app) setup_redis(app) setup_session(app) From 3cddbc285b44565c20e8f46f882ec7265b3a5a6a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 7 Oct 2025 16:22:07 +0200 Subject: [PATCH 52/62] fix aiohttp tracing tests --- packages/service-library/tests/aiohttp/test_tracing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index 7b483a3ba472..95b3d9a6c575 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -15,7 +15,7 @@ from opentelemetry import trace from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from pydantic import ValidationError -from servicelib.aiohttp.tracing import setup_tracing +from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingData from settings_library.tracing import TracingSettings @@ -180,6 +180,7 @@ async def test_trace_id_in_response_header( tracing_data = TracingData.create( tracing_settings=tracing_settings, service_name=service_name ) + app[TRACING_DATA_KEY] = tracing_data async def handler(handler_data: dict, request: web.Request) -> web.Response: current_span = trace.get_current_span() @@ -235,6 +236,7 @@ async def test_tracing_sampling_probability_effective( tracing_data = TracingData.create( tracing_settings=tracing_settings, service_name=service_name ) + app[TRACING_DATA_KEY] = tracing_data async def handler(request: web.Request) -> web.Response: return web.Response(text="ok") From e4c11e844fd5a276b5529ecbd16310ebf42a571f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 8 Oct 2025 16:06:51 +0200 Subject: [PATCH 53/62] TracingData -> TracingConfig @GitHK --- .../src/servicelib/aiohttp/tracing.py | 26 +++++----- .../src/servicelib/fastapi/client_session.py | 8 +-- .../servicelib/fastapi/http_client_thin.py | 8 +-- .../servicelib/fastapi/logging_lifespan.py | 10 ++-- .../src/servicelib/fastapi/tracing.py | 52 ++++++++++--------- .../src/servicelib/logging_utils.py | 14 ++--- .../service-library/src/servicelib/tracing.py | 12 ++--- .../tests/aiohttp/test_tracing.py | 10 ++-- .../tests/fastapi/test_tracing.py | 14 ++--- .../tests/test_logging_utils.py | 16 +++--- .../simcore_service_agent/core/application.py | 13 ++--- .../agent/src/simcore_service_agent/main.py | 4 +- .../celery_worker/worker_main.py | 4 +- .../core/application.py | 7 +-- .../src/simcore_service_api_server/main.py | 4 +- .../utils/client_base.py | 4 +- .../core/application.py | 4 +- .../src/simcore_service_autoscaling/main.py | 2 +- services/autoscaling/tests/unit/conftest.py | 4 +- .../clients/director.py | 4 +- .../core/application.py | 4 +- .../src/simcore_service_catalog/main.py | 4 +- services/catalog/tests/unit/conftest.py | 6 +-- .../core/application.py | 4 +- .../simcore_service_clusters_keeper/main.py | 4 +- .../clusters-keeper/tests/unit/conftest.py | 4 +- .../utils/logs.py | 6 ++- .../core/application.py | 4 +- .../simcore_service_datcore_adapter/main.py | 2 +- .../core/application.py | 14 ++--- .../modules/catalog.py | 4 +- .../modules/director_v0.py | 4 +- .../modules/dynamic_services.py | 6 +-- .../dynamic_sidecar/api_client/_thin.py | 4 +- .../modules/resource_usage_tracker_client.py | 4 +- .../modules/storage.py | 4 +- ...dules_dynamic_sidecar_client_api_public.py | 4 +- ...modules_dynamic_sidecar_client_api_thin.py | 4 +- .../core/application.py | 4 +- .../src/simcore_service_director/main.py | 4 +- services/director/tests/unit/conftest.py | 4 +- .../core/application.py | 6 +-- .../core/events.py | 4 +- .../simcore_service_dynamic_scheduler/main.py | 4 +- .../services/catalog/_thin_client.py | 4 +- .../services/director_v0/_thin_client.py | 4 +- .../services/director_v2/_thin_client.py | 4 +- .../core/application.py | 14 ++--- .../core/application.py | 7 +-- .../src/simcore_service_efs_guardian/main.py | 2 +- .../core/application.py | 17 +++--- .../src/simcore_service_invitations/main.py | 4 +- .../core/application.py | 6 +-- .../src/simcore_service_notifications/main.py | 4 +- .../core/application.py | 7 +-- .../src/simcore_service_payments/main.py | 4 +- .../services/payments_gateway.py | 4 +- .../services/resource_usage_tracker.py | 4 +- .../services/stripe.py | 4 +- .../core/application.py | 4 +- .../main.py | 4 +- .../tests/unit/conftest.py | 10 ++-- .../tests/unit/with_dbs/conftest.py | 4 +- .../core/application.py | 8 +-- .../src/simcore_service_storage/main.py | 4 +- .../modules/celery/worker_main.py | 4 +- services/storage/tests/conftest.py | 6 +-- .../test__legacy_storage_sdk_compatibility.py | 4 +- .../simcore_service_webserver/application.py | 16 +++--- .../src/simcore_service_webserver/cli.py | 16 +++--- .../src/simcore_service_webserver/log.py | 6 +-- .../src/simcore_service_webserver/tracing.py | 4 +- .../tests/unit/isolated/test_tracing.py | 4 +- .../unit/with_dbs/03/test__openapi_specs.py | 4 +- .../tests/unit/with_dbs/03/test_session.py | 4 +- .../server/tests/unit/with_dbs/conftest.py | 2 +- 76 files changed, 268 insertions(+), 257 deletions(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 6375b3030c0a..6fc51c054298 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -30,11 +30,11 @@ from yarl import URL from ..logging_utils import log_context -from ..tracing import TracingData, get_trace_id_header +from ..tracing import TracingConfig, get_trace_id_header _logger = logging.getLogger(__name__) -TRACING_DATA_KEY: Final[str] = "tracing_data" +TRACING_CONFIG_KEY: Final[str] = "tracing_config" try: from opentelemetry.instrumentation.botocore import ( # type: ignore[import-not-found] @@ -100,10 +100,10 @@ async def aiohttp_server_opentelemetry_middleware(request: web.Request, handler) unit="requests", description="measures the number of concurrent HTTP requests those are currently in flight", ) - tracing_data = request.app[TRACING_DATA_KEY] - assert isinstance(tracing_data, TracingData) # nosec - assert tracing_data.tracer_provider # nosec - tracer = tracing_data.tracer_provider.get_tracer(__name__) + tracing_config = request.app[TRACING_CONFIG_KEY] + assert isinstance(tracing_config, TracingConfig) # nosec + assert tracing_config.tracer_provider # nosec + tracer = tracing_config.tracer_provider.get_tracer(__name__) with tracer.start_as_current_span( span_name, context=extract(request, getter=getter), @@ -284,21 +284,21 @@ def _shutdown() -> None: def setup_tracing( *, app: web.Application, - tracing_data: TracingData, + tracing_config: TracingConfig, add_response_trace_id_header: bool = False, ) -> Callable[[web.Application], AsyncIterator]: - if tracing_data.tracing_enabled is False: + if tracing_config.tracing_enabled is False: msg = "Tracing is not enabled" raise ValueError(msg) - assert tracing_data.tracer_provider # nosec - assert tracing_data.tracing_settings # nosec + assert tracing_config.tracer_provider # nosec + assert tracing_config.tracing_settings # nosec _startup( app=app, - tracing_settings=tracing_data.tracing_settings, - tracer_provider=tracing_data.tracer_provider, - service_name=tracing_data.service_name, + tracing_settings=tracing_config.tracing_settings, + tracer_provider=tracing_config.tracer_provider, + service_name=tracing_config.service_name, add_response_trace_id_header=add_response_trace_id_header, ) diff --git a/packages/service-library/src/servicelib/fastapi/client_session.py b/packages/service-library/src/servicelib/fastapi/client_session.py index 615b05312d6e..287f974306a4 100644 --- a/packages/service-library/src/servicelib/fastapi/client_session.py +++ b/packages/service-library/src/servicelib/fastapi/client_session.py @@ -2,7 +2,7 @@ import httpx from fastapi import FastAPI -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .tracing import setup_httpx_client_tracing @@ -12,7 +12,7 @@ def setup_client_session( *, default_timeout: datetime.timedelta = datetime.timedelta(seconds=20), max_keepalive_connections: int = 20, - tracing_data: TracingData | None + tracing_config: TracingConfig | None ) -> None: async def on_startup() -> None: session = httpx.AsyncClient( @@ -20,8 +20,8 @@ async def on_startup() -> None: limits=httpx.Limits(max_keepalive_connections=max_keepalive_connections), timeout=default_timeout.total_seconds(), ) - if tracing_data: - setup_httpx_client_tracing(session, tracing_data=tracing_data) + if tracing_config: + setup_httpx_client_tracing(session, tracing_config=tracing_config) app.state.aiohttp_client_session = session async def on_shutdown() -> None: diff --git a/packages/service-library/src/servicelib/fastapi/http_client_thin.py b/packages/service-library/src/servicelib/fastapi/http_client_thin.py index ff6e280ca45e..7c2a887113ba 100644 --- a/packages/service-library/src/servicelib/fastapi/http_client_thin.py +++ b/packages/service-library/src/servicelib/fastapi/http_client_thin.py @@ -8,7 +8,7 @@ from common_library.errors_classes import OsparcErrorMixin from httpx import AsyncClient, ConnectError, HTTPError, PoolTimeout, Response from httpx._types import TimeoutTypes, URLTypes -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.tracing import TracingSettings from tenacity import RetryCallState from tenacity.asyncio import AsyncRetrying @@ -202,7 +202,7 @@ def __init__( *, total_retry_interval: float, tracing_settings: TracingSettings | None, - tracing_data: TracingData | None, + tracing_config: TracingConfig | None, base_url: URLTypes | None = None, default_http_client_timeout: TimeoutTypes | None = None, extra_allowed_method_names: set[str] | None = None, @@ -226,8 +226,8 @@ def __init__( client_args["timeout"] = default_http_client_timeout client = AsyncClient(**client_args) - if tracing_settings and tracing_data: - setup_httpx_client_tracing(client, tracing_data=tracing_data) + if tracing_settings and tracing_config: + setup_httpx_client_tracing(client, tracing_config=tracing_config) super().__init__(client=client) async def __aenter__(self): diff --git a/packages/service-library/src/servicelib/fastapi/logging_lifespan.py b/packages/service-library/src/servicelib/fastapi/logging_lifespan.py index dd147c269b31..4cdcfb4a603a 100644 --- a/packages/service-library/src/servicelib/fastapi/logging_lifespan.py +++ b/packages/service-library/src/servicelib/fastapi/logging_lifespan.py @@ -4,7 +4,7 @@ from common_library.logging.logging_utils_filtering import LoggerName, MessageSubstring from fastapi import FastAPI -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from ..logging_utils import ( LogLevelInt, @@ -20,7 +20,7 @@ def create_logging_lifespan( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_data: TracingData, + tracing_config: TracingConfig, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Lifespan: @@ -32,7 +32,7 @@ def create_logging_lifespan( noisy_loggers=noisy_loggers, log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping=logger_filter_mapping, - tracing_data=tracing_data, + tracing_config=tracing_config, ) ) @@ -49,7 +49,7 @@ def create_logging_shutdown_event( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_data: TracingData, + tracing_config: TracingConfig, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Callable[[], Awaitable[None]]: @@ -67,7 +67,7 @@ def create_logging_shutdown_event( noisy_loggers=noisy_loggers, log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping=logger_filter_mapping, - tracing_data=tracing_data, + tracing_config=tracing_config, ) ) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 31f77dd93df3..2d6419a381e5 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -18,7 +18,7 @@ from yarl import URL from ..logging_utils import log_context -from ..tracing import TracingData, get_trace_id_header +from ..tracing import TracingConfig, get_trace_id_header _logger = logging.getLogger(__name__) @@ -186,36 +186,36 @@ def _shutdown() -> None: def initialize_fastapi_app_tracing( app: FastAPI, *, - tracing_data: TracingData, + tracing_config: TracingConfig, add_response_trace_id_header: bool = False, ): if add_response_trace_id_header: app.add_middleware(ResponseTraceIdHeaderMiddleware) FastAPIInstrumentor.instrument_app( - app, tracer_provider=tracing_data.tracer_provider + app, tracer_provider=tracing_config.tracer_provider ) def setup_httpx_client_tracing( - client: AsyncClient | Client, tracing_data: TracingData + client: AsyncClient | Client, tracing_config: TracingConfig ) -> None: HTTPXClientInstrumentor.instrument_client( - client, tracer_provider=tracing_data.tracer_provider + client, tracer_provider=tracing_config.tracer_provider ) -def setup_tracing(app: FastAPI, tracing_data: TracingData) -> None: +def setup_tracing(app: FastAPI, tracing_config: TracingConfig) -> None: # NOTE: This does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - if not tracing_data.tracing_enabled: - msg = "Tracing is not enabled in tracing_data" + if not tracing_config.tracing_enabled: + msg = "Tracing is not enabled in tracing_config" raise ValueError(msg) - assert tracing_data.tracing_settings # nosec - assert tracing_data.tracer_provider # nosec + assert tracing_config.tracing_settings # nosec + assert tracing_config.tracer_provider # nosec _startup( - tracing_settings=tracing_data.tracing_settings, - service_name=tracing_data.service_name, - tracer_provider=tracing_data.tracer_provider, + tracing_settings=tracing_config.tracing_settings, + service_name=tracing_config.service_name, + tracer_provider=tracing_config.tracer_provider, ) def _on_shutdown() -> None: @@ -224,17 +224,17 @@ def _on_shutdown() -> None: app.add_event_handler("shutdown", _on_shutdown) -def get_tracing_instrumentation_lifespan(tracing_data: TracingData): +def get_tracing_instrumentation_lifespan(tracing_config: TracingConfig): # NOTE: This lifespan does not instrument the app itself. Call setup_fastapi_app_tracing to do that. - if not tracing_data.tracing_enabled: - msg = "Tracing is not enabled in tracing_data" + if not tracing_config.tracing_enabled: + msg = "Tracing is not enabled in tracing_config" raise ValueError(msg) - assert tracing_data.tracing_settings # nosec - assert tracing_data.tracer_provider # nosec + assert tracing_config.tracing_settings # nosec + assert tracing_config.tracer_provider # nosec _startup( - tracing_settings=tracing_data.tracing_settings, - service_name=tracing_data.service_name, - tracer_provider=tracing_data.tracer_provider, + tracing_settings=tracing_config.tracing_settings, + service_name=tracing_config.service_name, + tracer_provider=tracing_config.tracer_provider, ) async def tracing_instrumentation_lifespan( @@ -259,7 +259,9 @@ async def dispatch(self, request: Request, call_next): return response -def get_tracing_data(app: FastAPI) -> TracingData: - assert hasattr(app.state, "tracing_data"), "Tracing not setup for this app" # nosec - assert isinstance(app.state.tracing_data, TracingData) - return app.state.tracing_data +def get_tracing_config(app: FastAPI) -> TracingConfig: + assert hasattr( + app.state, "tracing_config" + ), "Tracing not setup for this app" # nosec + assert isinstance(app.state.tracing_config, TracingConfig) + return app.state.tracing_config diff --git a/packages/service-library/src/servicelib/logging_utils.py b/packages/service-library/src/servicelib/logging_utils.py index aec0fd2aca8e..45ead816e330 100644 --- a/packages/service-library/src/servicelib/logging_utils.py +++ b/packages/service-library/src/servicelib/logging_utils.py @@ -28,7 +28,7 @@ MessageSubstring, ) -from .tracing import TracingData, setup_log_tracing +from .tracing import TracingConfig, setup_log_tracing from .utils_secrets import mask_sensitive_data _logger = logging.getLogger(__name__) @@ -181,7 +181,7 @@ def _dampen_noisy_loggers( def _configure_common_logging_settings( *, log_format_local_dev_enabled: bool, - tracing_data: TracingData, + tracing_config: TracingConfig, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> logging.Formatter: @@ -193,7 +193,7 @@ def _configure_common_logging_settings( _setup_base_logging_level(log_base_level) if noisy_loggers is not None: _dampen_noisy_loggers(noisy_loggers) - setup_log_tracing(tracing_data=tracing_data) + setup_log_tracing(tracing_config=tracing_config) return _setup_logging_formatter( log_format_local_dev_enabled=log_format_local_dev_enabled, ) @@ -217,7 +217,7 @@ def setup_loggers( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_data: TracingData, + tracing_config: TracingConfig, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> None: @@ -259,7 +259,7 @@ def setup_loggers( """ formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=log_base_level, noisy_loggers=noisy_loggers, ) @@ -325,7 +325,7 @@ def async_loggers( *, log_format_local_dev_enabled: bool, logger_filter_mapping: dict[LoggerName, list[MessageSubstring]], - tracing_data: TracingData, + tracing_config: TracingConfig, log_base_level: LogLevelInt, noisy_loggers: tuple[str, ...] | None, ) -> Iterator[None]: @@ -373,7 +373,7 @@ def async_loggers( """ formatter = _configure_common_logging_settings( log_format_local_dev_enabled=log_format_local_dev_enabled, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=log_base_level, noisy_loggers=noisy_loggers, ) diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index 00e3a3608953..4e59e07ea8f2 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -42,7 +42,7 @@ def use_tracing_context(context: TracingContext): otcontext.detach(token) -class TracingData(BaseModel): +class TracingConfig(BaseModel): model_config = ConfigDict(frozen=True, arbitrary_types_allowed=True) service_name: str tracing_settings: TracingSettings | None @@ -77,10 +77,10 @@ def create( ) -def setup_log_tracing(tracing_data: TracingData): - if tracing_data.tracing_enabled: +def setup_log_tracing(tracing_config: TracingConfig): + if tracing_config.tracing_enabled: LoggingInstrumentor().instrument( - set_logging_format=False, tracer_provider=tracing_data.tracer_provider + set_logging_format=False, tracer_provider=tracing_config.tracer_provider ) @@ -97,11 +97,11 @@ def get_trace_id_header() -> dict[str, str] | None: @contextmanager -def profiled_span(*, tracing_data: TracingData, span_name: str): +def profiled_span(*, tracing_config: TracingConfig, span_name: str): if not _is_tracing(): return tracer = trace.get_tracer( - _TRACER_NAME, tracer_provider=tracing_data.tracer_provider + _TRACER_NAME, tracer_provider=tracing_config.tracer_provider ) with tracer.start_as_current_span(span_name) as span: profiler = pyinstrument.Profiler(async_mode="enabled") diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index 95b3d9a6c575..264196ff7943 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -16,7 +16,7 @@ from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from pydantic import ValidationError from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing -from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingData +from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingConfig from settings_library.tracing import TracingSettings @@ -70,7 +70,7 @@ async def test_valid_tracing_settings( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): @@ -148,7 +148,7 @@ async def test_tracing_setup_package_detection( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): @@ -177,7 +177,7 @@ async def test_trace_id_in_response_header( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) app[TRACING_DATA_KEY] = tracing_data @@ -233,7 +233,7 @@ async def test_tracing_sampling_probability_effective( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) app[TRACING_DATA_KEY] = tracing_data diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 25b547448225..1b5250ec382a 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -24,7 +24,7 @@ from servicelib.tracing import ( _OSPARC_TRACE_ID_HEADER, _PROFILE_ATTRIBUTE_NAME, - TracingData, + TracingConfig, profiled_span, ) from settings_library.tracing import TracingSettings @@ -84,7 +84,7 @@ async def test_valid_tracing_settings( tracing_settings_in: Callable[[], dict[str, Any]], ): tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( @@ -122,7 +122,7 @@ async def test_invalid_tracing_settings( app = mocked_app with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012 tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( @@ -180,7 +180,7 @@ async def test_tracing_setup_package_detection( package_name = manage_package importlib.import_module(package_name) tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( @@ -215,7 +215,7 @@ async def test_trace_id_in_response_header( server_response: PlainTextResponse | HTTPException, ) -> None: tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) @@ -268,7 +268,7 @@ async def test_with_profile_span( server_response: PlainTextResponse | HTTPException, ): tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) @@ -328,7 +328,7 @@ async def test_tracing_sampling_probability_effective( tolerance_probability = 0.5 tracing_settings = TracingSettings() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) diff --git a/packages/service-library/tests/test_logging_utils.py b/packages/service-library/tests/test_logging_utils.py index ad58f7bf473e..de3da0a45bcf 100644 --- a/packages/service-library/tests/test_logging_utils.py +++ b/packages/service-library/tests/test_logging_utils.py @@ -25,7 +25,7 @@ log_exceptions, set_parent_module_log_level, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from tenacity import ( retry, retry_if_exception_type, @@ -441,8 +441,8 @@ def test_set_parent_module_log_level_(caplog: pytest.LogCaptureFixture): @pytest.fixture -def tracing_data() -> TracingData: - return TracingData.create( +def tracing_data() -> TracingConfig: + return TracingConfig.create( service_name="test-service", tracing_settings=None, # disable tracing in tests ) @@ -452,7 +452,7 @@ def tracing_data() -> TracingData: def test_setup_async_loggers_basic( caplog: pytest.LogCaptureFixture, log_format_local_dev_enabled: bool, - tracing_data: TracingData, + tracing_data: TracingConfig, ): """Test basic async logging setup without filters.""" caplog.clear() @@ -473,7 +473,7 @@ def test_setup_async_loggers_basic( def test_setup_async_loggers_with_filters( caplog: pytest.LogCaptureFixture, - tracing_data: TracingData, + tracing_data: TracingConfig, ): caplog.clear() caplog.set_level(logging.INFO) @@ -513,7 +513,7 @@ def test_setup_async_loggers_with_filters( def test_setup_async_loggers_with_tracing_settings( caplog: pytest.LogCaptureFixture, - tracing_data: TracingData, + tracing_data: TracingConfig, ): """Test async logging setup with tracing settings.""" caplog.clear() @@ -536,7 +536,7 @@ def test_setup_async_loggers_with_tracing_settings( def test_setup_async_loggers_context_manager_cleanup( caplog: pytest.LogCaptureFixture, - tracing_data: TracingData, + tracing_data: TracingConfig, ): """Test that async logging context manager properly cleans up.""" caplog.clear() @@ -559,7 +559,7 @@ def test_setup_async_loggers_context_manager_cleanup( def test_setup_async_loggers_exception_handling( caplog: pytest.LogCaptureFixture, - tracing_data: TracingData, + tracing_data: TracingConfig, ): """Test that async logging handles exceptions gracefully.""" caplog.clear() diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index 809267ad46dc..9609382f9c4b 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -7,11 +7,11 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( - get_tracing_data, + get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VTAG, @@ -33,7 +33,8 @@ def create_app( - settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None + settings: ApplicationSettings | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() @@ -42,7 +43,7 @@ def create_app( json_dumps(settings, indent=2, sort_keys=True), ) if tracing_data is None: - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.AGENT_TRACING ) @@ -60,7 +61,7 @@ def create_app( app.state.tracing_data = tracing_data if settings.AGENT_TRACING: - setup_tracing(app, get_tracing_data(app)) + setup_tracing(app, get_tracing_config(app)) setup_instrumentation(app) @@ -71,7 +72,7 @@ def create_app( setup_rpc_api_routes(app) if settings.AGENT_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/agent/src/simcore_service_agent/main.py b/services/agent/src/simcore_service_agent/main.py index 9b68e5c98438..01c17d726bf1 100644 --- a/services/agent/src/simcore_service_agent/main.py +++ b/services/agent/src/simcore_service_agent/main.py @@ -4,7 +4,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_agent.core.application import create_app from simcore_service_agent.core.settings import ApplicationSettings @@ -22,7 +22,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.AGENT_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py index a150e0ab8a51..18df5710e6a0 100644 --- a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py +++ b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py @@ -8,7 +8,7 @@ ) from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.logging_utils import setup_loggers -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from ..core.application import create_app from ..core.settings import ApplicationSettings @@ -18,7 +18,7 @@ def get_app(): _settings = ApplicationSettings.create_from_envs() _tracing_settings = _settings.API_SERVER_TRACING - _tracing_data = TracingData.create( + _tracing_data = TracingConfig.create( tracing_settings=_tracing_settings, service_name="api-server-celery-worker", ) diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index c8bd579af51a..b8d32636c91c 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -10,7 +10,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .. import exceptions from .._meta import API_VERSION, API_VTAG, APP_NAME @@ -51,7 +51,8 @@ def _label_title_and_version(settings: ApplicationSettings, title: str, version: def create_app( - settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None + settings: ApplicationSettings | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() @@ -60,7 +61,7 @@ def create_app( json_dumps(settings, indent=2, sort_keys=True), ) if tracing_data is None: - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.API_SERVER_TRACING ) diff --git a/services/api-server/src/simcore_service_api_server/main.py b/services/api-server/src/simcore_service_api_server/main.py index 0a1e8921bdc0..12d626535f5f 100644 --- a/services/api-server/src/simcore_service_api_server/main.py +++ b/services/api-server/src/simcore_service_api_server/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_api_server.core.application import create_app from simcore_service_api_server.core.settings import ApplicationSettings @@ -24,7 +24,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.API_SERVER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/api-server/src/simcore_service_api_server/utils/client_base.py b/services/api-server/src/simcore_service_api_server/utils/client_base.py index 7847aba08156..c5b4442bfd16 100644 --- a/services/api-server/src/simcore_service_api_server/utils/client_base.py +++ b/services/api-server/src/simcore_service_api_server/utils/client_base.py @@ -5,7 +5,7 @@ import httpx from fastapi import FastAPI from httpx import AsyncClient, Timeout -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from settings_library.tracing import TracingSettings from .app_data import AppDataMixin @@ -62,7 +62,7 @@ def setup_client_instance( if tracing_settings: setup_httpx_client_tracing( client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) # events diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index b7b44e1c2157..c7375bdb4100 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -5,7 +5,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -35,7 +35,7 @@ logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.AUTOSCALING_DEBUG, title=APP_NAME, diff --git a/services/autoscaling/src/simcore_service_autoscaling/main.py b/services/autoscaling/src/simcore_service_autoscaling/main.py index 5b709d8e6a80..72b1977f2b2e 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/main.py +++ b/services/autoscaling/src/simcore_service_autoscaling/main.py @@ -25,7 +25,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingData.create( + tracing_data = tracing.TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.AUTOSCALING_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/autoscaling/tests/unit/conftest.py b/services/autoscaling/tests/unit/conftest.py index 1b6f6fb699b5..c7ec352ba53d 100644 --- a/services/autoscaling/tests/unit/conftest.py +++ b/services/autoscaling/tests/unit/conftest.py @@ -63,7 +63,7 @@ delenvs_from_dict, setenvs_from_dict, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.rabbit import RabbitSettings from settings_library.ssm import SSMSettings from simcore_service_autoscaling.constants import PRE_PULLED_IMAGES_EC2_TAG_KEY @@ -416,7 +416,7 @@ def enabled_rabbitmq( @pytest.fixture async def initialized_app(app_environment: EnvVarsDict) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=settings.APP_NAME, tracing_settings=None, # disable tracing in tests ) diff --git a/services/catalog/src/simcore_service_catalog/clients/director.py b/services/catalog/src/simcore_service_catalog/clients/director.py index 4b791b580212..29157a07b894 100644 --- a/services/catalog/src/simcore_service_catalog/clients/director.py +++ b/services/catalog/src/simcore_service_catalog/clients/director.py @@ -15,7 +15,7 @@ from models_library.services_metadata_published import ServiceMetaDataPublished from models_library.services_types import ServiceKey, ServiceVersion from pydantic import NonNegativeInt, TypeAdapter -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from servicelib.logging_utils import log_catch, log_context from starlette import status from tenacity.asyncio import AsyncRetrying @@ -148,7 +148,7 @@ def __init__(self, base_url: str, app: FastAPI): if settings.CATALOG_TRACING: setup_httpx_client_tracing( self.client, - tracing_data=get_tracing_data(app=app), + tracing_data=get_tracing_config(app=app), ) assert settings.CATALOG_DIRECTOR # nosec diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index 026cc0fbb934..48226994fed4 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -14,7 +14,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from starlette.middleware.base import BaseHTTPMiddleware from .._meta import ( @@ -32,7 +32,7 @@ def create_app( *, - tracing_data: TracingData, + tracing_data: TracingConfig, settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, ) -> FastAPI: diff --git a/services/catalog/src/simcore_service_catalog/main.py b/services/catalog/src/simcore_service_catalog/main.py index c863df057564..64b4e32779d4 100644 --- a/services/catalog/src/simcore_service_catalog/main.py +++ b/services/catalog/src/simcore_service_catalog/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_lifespan -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_catalog.core.application import create_app from simcore_service_catalog.core.settings import ApplicationSettings @@ -25,7 +25,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=app_settings.CATALOG_TRACING, service_name="catalog", ) diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index 35f2979a6849..7c0b58ccd72a 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -32,7 +32,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.rabbitmq import RabbitMQRPCClient -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_catalog._meta import APP_NAME from simcore_service_catalog.core.application import create_app from simcore_service_catalog.core.settings import ApplicationSettings @@ -147,7 +147,7 @@ async def app( # create instance assert app_environment - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app_under_test = create_app(tracing_data=tracing_data) @@ -177,7 +177,7 @@ def client( # create instance assert app_environment - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app_under_test = create_app(tracing_data=tracing_data) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index b258e5fb2966..6de830047c31 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -8,7 +8,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -30,7 +30,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: _logger.info("app settings: %s", settings.model_dump_json(indent=1)) app = FastAPI( diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py index 132817af4268..71d9d26c2907 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_clusters_keeper.core.application import create_app from simcore_service_clusters_keeper.core.settings import ApplicationSettings @@ -25,7 +25,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.CLUSTERS_KEEPER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/clusters-keeper/tests/unit/conftest.py b/services/clusters-keeper/tests/unit/conftest.py index d0f5167b59ad..cd01558ade6e 100644 --- a/services/clusters-keeper/tests/unit/conftest.py +++ b/services/clusters-keeper/tests/unit/conftest.py @@ -26,7 +26,7 @@ from pytest_mock.plugin import MockerFixture from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict from servicelib.rabbitmq import RabbitMQRPCClient -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.ec2 import EC2Settings from settings_library.rabbit import RabbitSettings from settings_library.ssm import SSMSettings @@ -255,7 +255,7 @@ async def initialized_app( app_environment: EnvVarsDict, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) app = create_app(settings, tracing_data=tracing_data) diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index 59b67f3a55cf..e751f82823d3 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -1,7 +1,7 @@ from typing import Final from servicelib.logging_utils import setup_loggers -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import PROJECT_NAME from ..settings import ApplicationSettings @@ -14,7 +14,9 @@ def setup_app_logging(settings: ApplicationSettings) -> None: - tracing_data = TracingData.create(service_name=PROJECT_NAME, tracing_settings=None) + tracing_data = TracingConfig.create( + service_name=PROJECT_NAME, tracing_settings=None + ) setup_loggers( log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=settings.DASK_LOG_FILTER_MAPPING, diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index f6e3a658c903..a5f1a429bcb3 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -14,7 +14,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from starlette.middleware.base import BaseHTTPMiddleware from .._meta import API_VERSION, API_VTAG, APP_NAME @@ -31,7 +31,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py index 6a138a687eb3..50ffdd84967f 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py @@ -23,7 +23,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingData.create( + tracing_data = tracing.TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DATCORE_ADAPTER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index 401172e3ca6b..c5e20bac2dbc 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -13,11 +13,11 @@ ) from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import ( - get_tracing_data, + get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY from ..api.entrypoints import api_router @@ -121,7 +121,7 @@ def create_base_app( if app_settings is None: app_settings = AppSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DIRECTOR_V2_TRACING ) logging_shutdown_event = create_logging_shutdown_event( @@ -175,8 +175,8 @@ def create_app( # noqa: C901, PLR0912 substitutions.setup(app) - if get_tracing_data(app).tracing_enabled: - setup_tracing(app, get_tracing_data(app)) + if get_tracing_config(app).tracing_enabled: + setup_tracing(app, get_tracing_config(app)) if settings.DIRECTOR_V2_PROMETHEUS_INSTRUMENTATION_ENABLED: instrumentation.setup(app) @@ -204,8 +204,8 @@ def create_app( # noqa: C901, PLR0912 db.setup(app, settings.POSTGRES) - if get_tracing_data(app).tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if get_tracing_config(app).tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py index aa9a095e87f2..efe7fa9308c6 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py @@ -11,7 +11,7 @@ from models_library.services_resources import ServiceResourcesDict from models_library.users import UserID from pydantic import TypeAdapter -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from settings_library.catalog import CatalogSettings from settings_library.tracing import TracingSettings @@ -37,7 +37,7 @@ async def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) CatalogClient.create( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py index f0196f7936f9..38f68b2db981 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py @@ -13,7 +13,7 @@ from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from models_library.users import UserID -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from servicelib.logging_utils import log_decorator from settings_library.director_v0 import DirectorV0Settings from settings_library.tracing import TracingSettings @@ -42,7 +42,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) DirectorV0Client.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py index d796e37237ca..588a833bbfac 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py @@ -5,7 +5,7 @@ import httpx from fastapi import FastAPI -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from ..utils.client_decorators import handle_errors, handle_retry @@ -17,10 +17,10 @@ def on_startup() -> None: client = httpx.AsyncClient( timeout=app.state.settings.CLIENT_REQUEST.HTTP_CLIENT_REQUEST_TOTAL_TIMEOUT ) - if get_tracing_data(app).tracing_enabled: + if get_tracing_config(app).tracing_enabled: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app=app), + tracing_data=get_tracing_config(app=app), ) ServicesClient.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index 7cd44412e5c0..9fd6f1f9a342 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -12,7 +12,7 @@ expect_status, retry_on_errors, ) -from servicelib.fastapi.tracing import get_tracing_data +from servicelib.fastapi.tracing import get_tracing_config from settings_library.tracing import TracingSettings from ....core.dynamic_services_settings.scheduler import ( @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI): tracing_settings: TracingSettings | None = ( app.state.settings.DIRECTOR_V2_TRACING ) - tracing_data = get_tracing_data(app) + tracing_data = get_tracing_config(app) # timeouts self._health_request_timeout = Timeout(1.0, connect=1.0) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py index 3fa39c555d4a..edadeab2d214 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py @@ -22,7 +22,7 @@ ) from models_library.services import ServiceKey, ServiceVersion from models_library.wallets import WalletID -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from ..core.errors import PricingPlanUnitNotFoundError from ..core.settings import AppSettings @@ -45,7 +45,7 @@ def create( if settings.DIRECTOR_V2_TRACING: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) exit_stack = contextlib.AsyncExitStack() diff --git a/services/director-v2/src/simcore_service_director_v2/modules/storage.py b/services/director-v2/src/simcore_service_director_v2/modules/storage.py index a50d40f84c97..c5f6a51bedb9 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/storage.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/storage.py @@ -6,7 +6,7 @@ import httpx from fastapi import FastAPI, HTTPException from models_library.users import UserID -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from servicelib.logging_utils import log_decorator from settings_library.s3 import S3Settings from settings_library.storage import StorageSettings @@ -40,7 +40,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) StorageClient.create( app, diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py index 89a1449d5272..a8f6238c1fb9 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py @@ -17,7 +17,7 @@ from pytest_mock import MockerFixture from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.fastapi.http_client_thin import ClientHttpError, UnexpectedStatusError -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_director_v2._meta import APP_NAME from simcore_service_director_v2.core.settings import AppSettings from simcore_service_director_v2.modules.dynamic_sidecar.api_client._public import ( @@ -66,7 +66,7 @@ async def sidecars_client( ) -> AsyncIterable[SidecarsClient]: app = FastAPI() app.state.settings = AppSettings.create_from_envs() - app.state.tracing_data = TracingData.create( + app.state.tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None, # disable tracing in tests ) diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py index 9bd6bb84f783..4649282cf527 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py @@ -16,7 +16,7 @@ from respx import MockRouter, Route from respx.types import SideEffectTypes from servicelib.docker_constants import SUFFIX_EGRESS_PROXY_NAME -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_director_v2._meta import APP_NAME from simcore_service_director_v2.core.settings import AppSettings from simcore_service_director_v2.modules.dynamic_sidecar.api_client._thin import ( @@ -54,7 +54,7 @@ def mocked_app( app = FastAPI() app.state.settings = AppSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None, # disable tracing in tests ) diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index df8458592d75..c31075924e02 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -8,7 +8,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -25,7 +25,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.DIRECTOR_DEBUG, title=APP_NAME, diff --git a/services/director/src/simcore_service_director/main.py b/services/director/src/simcore_service_director/main.py index 7cb875c7e3be..56733cfc9f7e 100644 --- a/services/director/src/simcore_service_director/main.py +++ b/services/director/src/simcore_service_director/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_director.core.application import create_app from simcore_service_director.core.settings import ApplicationSettings @@ -21,7 +21,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.DIRECTOR_TRACING, ) diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 8318f5c7751a..5ccaed0745c8 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -13,7 +13,7 @@ from fastapi import FastAPI from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.docker_registry import RegistrySettings from simcore_service_director.core.application import create_app from simcore_service_director.core.settings import ApplicationSettings @@ -164,7 +164,7 @@ def app_settings(app_environment: EnvVarsDict) -> ApplicationSettings: async def app( app_settings: ApplicationSettings, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name="director", tracing_settings=None # disable tracing in tests ) the_test_app = create_app(settings=app_settings, tracing_data=tracing_data) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index bfbf621e644c..cc19209dac02 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -6,7 +6,7 @@ from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.profiler import initialize_profiler from servicelib.fastapi.tracing import initialize_fastapi_app_tracing -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY from ..api.frontend import initialize_frontend @@ -18,10 +18,10 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, - tracing_data: TracingData | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - app_tracing_data = tracing_data or TracingData.create( + app_tracing_data = tracing_data or TracingConfig.create( tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, service_name=APP_NAME, ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index 286693b16367..fb75e3deb61b 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -15,7 +15,7 @@ create_postgres_database_input_state, ) from servicelib.fastapi.tracing import get_tracing_instrumentation_lifespan -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import APP_FINISHED_BANNER_MSG, APP_STARTED_BANNER_MSG from ..api.rpc.routes import rpc_api_routes_lifespan @@ -55,7 +55,7 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]: def create_app_lifespan( - tracing_data: TracingData, + tracing_data: TracingConfig, logging_lifespan: Lifespan | None, ) -> LifespanManager: app_lifespan = LifespanManager() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py index dc4135999a24..fe2651604960 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py @@ -8,7 +8,7 @@ from servicelib.fastapi.logging_lifespan import ( create_logging_lifespan, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_dynamic_scheduler.core.application import create_app from simcore_service_dynamic_scheduler.core.settings import ApplicationSettings @@ -27,7 +27,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, service_name=APP_NAME, ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py index 84480255445c..6b673c1b3c2f 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py @@ -11,7 +11,7 @@ expect_status, retry_on_errors, ) -from servicelib.fastapi.tracing import get_tracing_data +from servicelib.fastapi.tracing import get_tracing_config from yarl import URL from ...core.settings import ApplicationSettings @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_CATALOG_SETTINGS.api_base_url, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py index fd31bf23d7b9..8896b7340a3a 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py @@ -11,7 +11,7 @@ expect_status, retry_on_errors, ) -from servicelib.fastapi.tracing import get_tracing_data +from servicelib.fastapi.tracing import get_tracing_config from yarl import URL from ...core.settings import ApplicationSettings @@ -38,7 +38,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_DIRECTOR_V0_SETTINGS.endpoint, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py index 26981cdd478a..5e6833a05972 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py @@ -24,7 +24,7 @@ expect_status, retry_on_errors, ) -from servicelib.fastapi.tracing import get_tracing_data +from servicelib.fastapi.tracing import get_tracing_config from servicelib.rabbitmq.rpc_interfaces.dynamic_scheduler.services import ( DEFAULT_LEGACY_WB_TO_DV2_HTTP_REQUESTS_TIMEOUT_S, ) @@ -43,7 +43,7 @@ def __init__(self, app: FastAPI) -> None: ), extra_allowed_method_names={"attach_lifespan_to"}, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index e783d773b64d..c89776fd6f55 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -11,11 +11,11 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.tracing import ( - get_tracing_data, + get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_sdk.node_ports_common.exceptions import NodeNotFound from .._meta import API_VERSION, API_VTAG, APP_NAME, SUMMARY, __version__ @@ -120,7 +120,7 @@ def compose_spec(self) -> str | None: def create_base_app() -> FastAPI: # settings app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DYNAMIC_SIDECAR_TRACING ) logging_shutdown_event = create_logging_shutdown_event( @@ -177,8 +177,8 @@ def create_app() -> FastAPI: app.state.application_health = ApplicationHealth() application_settings: ApplicationSettings = app.state.settings - if get_tracing_data(app).tracing_enabled: - setup_tracing(app, get_tracing_data(app)) + if get_tracing_config(app).tracing_enabled: + setup_tracing(app, get_tracing_config(app)) setup_rabbitmq(app) setup_rpc_api_routes(app) @@ -200,10 +200,10 @@ def create_app() -> FastAPI: if application_settings.are_prometheus_metrics_enabled: setup_prometheus_metrics(app) - if get_tracing_data(app).tracing_enabled: + if get_tracing_config(app).tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) # ERROR HANDLERS ------------ diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 3b99f01ce5b3..8381c411663d 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -5,7 +5,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -30,10 +30,11 @@ def create_app( - settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None + settings: ApplicationSettings | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - tracing_data = tracing_data or TracingData.create( + tracing_data = tracing_data or TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.EFS_GUARDIAN_TRACING, ) diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/main.py b/services/efs-guardian/src/simcore_service_efs_guardian/main.py index 6006eff158ac..bbffc1b944b7 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/main.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/main.py @@ -23,7 +23,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingData.create( + tracing_data = tracing.TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.EFS_GUARDIAN_TRACING, ) diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index c3130fc1e53a..aa5e0e115c4f 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -4,11 +4,11 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_data, + get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -25,7 +25,8 @@ def create_app( - settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None + settings: ApplicationSettings | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: app = FastAPI( @@ -40,13 +41,13 @@ def create_app( # STATE app.state.settings = settings or ApplicationSettings() # type: ignore[call-arg] - app.state.tracing_data = tracing_data or TracingData.create( + app.state.tracing_data = tracing_data or TracingConfig.create( service_name=APP_NAME, tracing_settings=app.state.settings.INVITATIONS_TRACING ) assert app.state.settings.API_VERSION == API_VERSION # nosec - if get_tracing_data(app).tracing_enabled: - setup_tracing(app, tracing_data=get_tracing_data(app)) + if get_tracing_config(app).tracing_enabled: + setup_tracing(app, tracing_data=get_tracing_config(app)) # PLUGINS SETUP setup_api_routes(app) @@ -54,8 +55,8 @@ def create_app( if app.state.settings.INVITATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if get_tracing_data(app).tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_data(app)) + if get_tracing_config(app).tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/invitations/src/simcore_service_invitations/main.py b/services/invitations/src/simcore_service_invitations/main.py index f72f16a7b3f8..d2f0e0f86023 100644 --- a/services/invitations/src/simcore_service_invitations/main.py +++ b/services/invitations/src/simcore_service_invitations/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_invitations.core.application import create_app from simcore_service_invitations.core.settings import ApplicationSettings @@ -20,7 +20,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.INVITATIONS_TRACING, ) diff --git a/services/notifications/src/simcore_service_notifications/core/application.py b/services/notifications/src/simcore_service_notifications/core/application.py index a85162a441d5..4c0d6fe34efa 100644 --- a/services/notifications/src/simcore_service_notifications/core/application.py +++ b/services/notifications/src/simcore_service_notifications/core/application.py @@ -13,7 +13,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import API_VTAG, APP_NAME, SUMMARY, VERSION from ..api.rest.routing import initialize_rest_api @@ -26,10 +26,10 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, - tracing_data: TracingData | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: settings = settings or ApplicationSettings.create_from_envs() - tracing_data = tracing_data or TracingData.create( + tracing_data = tracing_data or TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.NOTIFICATIONS_TRACING ) diff --git a/services/notifications/src/simcore_service_notifications/main.py b/services/notifications/src/simcore_service_notifications/main.py index 82bc592c58a7..b85ac67bdd74 100644 --- a/services/notifications/src/simcore_service_notifications/main.py +++ b/services/notifications/src/simcore_service_notifications/main.py @@ -4,7 +4,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_lifespan -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_notifications.core.application import create_app from simcore_service_notifications.core.settings import ( ApplicationSettings, @@ -22,7 +22,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.NOTIFICATIONS_TRACING ) logging_lifespan = create_logging_lifespan( diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index 49c8ca633b18..f868e8f17d98 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -7,7 +7,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -32,11 +32,12 @@ def create_app( - settings: ApplicationSettings | None = None, tracing_data: TracingData | None = None + settings: ApplicationSettings | None = None, + tracing_data: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - app_tracing_data = tracing_data or TracingData.create( + app_tracing_data = tracing_data or TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.PAYMENTS_TRACING ) app = FastAPI( diff --git a/services/payments/src/simcore_service_payments/main.py b/services/payments/src/simcore_service_payments/main.py index a8d65908c193..ac84e7977a05 100644 --- a/services/payments/src/simcore_service_payments/main.py +++ b/services/payments/src/simcore_service_payments/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_payments.core.application import create_app from simcore_service_payments.core.settings import ApplicationSettings @@ -23,7 +23,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.PAYMENTS_TRACING, ) diff --git a/services/payments/src/simcore_service_payments/services/payments_gateway.py b/services/payments/src/simcore_service_payments/services/payments_gateway.py index d748c0cc6030..0b06979d1ff4 100644 --- a/services/payments/src/simcore_service_payments/services/payments_gateway.py +++ b/services/payments/src/simcore_service_payments/services/payments_gateway.py @@ -25,7 +25,7 @@ HealthMixinMixin, ) from servicelib.fastapi.httpx_utils import to_curl_command -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from ..core.settings import ApplicationSettings from ..models.payments_gateway import ( @@ -218,7 +218,7 @@ def setup_payments_gateway(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) api.attach_lifespan_to(app) api.set_to_app_state(app) diff --git a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py index 95bb80267733..f5bd7db1ec54 100644 --- a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py +++ b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py @@ -24,7 +24,7 @@ BaseHTTPApi, HealthMixinMixin, ) -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from ..core.settings import ApplicationSettings @@ -76,7 +76,7 @@ def setup_resource_usage_tracker(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) api.set_to_app_state(app) api.attach_lifespan_to(app) diff --git a/services/payments/src/simcore_service_payments/services/stripe.py b/services/payments/src/simcore_service_payments/services/stripe.py index 710b3dd773a9..59cee4415a2d 100644 --- a/services/payments/src/simcore_service_payments/services/stripe.py +++ b/services/payments/src/simcore_service_payments/services/stripe.py @@ -19,7 +19,7 @@ BaseHTTPApi, HealthMixinMixin, ) -from servicelib.fastapi.tracing import get_tracing_data, setup_httpx_client_tracing +from servicelib.fastapi.tracing import get_tracing_config, setup_httpx_client_tracing from ..core.errors import StripeRuntimeError from ..core.settings import ApplicationSettings @@ -95,7 +95,7 @@ def setup_stripe(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) api.set_to_app_state(app) diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index 0044497436bb..1fafe15e5638 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -6,7 +6,7 @@ initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from .._meta import ( API_VERSION, @@ -35,7 +35,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingData) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.RESOURCE_USAGE_TRACKER_DEBUG, title=f"{PROJECT_NAME} web API", diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py index 5a6344389f44..da31659cdec9 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_resource_usage_tracker.core.application import create_app from simcore_service_resource_usage_tracker.core.settings import ApplicationSettings @@ -23,7 +23,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.RESOURCE_USAGE_TRACKER_TRACING, ) diff --git a/services/resource-usage-tracker/tests/unit/conftest.py b/services/resource-usage-tracker/tests/unit/conftest.py index bc303fbf2752..589b72bbb257 100644 --- a/services/resource-usage-tracker/tests/unit/conftest.py +++ b/services/resource-usage-tracker/tests/unit/conftest.py @@ -22,7 +22,7 @@ from pytest_mock import MockerFixture from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.rabbit import RabbitSettings from simcore_service_resource_usage_tracker.core.application import create_app from simcore_service_resource_usage_tracker.core.settings import ApplicationSettings @@ -122,8 +122,8 @@ def app_settings( @pytest.fixture -def tracing_data(app_settings: ApplicationSettings) -> TracingData: - return TracingData.create( +def tracing_data(app_settings: ApplicationSettings) -> TracingConfig: + return TracingConfig.create( service_name="resource-usage-tracker-tests", tracing_settings=None, # disable tracing in tests ) @@ -131,7 +131,7 @@ def tracing_data(app_settings: ApplicationSettings) -> TracingData: @pytest.fixture async def initialized_app( - app_settings: ApplicationSettings, tracing_data: TracingData + app_settings: ApplicationSettings, tracing_data: TracingConfig ) -> AsyncIterator[FastAPI]: app = create_app(app_settings, tracing_data=tracing_data) async with LifespanManager(app): @@ -140,7 +140,7 @@ async def initialized_app( @pytest.fixture def client( - app_settings: ApplicationSettings, tracing_data: TracingData + app_settings: ApplicationSettings, tracing_data: TracingConfig ) -> Iterator[TestClient]: app = create_app(app_settings, tracing_data=tracing_data) with TestClient(app, base_url="http://testserver.test") as client: diff --git a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py index d5c1a0c0800a..d2291f5558e2 100644 --- a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py +++ b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py @@ -24,7 +24,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.rabbitmq import RabbitMQRPCClient -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.rabbit import RabbitSettings from simcore_postgres_database.models.resource_tracker_credit_transactions import ( CreditTransactionClassification, @@ -68,7 +68,7 @@ async def initialized_app( postgres_host_config: dict[str, str], ) -> AsyncIterable[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name="resource-usage-tracker", tracing_settings=None, # disable tracing in tests ) diff --git a/services/storage/src/simcore_service_storage/core/application.py b/services/storage/src/simcore_service_storage/core/application.py index 177238122143..3c725f8683cc 100644 --- a/services/storage/src/simcore_service_storage/core/application.py +++ b/services/storage/src/simcore_service_storage/core/application.py @@ -18,11 +18,11 @@ from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.profiler import ProfilerMiddleware from servicelib.fastapi.tracing import ( - get_tracing_data, + get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from starlette.middleware.base import BaseHTTPMiddleware from .._meta import ( @@ -49,7 +49,7 @@ def create_app( - settings: ApplicationSettings, tracing_data: TracingData + settings: ApplicationSettings, tracing_data: TracingConfig ) -> FastAPI: # noqa: C901 app = FastAPI( debug=settings.SC_BOOT_MODE @@ -75,7 +75,7 @@ def create_app( setup_s3(app) setup_client_session( app, - tracing_data=get_tracing_data(app), + tracing_data=get_tracing_config(app), ) if settings.STORAGE_CELERY: diff --git a/services/storage/src/simcore_service_storage/main.py b/services/storage/src/simcore_service_storage/main.py index 76e8e0779e01..444114f9aee0 100644 --- a/services/storage/src/simcore_service_storage/main.py +++ b/services/storage/src/simcore_service_storage/main.py @@ -6,7 +6,7 @@ from common_library.json_serialization import json_dumps from fastapi import FastAPI from servicelib.fastapi.logging_lifespan import create_logging_shutdown_event -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_storage.core.application import create_app from simcore_service_storage.core.settings import ApplicationSettings @@ -27,7 +27,7 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.STORAGE_TRACING ) logging_shutdown_event = create_logging_shutdown_event( diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index a90ea39e47b4..b70ede3a649b 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -8,14 +8,14 @@ ) from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.logging_utils import setup_loggers -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from ...api._worker_tasks.tasks import setup_worker_tasks from ...core.application import create_app from ...core.settings import ApplicationSettings _settings = ApplicationSettings.create_from_envs() -_tracing_data = TracingData.create( +_tracing_data = TracingConfig.create( tracing_settings=_settings.STORAGE_TRACING, service_name="storage-celery-worker", ) diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index 71302a41d93b..0fe8dbccebf9 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -65,7 +65,7 @@ from servicelib.aiohttp import status from servicelib.fastapi.celery.app_server import FastAPIAppServer from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from servicelib.utils import limited_gather from settings_library.rabbit import RabbitSettings from simcore_postgres_database.models.tokens import tokens @@ -237,7 +237,7 @@ async def initialized_app( mock_celery_app: None, app_settings: ApplicationSettings, ) -> AsyncIterator[FastAPI]: - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) @@ -1018,7 +1018,7 @@ async def with_storage_celery_worker( # Signals must be explicitily connected monkeypatch.setenv("STORAGE_WORKER_MODE", "true") app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) diff --git a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py index a9b1bd9b23e5..4b94596bc69a 100644 --- a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py +++ b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py @@ -24,7 +24,7 @@ from models_library.projects_nodes_io import SimcoreS3FileID from models_library.users import UserID from pytest_simcore.helpers.logging_tools import log_context -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from servicelib.utils import unused_port from simcore_service_storage._meta import API_VTAG from simcore_service_storage.core.application import create_app @@ -64,7 +64,7 @@ async def _wait_for_server_ready(server: URL) -> None: @pytest.fixture async def real_storage_server(app_settings: ApplicationSettings) -> AsyncIterator[URL]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) diff --git a/services/web/server/src/simcore_service_webserver/application.py b/services/web/server/src/simcore_service_webserver/application.py index 8ff5633b45a8..2ff95d706bf6 100644 --- a/services/web/server/src/simcore_service_webserver/application.py +++ b/services/web/server/src/simcore_service_webserver/application.py @@ -8,8 +8,8 @@ from aiohttp import web from servicelib.aiohttp.application import create_safe_application -from servicelib.aiohttp.tracing import TRACING_DATA_KEY -from servicelib.tracing import TracingData +from servicelib.aiohttp.tracing import TRACING_CONFIG_KEY +from servicelib.tracing import TracingConfig from ._meta import ( APP_NAME, @@ -101,19 +101,19 @@ async def _finished_banner(app: web.Application): return _finished_banner -def create_application(tracing_data: TracingData) -> web.Application: +def create_application(tracing_config: TracingConfig) -> web.Application: """ Initializes service """ app = create_safe_application() setup_settings(app) - app[TRACING_DATA_KEY] = tracing_data + app[TRACING_CONFIG_KEY] = tracing_config # WARNING: setup order matters # NOTE: compute setup order https://github.com/ITISFoundation/osparc-simcore/issues/1142 # core modules - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: setup_app_tracing(app) # WARNING: must be UPPERMOST middleware setup_db(app) setup_redis(app) @@ -206,8 +206,10 @@ def create_application_auth() -> web.Application: app = create_safe_application() settings = setup_settings(app) - tracing_data = TracingData.create(settings.WEBSERVER_TRACING, service_name=APP_NAME) - app[TRACING_DATA_KEY] = tracing_data + tracing_config = TracingConfig.create( + settings.WEBSERVER_TRACING, service_name=APP_NAME + ) + app[TRACING_CONFIG_KEY] = tracing_config assert settings.WEBSERVER_APP_FACTORY_NAME == "WEBSERVER_AUTHZ_APP_FACTORY" # nosec # Monitoring and diagnostics diff --git a/services/web/server/src/simcore_service_webserver/cli.py b/services/web/server/src/simcore_service_webserver/cli.py index 41fd9c3552d6..960b8c4166ce 100644 --- a/services/web/server/src/simcore_service_webserver/cli.py +++ b/services/web/server/src/simcore_service_webserver/cli.py @@ -20,7 +20,7 @@ import typer from aiohttp import web from common_library.json_serialization import json_dumps -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from settings_library.utils_cli import create_settings_command from ._meta import APP_NAME @@ -39,7 +39,7 @@ def _setup_app_from_settings( settings: ApplicationSettings, - tracing_data: TracingData, + tracing_config: TracingConfig, ) -> tuple[web.Application, dict]: # NOTE: keeping imports here to reduce CLI load time from .application import create_application @@ -52,7 +52,7 @@ def _setup_app_from_settings( # given configs and changing those would not have # a meaningful RoI. config = convert_to_app_config(settings) - app = create_application(tracing_data=tracing_data) + app = create_application(tracing_config=tracing_config) return (app, config) @@ -65,7 +65,7 @@ async def app_factory() -> web.Application: from .log import setup_logging app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingData.create( + tracing_config = TracingConfig.create( app_settings.WEBSERVER_TRACING, service_name=APP_NAME ) @@ -79,13 +79,13 @@ async def app_factory() -> web.Application: ) logging_lifespan_cleanup_event = setup_logging( - app_settings, tracing_data=tracing_data + app_settings, tracing_config=tracing_config ) if app_settings.WEBSERVER_APP_FACTORY_NAME == "WEBSERVER_AUTHZ_APP_FACTORY": app = create_application_auth() else: - app, _ = _setup_app_from_settings(app_settings, tracing_data) + app, _ = _setup_app_from_settings(app_settings, tracing_config) app.on_cleanup.append(logging_lifespan_cleanup_event) return app @@ -128,8 +128,8 @@ def run(): from .application import run_service app_settings = ApplicationSettings.create_from_envs() - app_tracing_data = TracingData.create( + app_tracing_config = TracingConfig.create( app_settings.WEBSERVER_TRACING, service_name=APP_NAME ) - app, cfg = _setup_app_from_settings(app_settings, app_tracing_data) + app, cfg = _setup_app_from_settings(app_settings, app_tracing_config) run_service(app, cfg) diff --git a/services/web/server/src/simcore_service_webserver/log.py b/services/web/server/src/simcore_service_webserver/log.py index 143aafb9b77b..7e8ef62e23d1 100644 --- a/services/web/server/src/simcore_service_webserver/log.py +++ b/services/web/server/src/simcore_service_webserver/log.py @@ -9,7 +9,7 @@ from aiohttp import web from aiohttp.log import access_logger from servicelib.logging_utils import async_loggers -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_webserver.application_settings import ApplicationSettings _NOISY_LOGGERS: Final[tuple[str, ...]] = ( @@ -32,7 +32,7 @@ def setup_logging( - app_settings: ApplicationSettings, tracing_data: TracingData + app_settings: ApplicationSettings, tracing_config: TracingConfig ) -> CleanupEvent: exit_stack = AsyncExitStack() exit_stack.enter_context( @@ -41,7 +41,7 @@ def setup_logging( noisy_loggers=_NOISY_LOGGERS, log_format_local_dev_enabled=app_settings.WEBSERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.WEBSERVER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, ) ) diff --git a/services/web/server/src/simcore_service_webserver/tracing.py b/services/web/server/src/simcore_service_webserver/tracing.py index 14e50ad20ac8..cbaa5022840f 100644 --- a/services/web/server/src/simcore_service_webserver/tracing.py +++ b/services/web/server/src/simcore_service_webserver/tracing.py @@ -1,7 +1,7 @@ import logging from aiohttp import web -from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing +from servicelib.aiohttp.tracing import TRACING_CONFIG_KEY, setup_tracing from .application_setup import ModuleCategory, app_setup_func @@ -25,7 +25,7 @@ def setup_app_tracing(app: web.Application): app.cleanup_ctx.append( setup_tracing( app=app, - tracing_data=app[TRACING_DATA_KEY], + tracing_config=app[TRACING_CONFIG_KEY], add_response_trace_id_header=True, ) ) diff --git a/services/web/server/tests/unit/isolated/test_tracing.py b/services/web/server/tests/unit/isolated/test_tracing.py index 430d8d6323be..2d5edfd18de6 100644 --- a/services/web/server/tests/unit/isolated/test_tracing.py +++ b/services/web/server/tests/unit/isolated/test_tracing.py @@ -7,7 +7,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.aiohttp.tracing import aiohttp_server_opentelemetry_middleware -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_webserver._meta import APP_NAME from simcore_service_webserver.application import create_application from simcore_service_webserver.application_settings import ApplicationSettings @@ -32,7 +32,7 @@ def test_middleware_restrictions_opentelemetry_is_second_middleware( ): settings = ApplicationSettings.create_from_envs() assert settings.WEBSERVER_TRACING - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.WEBSERVER_TRACING ) diff --git a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py index b7e8013a795e..6e24c445f3be 100644 --- a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py +++ b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py @@ -13,7 +13,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from pytest_simcore.openapi_specs import Entrypoint -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_webserver.application import create_application from simcore_service_webserver.application_settings import get_application_settings from simcore_service_webserver.rest._utils import get_openapi_specs_path @@ -60,7 +60,7 @@ def app(app_environment: EnvVarsDict) -> web.Application: # - routings happen during setup! # - all plugins are setup but app is NOT started (i.e events are not triggered) # - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name="test-webserver", tracing_settings=None ) app_ = create_application(tracing_data=tracing_data) diff --git a/services/web/server/tests/unit/with_dbs/03/test_session.py b/services/web/server/tests/unit/with_dbs/03/test_session.py index 5edd8f745c98..abd632072f50 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_session.py +++ b/services/web/server/tests/unit/with_dbs/03/test_session.py @@ -14,7 +14,7 @@ from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict from pytest_simcore.helpers.webserver_login import NewUser -from servicelib.tracing import TracingData +from servicelib.tracing import TracingConfig from simcore_service_webserver.application import create_application from simcore_service_webserver.session._cookie_storage import ( SharedCookieEncryptedCookieStorage, @@ -58,7 +58,7 @@ async def _get_user_session(request: web.Request): session = await get_session(request) return web.json_response(dict(session)) - tracing_data = TracingData.create( + tracing_data = TracingConfig.create( service_name="test-webserver", tracing_settings=None ) app = create_application(tracing_data=tracing_data) diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index 5c8d35ba577b..0997bfc7b17a 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -228,7 +228,7 @@ async def web_server( assert app_environment # original APP - tracing_data = tracing.TracingData.create( + tracing_data = tracing.TracingConfig.create( service_name="test-webserver", tracing_settings=None ) app = create_application(tracing_data=tracing_data) From 965c5c518cfc7d2bff06e11cd514ac9c8177dec0 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 8 Oct 2025 16:10:23 +0200 Subject: [PATCH 54/62] fix in dirv2 tracing_data -> tracing_config --- .../src/simcore_service_director_v2/core/application.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index c5e20bac2dbc..bf44e4a34283 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -121,13 +121,13 @@ def create_base_app( if app_settings is None: app_settings = AppSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DIRECTOR_V2_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DIRECTOR_V2_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DIRECTOR_V2_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -152,7 +152,7 @@ def create_base_app( ) override_fastapi_openapi_method(app) app.state.settings = app_settings - app.state.tracing_data = tracing_data + app.state.tracing_data = tracing_config app.include_router(api_router) From 435d2e277efb547194486550682567f971751e58 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 8 Oct 2025 16:19:34 +0200 Subject: [PATCH 55/62] cleanup in all the applications --- .../src/simcore_service_agent/core/application.py | 10 +++++----- services/agent/src/simcore_service_agent/main.py | 2 +- .../simcore_service_api_server/core/application.py | 14 +++++++------- .../src/simcore_service_api_server/main.py | 2 +- .../core/application.py | 12 ++++++------ .../src/simcore_service_autoscaling/main.py | 2 +- .../simcore_service_catalog/core/application.py | 12 ++++++------ .../catalog/src/simcore_service_catalog/main.py | 2 +- services/catalog/tests/unit/conftest.py | 4 ++-- .../core/application.py | 12 ++++++------ .../src/simcore_service_clusters_keeper/main.py | 2 +- .../core/application.py | 12 ++++++------ .../src/simcore_service_datcore_adapter/main.py | 2 +- .../core/application.py | 2 +- ...st_modules_dynamic_sidecar_client_api_public.py | 2 +- ...test_modules_dynamic_sidecar_client_api_thin.py | 4 ++-- .../simcore_service_director/core/application.py | 14 +++++++------- .../director/src/simcore_service_director/main.py | 2 +- services/director/tests/unit/conftest.py | 2 +- .../core/application.py | 12 ++++++------ .../src/simcore_service_dynamic_scheduler/main.py | 2 +- .../core/application.py | 8 ++++---- .../core/application.py | 14 +++++++------- .../src/simcore_service_efs_guardian/main.py | 2 +- .../core/application.py | 8 ++++---- .../src/simcore_service_invitations/main.py | 2 +- .../core/application.py | 14 +++++++------- .../src/simcore_service_notifications/main.py | 2 +- .../simcore_service_payments/core/application.py | 14 +++++++------- .../payments/src/simcore_service_payments/main.py | 2 +- .../simcore_service_storage/core/application.py | 14 +++++++------- .../storage/src/simcore_service_storage/main.py | 2 +- .../modules/celery/worker_main.py | 2 +- services/storage/tests/conftest.py | 4 ++-- .../unit/test__legacy_storage_sdk_compatibility.py | 2 +- 35 files changed, 109 insertions(+), 109 deletions(-) diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index 9609382f9c4b..f6f06b6bf150 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -34,7 +34,7 @@ def create_app( settings: ApplicationSettings | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() @@ -42,8 +42,8 @@ def create_app( "Application settings: %s", json_dumps(settings, indent=2, sort_keys=True), ) - if tracing_data is None: - tracing_data = TracingConfig.create( + if tracing_config is None: + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.AGENT_TRACING ) @@ -58,7 +58,7 @@ def create_app( ) override_fastapi_openapi_method(app) app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config if settings.AGENT_TRACING: setup_tracing(app, get_tracing_config(app)) @@ -72,7 +72,7 @@ def create_app( setup_rpc_api_routes(app) if settings.AGENT_TRACING: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) + initialize_fastapi_app_tracing(app, tracing_config=get_tracing_config(app)) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/agent/src/simcore_service_agent/main.py b/services/agent/src/simcore_service_agent/main.py index 01c17d726bf1..c1a3bc6cde7e 100644 --- a/services/agent/src/simcore_service_agent/main.py +++ b/services/agent/src/simcore_service_agent/main.py @@ -37,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index b8d32636c91c..c38e03470360 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -52,7 +52,7 @@ def _label_title_and_version(settings: ApplicationSettings, title: str, version: def create_app( settings: ApplicationSettings | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: if settings is None: settings = ApplicationSettings.create_from_envs() @@ -60,13 +60,13 @@ def create_app( "Application settings: %s", json_dumps(settings, indent=2, sort_keys=True), ) - if tracing_data is None: - tracing_data = TracingConfig.create( + if tracing_config is None: + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.API_SERVER_TRACING ) assert settings # nosec - assert tracing_data # nosec + assert tracing_config # nosec # Labeling title = "osparc.io public API" @@ -90,10 +90,10 @@ def create_app( add_pagination(app) app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config if settings.API_SERVER_TRACING: - setup_tracing(app, tracing_data) + setup_tracing(app, tracing_config) if settings.API_SERVER_POSTGRES: setup_postgres(app) @@ -109,7 +109,7 @@ def create_app( if settings.API_SERVER_TRACING: initialize_fastapi_app_tracing( app, - tracing_data=tracing_data, + tracing_config=tracing_config, add_response_trace_id_header=True, ) diff --git a/services/api-server/src/simcore_service_api_server/main.py b/services/api-server/src/simcore_service_api_server/main.py index 12d626535f5f..621b9204fad7 100644 --- a/services/api-server/src/simcore_service_api_server/main.py +++ b/services/api-server/src/simcore_service_api_server/main.py @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index c7375bdb4100..27ec57257d6f 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -35,7 +35,7 @@ logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_config: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.AUTOSCALING_DEBUG, title=APP_NAME, @@ -47,12 +47,12 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa ) # STATE app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config=tracing_config) setup_instrumentation(app) setup_api_routes(app) @@ -62,8 +62,8 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa setup_ssm(app) setup_redis(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) setup_auto_scaler_background_task(app) setup_warm_buffer_machines_pool_task(app) diff --git a/services/autoscaling/src/simcore_service_autoscaling/main.py b/services/autoscaling/src/simcore_service_autoscaling/main.py index 72b1977f2b2e..8c6c948090d4 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/main.py +++ b/services/autoscaling/src/simcore_service_autoscaling/main.py @@ -40,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index 48226994fed4..9ca99db23656 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -32,7 +32,7 @@ def create_app( *, - tracing_data: TracingConfig, + tracing_config: TracingConfig, settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, ) -> FastAPI: @@ -58,16 +58,16 @@ def create_app( # STATE app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config # MIDDLEWARES - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config=tracing_config) if settings.CATALOG_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION: # middleware to time requests (ONLY for development) diff --git a/services/catalog/src/simcore_service_catalog/main.py b/services/catalog/src/simcore_service_catalog/main.py index 64b4e32779d4..c94de04d9d1d 100644 --- a/services/catalog/src/simcore_service_catalog/main.py +++ b/services/catalog/src/simcore_service_catalog/main.py @@ -44,6 +44,6 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, - tracing_data=tracing_data, + tracing_config=tracing_data, logging_lifespan=logging_lifespan, ) diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index 7c0b58ccd72a..fb7c03bce2f6 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -150,7 +150,7 @@ async def app( tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) - app_under_test = create_app(tracing_data=tracing_data) + app_under_test = create_app(tracing_config=tracing_data) assert spy_app.on_startup.call_count == 0 assert spy_app.on_shutdown.call_count == 0 @@ -180,7 +180,7 @@ def client( tracing_data = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) - app_under_test = create_app(tracing_data=tracing_data) + app_under_test = create_app(tracing_config=tracing_data) assert ( spy_app.on_startup.call_count == 0 diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index 6de830047c31..a4c0a98d9871 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -30,7 +30,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_config: TracingConfig) -> FastAPI: _logger.info("app settings: %s", settings.model_dump_json(indent=1)) app = FastAPI( @@ -44,13 +44,13 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa ) # STATE app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: setup_tracing( app, - tracing_data, + tracing_config, ) if app.state.settings.CLUSTERS_KEEPER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) @@ -64,8 +64,8 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa setup_redis(app) setup_clusters_management(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) # ERROR HANDLERS # EVENTS diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py index 71d9d26c2907..57721e00915b 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py @@ -40,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index a5f1a429bcb3..e861ef0ee7a0 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -31,7 +31,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_config: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], @@ -46,12 +46,12 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa add_pagination(app) app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: setup_tracing( app, - tracing_data, + tracing_config, ) if app.state.settings.DATCORE_ADAPTER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) @@ -63,8 +63,8 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa ) app.add_middleware(GZipMiddleware) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) # events app.add_event_handler("startup", on_startup) diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py index 50ffdd84967f..a7e98686c03a 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py @@ -38,6 +38,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index bf44e4a34283..a1546c816db7 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -152,7 +152,7 @@ def create_base_app( ) override_fastapi_openapi_method(app) app.state.settings = app_settings - app.state.tracing_data = tracing_config + app.state.tracing_config = tracing_config app.include_router(api_router) diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py index a8f6238c1fb9..d0cbea08727e 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_public.py @@ -66,7 +66,7 @@ async def sidecars_client( ) -> AsyncIterable[SidecarsClient]: app = FastAPI() app.state.settings = AppSettings.create_from_envs() - app.state.tracing_data = TracingConfig.create( + app.state.tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=None, # disable tracing in tests ) diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py index 4649282cf527..77dd294ecbaa 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py @@ -54,11 +54,11 @@ def mocked_app( app = FastAPI() app.state.settings = AppSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=None, # disable tracing in tests ) - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config return app diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index c31075924e02..f44e6dd9e09a 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -25,7 +25,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_config: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.DIRECTOR_DEBUG, title=APP_NAME, @@ -37,12 +37,12 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa ) # STATE app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config) setup_api_routes(app) @@ -52,12 +52,12 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa app, max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS, default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT, - tracing_data=tracing_data, + tracing_config=tracing_config, ) setup_registry(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) # ERROR HANDLERS set_app_default_http_error_handlers(app) diff --git a/services/director/src/simcore_service_director/main.py b/services/director/src/simcore_service_director/main.py index 56733cfc9f7e..37ed2d693b63 100644 --- a/services/director/src/simcore_service_director/main.py +++ b/services/director/src/simcore_service_director/main.py @@ -37,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 5ccaed0745c8..820d9156cf43 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -167,7 +167,7 @@ async def app( tracing_data = TracingConfig.create( service_name="director", tracing_settings=None # disable tracing in tests ) - the_test_app = create_app(settings=app_settings, tracing_data=tracing_data) + the_test_app = create_app(settings=app_settings, tracing_config=tracing_data) async with LifespanManager( the_test_app, startup_timeout=None if is_pdb_enabled else MAX_TIME_FOR_APP_TO_STARTUP, diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index cc19209dac02..9aee46e8ed0e 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -18,10 +18,10 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - app_tracing_data = tracing_data or TracingConfig.create( + app_tracing_config = tracing_config or TracingConfig.create( tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, service_name=APP_NAME, ) @@ -36,7 +36,7 @@ def create_app( ), redoc_url=None, lifespan=events.create_app_lifespan( - tracing_data=app_tracing_data, + tracing_data=app_tracing_config, logging_lifespan=logging_lifespan, ), ) @@ -44,7 +44,7 @@ def create_app( # STATE app.state.settings = app_settings - app.state.tracing_data = app_tracing_data + app.state.tracing_config = app_tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec initialize_rest_api(app) @@ -57,7 +57,7 @@ def create_app( if app_settings.DYNAMIC_SCHEDULER_PROFILING: initialize_profiler(app) - if app_tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=app_tracing_data) + if app_tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=app_tracing_config) return app diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py index fe2651604960..5258c6638d0b 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py @@ -46,5 +46,5 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, logging_lifespan=logging_lifespan, - tracing_data=tracing_data, + tracing_config=tracing_data, ) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index c89776fd6f55..94ed10a7fc27 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -120,13 +120,13 @@ def compose_spec(self) -> str | None: def create_base_app() -> FastAPI: # settings app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DYNAMIC_SIDECAR_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DY_SIDECAR_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DY_SIDECAR_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -150,7 +150,7 @@ def create_base_app() -> FastAPI: ) override_fastapi_openapi_method(app) app.state.settings = app_settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config app.include_router(get_main_router(app)) @@ -203,7 +203,7 @@ def create_app() -> FastAPI: if get_tracing_config(app).tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) # ERROR HANDLERS ------------ diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 8381c411663d..4dfac730a20e 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -31,10 +31,10 @@ def create_app( settings: ApplicationSettings | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - tracing_data = tracing_data or TracingConfig.create( + tracing_config = tracing_config or TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.EFS_GUARDIAN_TRACING, ) @@ -50,10 +50,10 @@ def create_app( ) # STATE app.state.settings = app_settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config) # PLUGINS SETUP setup_rabbitmq(app) @@ -69,8 +69,8 @@ def create_app( setup_fire_and_forget(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) # EVENTS async def _on_startup() -> None: diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/main.py b/services/efs-guardian/src/simcore_service_efs_guardian/main.py index bbffc1b944b7..b6a7b9e35075 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/main.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/main.py @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index aa5e0e115c4f..b958e8ecbaf0 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -26,7 +26,7 @@ def create_app( settings: ApplicationSettings | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: app = FastAPI( @@ -41,13 +41,13 @@ def create_app( # STATE app.state.settings = settings or ApplicationSettings() # type: ignore[call-arg] - app.state.tracing_data = tracing_data or TracingConfig.create( + app.state.tracing_config = tracing_config or TracingConfig.create( service_name=APP_NAME, tracing_settings=app.state.settings.INVITATIONS_TRACING ) assert app.state.settings.API_VERSION == API_VERSION # nosec if get_tracing_config(app).tracing_enabled: - setup_tracing(app, tracing_data=get_tracing_config(app)) + setup_tracing(app, tracing_config=get_tracing_config(app)) # PLUGINS SETUP setup_api_routes(app) @@ -56,7 +56,7 @@ def create_app( setup_prometheus_instrumentation(app) if get_tracing_config(app).tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) + initialize_fastapi_app_tracing(app, tracing_config=get_tracing_config(app)) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/invitations/src/simcore_service_invitations/main.py b/services/invitations/src/simcore_service_invitations/main.py index d2f0e0f86023..2bca674efbac 100644 --- a/services/invitations/src/simcore_service_invitations/main.py +++ b/services/invitations/src/simcore_service_invitations/main.py @@ -36,6 +36,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/notifications/src/simcore_service_notifications/core/application.py b/services/notifications/src/simcore_service_notifications/core/application.py index 4c0d6fe34efa..4d87d4e62970 100644 --- a/services/notifications/src/simcore_service_notifications/core/application.py +++ b/services/notifications/src/simcore_service_notifications/core/application.py @@ -26,10 +26,10 @@ def create_app( settings: ApplicationSettings | None = None, logging_lifespan: Lifespan | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: settings = settings or ApplicationSettings.create_from_envs() - tracing_data = tracing_data or TracingConfig.create( + tracing_config = tracing_config or TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.NOTIFICATIONS_TRACING ) @@ -45,17 +45,17 @@ def create_app( ) override_fastapi_openapi_method(app) app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config=tracing_config) initialize_rest_api(app) if settings.NOTIFICATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: initialize_prometheus_instrumentation(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) return app diff --git a/services/notifications/src/simcore_service_notifications/main.py b/services/notifications/src/simcore_service_notifications/main.py index b85ac67bdd74..0ebc8c9de573 100644 --- a/services/notifications/src/simcore_service_notifications/main.py +++ b/services/notifications/src/simcore_service_notifications/main.py @@ -40,5 +40,5 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, logging_lifespan=logging_lifespan, - tracing_data=tracing_data, + tracing_config=tracing_data, ) diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index f868e8f17d98..3413bd9501c2 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -33,11 +33,11 @@ def create_app( settings: ApplicationSettings | None = None, - tracing_data: TracingConfig | None = None, + tracing_config: TracingConfig | None = None, ) -> FastAPI: app_settings = settings or ApplicationSettings.create_from_envs() - app_tracing_data = tracing_data or TracingConfig.create( + app_tracing_config = tracing_config or TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.PAYMENTS_TRACING ) app = FastAPI( @@ -52,12 +52,12 @@ def create_app( # STATE app.state.settings = app_settings - app.state.tracing_data = app_tracing_data + app.state.tracing_config = app_tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if app_tracing_data.tracing_enabled: - setup_tracing(app, app_tracing_data) + if app_tracing_config.tracing_enabled: + setup_tracing(app, app_tracing_config) # API w/ postgres db setup_postgres(app) @@ -84,8 +84,8 @@ def create_app( if app.state.settings.PAYMENTS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if app_tracing_data: - initialize_fastapi_app_tracing(app, tracing_data=app_tracing_data) + if app_tracing_config: + initialize_fastapi_app_tracing(app, tracing_config=app_tracing_config) # ERROR HANDLERS # ... add here ... diff --git a/services/payments/src/simcore_service_payments/main.py b/services/payments/src/simcore_service_payments/main.py index ac84e7977a05..5b5d30775bd4 100644 --- a/services/payments/src/simcore_service_payments/main.py +++ b/services/payments/src/simcore_service_payments/main.py @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/storage/src/simcore_service_storage/core/application.py b/services/storage/src/simcore_service_storage/core/application.py index 3c725f8683cc..6e2ee80af1e8 100644 --- a/services/storage/src/simcore_service_storage/core/application.py +++ b/services/storage/src/simcore_service_storage/core/application.py @@ -49,7 +49,7 @@ def create_app( - settings: ApplicationSettings, tracing_data: TracingConfig + settings: ApplicationSettings, tracing_config: TracingConfig ) -> FastAPI: # noqa: C901 app = FastAPI( debug=settings.SC_BOOT_MODE @@ -66,16 +66,16 @@ def create_app( # STATE app.state.settings = settings - app.state.tracing_data = tracing_data + app.state.tracing_config = tracing_config - if tracing_data.tracing_enabled: - setup_tracing(app, tracing_data) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config) setup_db(app) setup_s3(app) setup_client_session( app, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) if settings.STORAGE_CELERY: @@ -110,8 +110,8 @@ def create_app( if settings.STORAGE_MONITORING_ENABLED: setup_prometheus_instrumentation(app) - if tracing_data.tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=tracing_data) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) async def _on_startup() -> None: if settings.STORAGE_WORKER_MODE: diff --git a/services/storage/src/simcore_service_storage/main.py b/services/storage/src/simcore_service_storage/main.py index 444114f9aee0..bbc3bce665fd 100644 --- a/services/storage/src/simcore_service_storage/main.py +++ b/services/storage/src/simcore_service_storage/main.py @@ -42,6 +42,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_data) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index b70ede3a649b..db742096c789 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -32,7 +32,7 @@ assert _settings.STORAGE_CELERY # nosec app = create_celery_app(_settings.STORAGE_CELERY) -app_server = FastAPIAppServer(app=create_app(_settings, tracing_data=_tracing_data)) +app_server = FastAPIAppServer(app=create_app(_settings, tracing_config=_tracing_data)) def worker_init_wrapper(sender, **kwargs): diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index 0fe8dbccebf9..15465d656515 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -241,7 +241,7 @@ async def initialized_app( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) - app = create_app(app_settings, tracing_data=tracing_data) + app = create_app(app_settings, tracing_config=tracing_data) # NOTE: the timeout is sometime too small for CI machines, and even larger machines async with LifespanManager( app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT @@ -1024,7 +1024,7 @@ async def with_storage_celery_worker( ) app_server = FastAPIAppServer( - app=create_app(app_settings, tracing_data=tracing_data) + app=create_app(app_settings, tracing_config=tracing_data) ) def _on_worker_init_wrapper(sender: WorkController, **_kwargs): diff --git a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py index 4b94596bc69a..cd154744985d 100644 --- a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py +++ b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py @@ -68,7 +68,7 @@ async def real_storage_server(app_settings: ApplicationSettings) -> AsyncIterato tracing_settings=None, # disable tracing in tests service_name="storage-api", ) - app = create_app(settings, tracing_data=tracing_data) + app = create_app(settings, tracing_config=tracing_data) storage_port = unused_port() with log_context( logging.INFO, From 02e1652d3ef47ef976056485c022cb6cc5918bf1 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 8 Oct 2025 16:35:55 +0200 Subject: [PATCH 56/62] Follow up changes --- .../tests/aiohttp/test_tracing.py | 24 ++++++------- .../tests/fastapi/test_http_client_thin.py | 18 +++++----- .../tests/fastapi/test_tracing.py | 36 +++++++++---------- .../tests/test_logging_utils.py | 22 ++++++------ .../agent/src/simcore_service_agent/main.py | 6 ++-- .../celery_worker/worker_main.py | 4 +-- .../src/simcore_service_api_server/main.py | 6 ++-- .../utils/client_base.py | 2 +- .../src/simcore_service_autoscaling/main.py | 6 ++-- services/autoscaling/tests/unit/conftest.py | 4 +-- .../clients/director.py | 2 +- .../src/simcore_service_catalog/main.py | 6 ++-- services/catalog/tests/unit/conftest.py | 8 ++--- .../simcore_service_clusters_keeper/main.py | 6 ++-- .../clusters-keeper/tests/unit/conftest.py | 4 +-- .../utils/logs.py | 4 +-- .../simcore_service_datcore_adapter/main.py | 6 ++-- .../cli/_client.py | 2 +- .../core/application.py | 2 +- .../modules/catalog.py | 2 +- .../modules/director_v0.py | 2 +- .../modules/dynamic_services.py | 2 +- .../dynamic_sidecar/api_client/_thin.py | 4 +-- .../modules/resource_usage_tracker_client.py | 2 +- .../modules/storage.py | 2 +- .../src/simcore_service_director/main.py | 6 ++-- services/director/tests/unit/conftest.py | 4 +-- .../core/application.py | 2 +- .../core/events.py | 6 ++-- .../simcore_service_dynamic_scheduler/main.py | 6 ++-- .../services/catalog/_thin_client.py | 2 +- .../services/director_v0/_thin_client.py | 2 +- .../services/director_v2/_thin_client.py | 2 +- .../src/simcore_service_efs_guardian/main.py | 6 ++-- .../src/simcore_service_invitations/main.py | 6 ++-- .../src/simcore_service_notifications/main.py | 6 ++-- .../src/simcore_service_payments/main.py | 6 ++-- .../services/payments_gateway.py | 2 +- .../services/resource_usage_tracker.py | 2 +- .../services/stripe.py | 2 +- .../core/application.py | 10 +++--- .../main.py | 6 ++-- .../tests/unit/conftest.py | 10 +++--- .../tests/unit/with_dbs/conftest.py | 4 +-- .../src/simcore_service_storage/main.py | 6 ++-- .../modules/celery/worker_main.py | 6 ++-- .../tests/unit/isolated/test_tracing.py | 4 +-- .../unit/with_dbs/03/test__openapi_specs.py | 4 +-- .../tests/unit/with_dbs/03/test_session.py | 4 +-- .../server/tests/unit/with_dbs/conftest.py | 4 +-- 50 files changed, 150 insertions(+), 150 deletions(-) diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index 264196ff7943..857d747f168d 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -15,7 +15,7 @@ from opentelemetry import trace from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter from pydantic import ValidationError -from servicelib.aiohttp.tracing import TRACING_DATA_KEY, setup_tracing +from servicelib.aiohttp.tracing import TRACING_CONFIG_KEY, setup_tracing from servicelib.tracing import _OSPARC_TRACE_ID_HEADER, TracingConfig from settings_library.tracing import TracingSettings @@ -70,10 +70,10 @@ async def test_valid_tracing_settings( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) - async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): + async for _ in setup_tracing(app=app, tracing_config=tracing_config)(app): pass @@ -148,12 +148,12 @@ async def test_tracing_setup_package_detection( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) - async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): + async for _ in setup_tracing(app=app, tracing_config=tracing_config)(app): # idempotency - async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): + async for _ in setup_tracing(app=app, tracing_config=tracing_config)(app): pass @@ -177,10 +177,10 @@ async def test_trace_id_in_response_header( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) - app[TRACING_DATA_KEY] = tracing_data + app[TRACING_CONFIG_KEY] = tracing_config async def handler(handler_data: dict, request: web.Request) -> web.Response: current_span = trace.get_current_span() @@ -196,7 +196,7 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: async for _ in setup_tracing( app=app, - tracing_data=tracing_data, + tracing_config=tracing_config, add_response_trace_id_header=True, )(app): client = await aiohttp_client(app) @@ -233,17 +233,17 @@ async def test_tracing_sampling_probability_effective( app = web.Application() service_name = "simcore_service_webserver" tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name=service_name ) - app[TRACING_DATA_KEY] = tracing_data + app[TRACING_CONFIG_KEY] = tracing_config async def handler(request: web.Request) -> web.Response: return web.Response(text="ok") app.router.add_get("/", handler) - async for _ in setup_tracing(app=app, tracing_data=tracing_data)(app): + async for _ in setup_tracing(app=app, tracing_config=tracing_config)(app): client = await aiohttp_client(app) await asyncio.gather(*(client.get("/") for _ in range(n_requests))) diff --git a/packages/service-library/tests/fastapi/test_http_client_thin.py b/packages/service-library/tests/fastapi/test_http_client_thin.py index eed9331fb5bf..6cecb7e43467 100644 --- a/packages/service-library/tests/fastapi/test_http_client_thin.py +++ b/packages/service-library/tests/fastapi/test_http_client_thin.py @@ -72,7 +72,7 @@ def request_timeout() -> int: @pytest.fixture async def thick_client(request_timeout: int) -> AsyncIterable[FakeThickClient]: async with FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) as client: yield client @@ -100,7 +100,7 @@ async def test_retry_on_errors( caplog_info_level: pytest.LogCaptureFixture, ) -> None: client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) with pytest.raises(ClientHttpError): @@ -126,7 +126,7 @@ async def raises_request_error(self) -> Response: ) client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) with pytest.raises(ClientHttpError): @@ -154,7 +154,7 @@ async def raises_http_error(self) -> Response: raise HTTPError(msg) client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) with pytest.raises(ClientHttpError): @@ -170,7 +170,7 @@ async def public_method_ok(self) -> Response: # type: ignore # OK OKTestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) class FailWrongAnnotationTestClient(BaseThinClient): @@ -181,7 +181,7 @@ async def public_method_wrong_annotation(self) -> None: FailWrongAnnotationTestClient( total_retry_interval=request_timeout, tracing_settings=None, - tracing_data=None, + tracing_config=None, ) class FailNoAnnotationTestClient(BaseThinClient): @@ -192,7 +192,7 @@ async def public_method_no_annotation(self): FailNoAnnotationTestClient( total_retry_interval=request_timeout, tracing_settings=None, - tracing_data=None, + tracing_config=None, ) @@ -218,7 +218,7 @@ async def get_wrong_state(self) -> Response: respx_mock.get(get_wrong_state).mock(return_value=Response(codes.OK)) test_client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) # OK @@ -241,7 +241,7 @@ async def test_retry_timeout_overwrite( caplog_info_level: pytest.LogCaptureFixture, ) -> None: client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_data=None + total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None ) caplog_info_level.clear() diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 1b5250ec382a..e15bd219dc6f 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -84,14 +84,14 @@ async def test_valid_tracing_settings( tracing_settings_in: Callable[[], dict[str, Any]], ): tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): pass @@ -122,11 +122,11 @@ async def test_invalid_tracing_settings( app = mocked_app with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012 tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=app): pass @@ -180,15 +180,15 @@ async def test_tracing_setup_package_detection( package_name = manage_package importlib.import_module(package_name) tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): # idempotency check async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): pass @@ -215,7 +215,7 @@ async def test_trace_id_in_response_header( server_response: PlainTextResponse | HTTPException, ) -> None: tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) @@ -233,10 +233,10 @@ async def handler(handler_data: dict): mocked_app.get("/")(partial(handler, handler_data)) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): initialize_fastapi_app_tracing( - mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + mocked_app, tracing_config=tracing_config, add_response_trace_id_header=True ) client = TestClient(mocked_app) response = client.get("/") @@ -268,14 +268,14 @@ async def test_with_profile_span( server_response: PlainTextResponse | HTTPException, ): tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) handler_data = dict() async def handler(handler_data: dict): - with profiled_span(tracing_data=tracing_data, span_name="my favorite span"): + with profiled_span(tracing_config=tracing_config, span_name="my favorite span"): current_span = trace.get_current_span() handler_data[_OSPARC_TRACE_ID_HEADER] = format( current_span.get_span_context().trace_id, "032x" @@ -287,10 +287,10 @@ async def handler(handler_data: dict): mocked_app.get("/")(partial(handler, handler_data)) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): initialize_fastapi_app_tracing( - mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + mocked_app, tracing_config=tracing_config, add_response_trace_id_header=True ) client = TestClient(mocked_app) _ = client.get("/") @@ -328,7 +328,7 @@ async def test_tracing_sampling_probability_effective( tolerance_probability = 0.5 tracing_settings = TracingSettings() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" ) @@ -338,10 +338,10 @@ async def handler(): mocked_app.get("/")(handler) async for _ in get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, )(app=mocked_app): initialize_fastapi_app_tracing( - mocked_app, tracing_data=tracing_data, add_response_trace_id_header=True + mocked_app, tracing_config=tracing_config, add_response_trace_id_header=True ) client = TestClient(mocked_app) for _ in range(n_requests): diff --git a/packages/service-library/tests/test_logging_utils.py b/packages/service-library/tests/test_logging_utils.py index de3da0a45bcf..80d6d5d0249d 100644 --- a/packages/service-library/tests/test_logging_utils.py +++ b/packages/service-library/tests/test_logging_utils.py @@ -441,7 +441,7 @@ def test_set_parent_module_log_level_(caplog: pytest.LogCaptureFixture): @pytest.fixture -def tracing_data() -> TracingConfig: +def tracing_config() -> TracingConfig: return TracingConfig.create( service_name="test-service", tracing_settings=None, # disable tracing in tests @@ -452,7 +452,7 @@ def tracing_data() -> TracingConfig: def test_setup_async_loggers_basic( caplog: pytest.LogCaptureFixture, log_format_local_dev_enabled: bool, - tracing_data: TracingConfig, + tracing_config: TracingConfig, ): """Test basic async logging setup without filters.""" caplog.clear() @@ -461,7 +461,7 @@ def test_setup_async_loggers_basic( with async_loggers( log_format_local_dev_enabled=log_format_local_dev_enabled, logger_filter_mapping={}, # No filters for this test - tracing_data=tracing_data, # No tracing for this test + tracing_config=tracing_config, # No tracing for this test log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -473,7 +473,7 @@ def test_setup_async_loggers_basic( def test_setup_async_loggers_with_filters( caplog: pytest.LogCaptureFixture, - tracing_data: TracingConfig, + tracing_config: TracingConfig, ): caplog.clear() caplog.set_level(logging.INFO) @@ -486,7 +486,7 @@ def test_setup_async_loggers_with_filters( with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping=filter_mapping, - tracing_data=tracing_data, # no tracing in this test + tracing_config=tracing_config, # no tracing in this test log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -513,7 +513,7 @@ def test_setup_async_loggers_with_filters( def test_setup_async_loggers_with_tracing_settings( caplog: pytest.LogCaptureFixture, - tracing_data: TracingConfig, + tracing_config: TracingConfig, ): """Test async logging setup with tracing settings.""" caplog.clear() @@ -524,7 +524,7 @@ def test_setup_async_loggers_with_tracing_settings( with async_loggers( log_format_local_dev_enabled=False, logger_filter_mapping={}, # No filters for this test - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -536,7 +536,7 @@ def test_setup_async_loggers_with_tracing_settings( def test_setup_async_loggers_context_manager_cleanup( caplog: pytest.LogCaptureFixture, - tracing_data: TracingConfig, + tracing_config: TracingConfig, ): """Test that async logging context manager properly cleans up.""" caplog.clear() @@ -547,7 +547,7 @@ def test_setup_async_loggers_context_manager_cleanup( with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping={}, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): @@ -559,7 +559,7 @@ def test_setup_async_loggers_context_manager_cleanup( def test_setup_async_loggers_exception_handling( caplog: pytest.LogCaptureFixture, - tracing_data: TracingConfig, + tracing_config: TracingConfig, ): """Test that async logging handles exceptions gracefully.""" caplog.clear() @@ -574,7 +574,7 @@ def _raise_test_exception(): with async_loggers( log_format_local_dev_enabled=True, logger_filter_mapping={}, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=logging.INFO, # Set base log level noisy_loggers=(), # No noisy loggers for this test ): diff --git a/services/agent/src/simcore_service_agent/main.py b/services/agent/src/simcore_service_agent/main.py index c1a3bc6cde7e..5d51293c64ba 100644 --- a/services/agent/src/simcore_service_agent/main.py +++ b/services/agent/src/simcore_service_agent/main.py @@ -22,13 +22,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.AGENT_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.AGENT_VOLUMES_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.AGENT_VOLUMES_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -37,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py index 18df5710e6a0..c9e99cda269f 100644 --- a/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py +++ b/services/api-server/src/simcore_service_api_server/celery_worker/worker_main.py @@ -18,14 +18,14 @@ def get_app(): _settings = ApplicationSettings.create_from_envs() _tracing_settings = _settings.API_SERVER_TRACING - _tracing_data = TracingConfig.create( + _tracing_config = TracingConfig.create( tracing_settings=_tracing_settings, service_name="api-server-celery-worker", ) setup_loggers( log_format_local_dev_enabled=_settings.API_SERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.API_SERVER_LOG_FILTER_MAPPING, - tracing_data=_tracing_data, + tracing_config=_tracing_config, log_base_level=_settings.log_level, noisy_loggers=None, ) diff --git a/services/api-server/src/simcore_service_api_server/main.py b/services/api-server/src/simcore_service_api_server/main.py index 621b9204fad7..ace337b472e1 100644 --- a/services/api-server/src/simcore_service_api_server/main.py +++ b/services/api-server/src/simcore_service_api_server/main.py @@ -24,13 +24,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.API_SERVER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.API_SERVER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.API_SERVER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/api-server/src/simcore_service_api_server/utils/client_base.py b/services/api-server/src/simcore_service_api_server/utils/client_base.py index c5b4442bfd16..6aa567fd43ec 100644 --- a/services/api-server/src/simcore_service_api_server/utils/client_base.py +++ b/services/api-server/src/simcore_service_api_server/utils/client_base.py @@ -62,7 +62,7 @@ def setup_client_instance( if tracing_settings: setup_httpx_client_tracing( client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) # events diff --git a/services/autoscaling/src/simcore_service_autoscaling/main.py b/services/autoscaling/src/simcore_service_autoscaling/main.py index 8c6c948090d4..48b5fe82b450 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/main.py +++ b/services/autoscaling/src/simcore_service_autoscaling/main.py @@ -25,13 +25,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingConfig.create( + tracing_config = tracing.TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.AUTOSCALING_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.AUTOSCALING_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.AUTOSCALING_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -40,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/autoscaling/tests/unit/conftest.py b/services/autoscaling/tests/unit/conftest.py index c7ec352ba53d..0b4482dd066b 100644 --- a/services/autoscaling/tests/unit/conftest.py +++ b/services/autoscaling/tests/unit/conftest.py @@ -416,11 +416,11 @@ def enabled_rabbitmq( @pytest.fixture async def initialized_app(app_environment: EnvVarsDict) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=settings.APP_NAME, tracing_settings=None, # disable tracing in tests ) - app = create_app(settings, tracing_data=tracing_data) + app = create_app(settings, tracing_config=tracing_config) # NOTE: the timeout is sometime too small for CI machines, and even larger machines async with LifespanManager( app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT diff --git a/services/catalog/src/simcore_service_catalog/clients/director.py b/services/catalog/src/simcore_service_catalog/clients/director.py index 29157a07b894..f3041ad2a5c0 100644 --- a/services/catalog/src/simcore_service_catalog/clients/director.py +++ b/services/catalog/src/simcore_service_catalog/clients/director.py @@ -148,7 +148,7 @@ def __init__(self, base_url: str, app: FastAPI): if settings.CATALOG_TRACING: setup_httpx_client_tracing( self.client, - tracing_data=get_tracing_config(app=app), + tracing_config=get_tracing_config(app=app), ) assert settings.CATALOG_DIRECTOR # nosec diff --git a/services/catalog/src/simcore_service_catalog/main.py b/services/catalog/src/simcore_service_catalog/main.py index c94de04d9d1d..f899adda2bff 100644 --- a/services/catalog/src/simcore_service_catalog/main.py +++ b/services/catalog/src/simcore_service_catalog/main.py @@ -25,14 +25,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=app_settings.CATALOG_TRACING, service_name="catalog", ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.CATALOG_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.CATALOG_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -44,6 +44,6 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, - tracing_config=tracing_data, + tracing_config=tracing_config, logging_lifespan=logging_lifespan, ) diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index fb7c03bce2f6..a431e1955f58 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -147,10 +147,10 @@ async def app( # create instance assert app_environment - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) - app_under_test = create_app(tracing_config=tracing_data) + app_under_test = create_app(tracing_config=tracing_config) assert spy_app.on_startup.call_count == 0 assert spy_app.on_shutdown.call_count == 0 @@ -177,10 +177,10 @@ def client( # create instance assert app_environment - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) - app_under_test = create_app(tracing_config=tracing_data) + app_under_test = create_app(tracing_config=tracing_config) assert ( spy_app.on_startup.call_count == 0 diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py index 57721e00915b..88f891c8f0d5 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/main.py @@ -25,13 +25,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.CLUSTERS_KEEPER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.CLUSTERS_KEEPER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.CLUSTERS_KEEPER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -40,6 +40,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/clusters-keeper/tests/unit/conftest.py b/services/clusters-keeper/tests/unit/conftest.py index cd01558ade6e..e5ec5afd891c 100644 --- a/services/clusters-keeper/tests/unit/conftest.py +++ b/services/clusters-keeper/tests/unit/conftest.py @@ -255,10 +255,10 @@ async def initialized_app( app_environment: EnvVarsDict, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) - app = create_app(settings, tracing_data=tracing_data) + app = create_app(settings, tracing_config=tracing_config) async with LifespanManager(app, shutdown_timeout=None if is_pdb_enabled else 20): yield app diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index e751f82823d3..4d753d0d2a24 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -14,13 +14,13 @@ def setup_app_logging(settings: ApplicationSettings) -> None: - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=PROJECT_NAME, tracing_settings=None ) setup_loggers( log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=settings.DASK_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py index a7e98686c03a..a3a1a44c2273 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/main.py @@ -23,13 +23,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingConfig.create( + tracing_config = tracing.TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.DATCORE_ADAPTER_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DATCORE_ADAPTER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DATCORE_ADAPTER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -38,6 +38,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/director-v2/src/simcore_service_director_v2/cli/_client.py b/services/director-v2/src/simcore_service_director_v2/cli/_client.py index 037e2665321f..19328423643d 100644 --- a/services/director-v2/src/simcore_service_director_v2/cli/_client.py +++ b/services/director-v2/src/simcore_service_director_v2/cli/_client.py @@ -15,7 +15,7 @@ def __init__(self): total_retry_interval=10, default_http_client_timeout=Timeout(5), tracing_settings=None, - tracing_data=None, + tracing_config=None, ) def _get_url(self, postfix: str) -> str: diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index a1546c816db7..fb3cfe4d25c2 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -205,7 +205,7 @@ def create_app( # noqa: C901, PLR0912 db.setup(app, settings.POSTGRES) if get_tracing_config(app).tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_data=get_tracing_config(app)) + initialize_fastapi_app_tracing(app, tracing_config=get_tracing_config(app)) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py index efe7fa9308c6..9923f151a819 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/catalog.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/catalog.py @@ -37,7 +37,7 @@ async def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) CatalogClient.create( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py index 38f68b2db981..1c000d1606df 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/director_v0.py @@ -42,7 +42,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) DirectorV0Client.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py index 588a833bbfac..81e142f6ddd1 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_services.py @@ -20,7 +20,7 @@ def on_startup() -> None: if get_tracing_config(app).tracing_enabled: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_config(app=app), + tracing_config=get_tracing_config(app=app), ) ServicesClient.create( app, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index 9fd6f1f9a342..3342acba2946 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI): tracing_settings: TracingSettings | None = ( app.state.settings.DIRECTOR_V2_TRACING ) - tracing_data = get_tracing_config(app) + tracing_config = get_tracing_config(app) # timeouts self._health_request_timeout = Timeout(1.0, connect=1.0) @@ -60,7 +60,7 @@ def __init__(self, app: FastAPI): connect=scheduler_settings.DYNAMIC_SIDECAR_API_CONNECT_TIMEOUT, ), tracing_settings=tracing_settings, - tracing_data=tracing_data, + tracing_config=tracing_config, ) def _get_url( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py index edadeab2d214..51c68e990a3c 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/resource_usage_tracker_client.py @@ -45,7 +45,7 @@ def create( if settings.DIRECTOR_V2_TRACING: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) exit_stack = contextlib.AsyncExitStack() diff --git a/services/director-v2/src/simcore_service_director_v2/modules/storage.py b/services/director-v2/src/simcore_service_director_v2/modules/storage.py index c5f6a51bedb9..1729c2f824b3 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/storage.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/storage.py @@ -40,7 +40,7 @@ def on_startup() -> None: if tracing_settings: setup_httpx_client_tracing( client=client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) StorageClient.create( app, diff --git a/services/director/src/simcore_service_director/main.py b/services/director/src/simcore_service_director/main.py index 37ed2d693b63..e087c2f13e5a 100644 --- a/services/director/src/simcore_service_director/main.py +++ b/services/director/src/simcore_service_director/main.py @@ -21,14 +21,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.DIRECTOR_TRACING, ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.DIRECTOR_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DIRECTOR_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -37,6 +37,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 820d9156cf43..62ff5cee8f31 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -164,10 +164,10 @@ def app_settings(app_environment: EnvVarsDict) -> ApplicationSettings: async def app( app_settings: ApplicationSettings, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name="director", tracing_settings=None # disable tracing in tests ) - the_test_app = create_app(settings=app_settings, tracing_config=tracing_data) + the_test_app = create_app(settings=app_settings, tracing_config=tracing_config) async with LifespanManager( the_test_app, startup_timeout=None if is_pdb_enabled else MAX_TIME_FOR_APP_TO_STARTUP, diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index 9aee46e8ed0e..6685558c6258 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -36,7 +36,7 @@ def create_app( ), redoc_url=None, lifespan=events.create_app_lifespan( - tracing_data=app_tracing_config, + tracing_config=app_tracing_config, logging_lifespan=logging_lifespan, ), ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py index fb75e3deb61b..b7afd1092240 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/events.py @@ -55,7 +55,7 @@ async def _settings_lifespan(app: FastAPI) -> AsyncIterator[State]: def create_app_lifespan( - tracing_data: TracingConfig, + tracing_config: TracingConfig, logging_lifespan: Lifespan | None, ) -> LifespanManager: app_lifespan = LifespanManager() @@ -63,10 +63,10 @@ def create_app_lifespan( app_lifespan.add(logging_lifespan) app_lifespan.add(_settings_lifespan) - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: app_lifespan.add( get_tracing_instrumentation_lifespan( - tracing_data=tracing_data, + tracing_config=tracing_config, ) ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py index 5258c6638d0b..a08411cc2c5c 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/main.py @@ -27,14 +27,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=app_settings.DYNAMIC_SCHEDULER_TRACING, service_name=APP_NAME, ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.DYNAMIC_SCHEDULER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.DYNAMIC_SCHEDULER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -46,5 +46,5 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, logging_lifespan=logging_lifespan, - tracing_config=tracing_data, + tracing_config=tracing_config, ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py index 6b673c1b3c2f..4bafaaed53d1 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py @@ -36,7 +36,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_CATALOG_SETTINGS.api_base_url, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py index 8896b7340a3a..900873cd1701 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py @@ -38,7 +38,7 @@ def __init__(self, app: FastAPI) -> None: }, base_url=settings.DYNAMIC_SCHEDULER_DIRECTOR_V0_SETTINGS.endpoint, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py index 5e6833a05972..47b733cb75d2 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py @@ -43,7 +43,7 @@ def __init__(self, app: FastAPI) -> None: ), extra_allowed_method_names={"attach_lifespan_to"}, tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) @retry_on_errors() diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/main.py b/services/efs-guardian/src/simcore_service_efs_guardian/main.py index b6a7b9e35075..8120171503a3 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/main.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/main.py @@ -23,14 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = tracing.TracingConfig.create( + tracing_config = tracing.TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.EFS_GUARDIAN_TRACING, ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.EFS_GUARDIAN_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.EFS_GUARDIAN_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/invitations/src/simcore_service_invitations/main.py b/services/invitations/src/simcore_service_invitations/main.py index 2bca674efbac..cd34c68daa39 100644 --- a/services/invitations/src/simcore_service_invitations/main.py +++ b/services/invitations/src/simcore_service_invitations/main.py @@ -20,14 +20,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.INVITATIONS_TRACING, ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.INVITATIONS_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.INVITATIONS_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -36,6 +36,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/notifications/src/simcore_service_notifications/main.py b/services/notifications/src/simcore_service_notifications/main.py index 0ebc8c9de573..84d32dc27052 100644 --- a/services/notifications/src/simcore_service_notifications/main.py +++ b/services/notifications/src/simcore_service_notifications/main.py @@ -22,13 +22,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.NOTIFICATIONS_TRACING ) logging_lifespan = create_logging_lifespan( log_format_local_dev_enabled=app_settings.NOTIFICATIONS_VOLUMES_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.NOTIFICATIONS_VOLUMES_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -40,5 +40,5 @@ def app_factory() -> FastAPI: return create_app( settings=app_settings, logging_lifespan=logging_lifespan, - tracing_config=tracing_data, + tracing_config=tracing_config, ) diff --git a/services/payments/src/simcore_service_payments/main.py b/services/payments/src/simcore_service_payments/main.py index 5b5d30775bd4..558df4781c27 100644 --- a/services/payments/src/simcore_service_payments/main.py +++ b/services/payments/src/simcore_service_payments/main.py @@ -23,14 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.PAYMENTS_TRACING, ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.PAYMENTS_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.PAYMENTS_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/payments/src/simcore_service_payments/services/payments_gateway.py b/services/payments/src/simcore_service_payments/services/payments_gateway.py index 0b06979d1ff4..b07307a9a3fd 100644 --- a/services/payments/src/simcore_service_payments/services/payments_gateway.py +++ b/services/payments/src/simcore_service_payments/services/payments_gateway.py @@ -218,7 +218,7 @@ def setup_payments_gateway(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) api.attach_lifespan_to(app) api.set_to_app_state(app) diff --git a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py index f5bd7db1ec54..d02146ca16e5 100644 --- a/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py +++ b/services/payments/src/simcore_service_payments/services/resource_usage_tracker.py @@ -76,7 +76,7 @@ def setup_resource_usage_tracker(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) api.set_to_app_state(app) api.attach_lifespan_to(app) diff --git a/services/payments/src/simcore_service_payments/services/stripe.py b/services/payments/src/simcore_service_payments/services/stripe.py index 59cee4415a2d..92dc755d73c9 100644 --- a/services/payments/src/simcore_service_payments/services/stripe.py +++ b/services/payments/src/simcore_service_payments/services/stripe.py @@ -95,7 +95,7 @@ def setup_stripe(app: FastAPI): if settings.PAYMENTS_TRACING: setup_httpx_client_tracing( api.client, - tracing_data=get_tracing_config(app), + tracing_config=get_tracing_config(app), ) api.set_to_app_state(app) diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index 1fafe15e5638..58d8eb65b8d4 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -35,7 +35,7 @@ _logger = logging.getLogger(__name__) -def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> FastAPI: +def create_app(settings: ApplicationSettings, tracing_config: TracingConfig) -> FastAPI: app = FastAPI( debug=settings.RESOURCE_USAGE_TRACKER_DEBUG, title=f"{PROJECT_NAME} web API", @@ -52,10 +52,10 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa assert app.state.settings.API_VERSION == API_VERSION # nosec # PLUGINS SETUP - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: setup_tracing( app, - tracing_data, + tracing_config, ) setup_api_routes(app) fire_and_forget_setup(app) @@ -73,10 +73,10 @@ def create_app(settings: ApplicationSettings, tracing_data: TracingConfig) -> Fa setup_process_message_running_service(app) # Requires Rabbit - if tracing_data.tracing_enabled: + if tracing_config.tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_data=tracing_data, + tracing_config=tracing_config, ) # ERROR HANDLERS diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py index da31659cdec9..212b5cac4548 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/main.py @@ -23,14 +23,14 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=app_settings.APP_NAME, tracing_settings=app_settings.RESOURCE_USAGE_TRACKER_TRACING, ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.RESOURCE_USAGE_TRACKER_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.RESOURCE_USAGE_TRACKER_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -39,6 +39,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_data=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/resource-usage-tracker/tests/unit/conftest.py b/services/resource-usage-tracker/tests/unit/conftest.py index 589b72bbb257..eb5f37e2de6f 100644 --- a/services/resource-usage-tracker/tests/unit/conftest.py +++ b/services/resource-usage-tracker/tests/unit/conftest.py @@ -122,7 +122,7 @@ def app_settings( @pytest.fixture -def tracing_data(app_settings: ApplicationSettings) -> TracingConfig: +def tracing_config(app_settings: ApplicationSettings) -> TracingConfig: return TracingConfig.create( service_name="resource-usage-tracker-tests", tracing_settings=None, # disable tracing in tests @@ -131,18 +131,18 @@ def tracing_data(app_settings: ApplicationSettings) -> TracingConfig: @pytest.fixture async def initialized_app( - app_settings: ApplicationSettings, tracing_data: TracingConfig + app_settings: ApplicationSettings, tracing_config: TracingConfig ) -> AsyncIterator[FastAPI]: - app = create_app(app_settings, tracing_data=tracing_data) + app = create_app(app_settings, tracing_config=tracing_config) async with LifespanManager(app): yield app @pytest.fixture def client( - app_settings: ApplicationSettings, tracing_data: TracingConfig + app_settings: ApplicationSettings, tracing_config: TracingConfig ) -> Iterator[TestClient]: - app = create_app(app_settings, tracing_data=tracing_data) + app = create_app(app_settings, tracing_config=tracing_config) with TestClient(app, base_url="http://testserver.test") as client: yield client diff --git a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py index d2291f5558e2..2bc186e3c161 100644 --- a/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py +++ b/services/resource-usage-tracker/tests/unit/with_dbs/conftest.py @@ -68,11 +68,11 @@ async def initialized_app( postgres_host_config: dict[str, str], ) -> AsyncIterable[FastAPI]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name="resource-usage-tracker", tracing_settings=None, # disable tracing in tests ) - app = create_app(settings, tracing_data=tracing_data) + app = create_app(settings, tracing_config=tracing_config) async with LifespanManager(app): yield app diff --git a/services/storage/src/simcore_service_storage/main.py b/services/storage/src/simcore_service_storage/main.py index bbc3bce665fd..4762791a5b8b 100644 --- a/services/storage/src/simcore_service_storage/main.py +++ b/services/storage/src/simcore_service_storage/main.py @@ -27,13 +27,13 @@ def app_factory() -> FastAPI: app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=app_settings.STORAGE_TRACING ) logging_shutdown_event = create_logging_shutdown_event( log_format_local_dev_enabled=app_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=app_settings.STORAGE_LOG_FILTER_MAPPING, - tracing_data=tracing_data, + tracing_config=tracing_config, log_base_level=app_settings.log_level, noisy_loggers=_NOISY_LOGGERS, ) @@ -42,6 +42,6 @@ def app_factory() -> FastAPI: "Application settings: %s", json_dumps(app_settings, indent=2, sort_keys=True), ) - app = create_app(settings=app_settings, tracing_config=tracing_data) + app = create_app(settings=app_settings, tracing_config=tracing_config) app.add_event_handler("shutdown", logging_shutdown_event) return app diff --git a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py index db742096c789..b82fff90abde 100644 --- a/services/storage/src/simcore_service_storage/modules/celery/worker_main.py +++ b/services/storage/src/simcore_service_storage/modules/celery/worker_main.py @@ -15,7 +15,7 @@ from ...core.settings import ApplicationSettings _settings = ApplicationSettings.create_from_envs() -_tracing_data = TracingConfig.create( +_tracing_config = TracingConfig.create( tracing_settings=_settings.STORAGE_TRACING, service_name="storage-celery-worker", ) @@ -23,7 +23,7 @@ setup_loggers( log_format_local_dev_enabled=_settings.STORAGE_LOG_FORMAT_LOCAL_DEV_ENABLED, logger_filter_mapping=_settings.STORAGE_LOG_FILTER_MAPPING, - tracing_data=_tracing_data, + tracing_config=_tracing_config, log_base_level=_settings.log_level, noisy_loggers=None, ) @@ -32,7 +32,7 @@ assert _settings.STORAGE_CELERY # nosec app = create_celery_app(_settings.STORAGE_CELERY) -app_server = FastAPIAppServer(app=create_app(_settings, tracing_config=_tracing_data)) +app_server = FastAPIAppServer(app=create_app(_settings, tracing_config=_tracing_config)) def worker_init_wrapper(sender, **kwargs): diff --git a/services/web/server/tests/unit/isolated/test_tracing.py b/services/web/server/tests/unit/isolated/test_tracing.py index 2d5edfd18de6..7006585fb7d2 100644 --- a/services/web/server/tests/unit/isolated/test_tracing.py +++ b/services/web/server/tests/unit/isolated/test_tracing.py @@ -32,10 +32,10 @@ def test_middleware_restrictions_opentelemetry_is_second_middleware( ): settings = ApplicationSettings.create_from_envs() assert settings.WEBSERVER_TRACING - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name=APP_NAME, tracing_settings=settings.WEBSERVER_TRACING ) - app = create_application(tracing_data=tracing_data) + app = create_application(tracing_config=tracing_config) assert app.middlewares assert app.middlewares[0] is aiohttp_server_opentelemetry_middleware diff --git a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py index 6e24c445f3be..400591447f6e 100644 --- a/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py +++ b/services/web/server/tests/unit/with_dbs/03/test__openapi_specs.py @@ -60,10 +60,10 @@ def app(app_environment: EnvVarsDict) -> web.Application: # - routings happen during setup! # - all plugins are setup but app is NOT started (i.e events are not triggered) # - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name="test-webserver", tracing_settings=None ) - app_ = create_application(tracing_data=tracing_data) + app_ = create_application(tracing_config=tracing_config) print(get_application_settings(app_).model_dump_json(indent=1)) return app_ diff --git a/services/web/server/tests/unit/with_dbs/03/test_session.py b/services/web/server/tests/unit/with_dbs/03/test_session.py index abd632072f50..6efc53955761 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_session.py +++ b/services/web/server/tests/unit/with_dbs/03/test_session.py @@ -58,10 +58,10 @@ async def _get_user_session(request: web.Request): session = await get_session(request) return web.json_response(dict(session)) - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( service_name="test-webserver", tracing_settings=None ) - app = create_application(tracing_data=tracing_data) + app = create_application(tracing_config=tracing_config) disable_static_webserver(app) app.add_routes(extra_routes) diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index 0997bfc7b17a..697fe02b8c7b 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -228,10 +228,10 @@ async def web_server( assert app_environment # original APP - tracing_data = tracing.TracingConfig.create( + tracing_config = tracing.TracingConfig.create( service_name="test-webserver", tracing_settings=None ) - app = create_application(tracing_data=tracing_data) + app = create_application(tracing_config=tracing_config) disable_static_webserver(app) From 9148c5e8de0db44ff6766f5638b646fc376e13e4 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 8 Oct 2025 20:58:03 +0200 Subject: [PATCH 57/62] @GitHK fixes --- .../core/application.py | 9 +++++---- .../simcore_service_invitations/core/application.py | 12 ++++++------ services/storage/tests/conftest.py | 8 ++++---- .../unit/test__legacy_storage_sdk_compatibility.py | 4 ++-- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 94ed10a7fc27..599c8c810e6a 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -176,9 +176,10 @@ def create_app() -> FastAPI: setup_shared_store(app) app.state.application_health = ApplicationHealth() application_settings: ApplicationSettings = app.state.settings + tracing_config = get_tracing_config(app) - if get_tracing_config(app).tracing_enabled: - setup_tracing(app, get_tracing_config(app)) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config) setup_rabbitmq(app) setup_rpc_api_routes(app) @@ -200,10 +201,10 @@ def create_app() -> FastAPI: if application_settings.are_prometheus_metrics_enabled: setup_prometheus_metrics(app) - if get_tracing_config(app).tracing_enabled: + if tracing_config.tracing_enabled: initialize_fastapi_app_tracing( app, - tracing_config=get_tracing_config(app), + tracing_config=tracing_config, ) # ERROR HANDLERS ------------ diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index b958e8ecbaf0..275a0596b433 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -4,7 +4,6 @@ ) from servicelib.fastapi.openapi import override_fastapi_openapi_method from servicelib.fastapi.tracing import ( - get_tracing_config, initialize_fastapi_app_tracing, setup_tracing, ) @@ -41,13 +40,14 @@ def create_app( # STATE app.state.settings = settings or ApplicationSettings() # type: ignore[call-arg] - app.state.tracing_config = tracing_config or TracingConfig.create( + tracing_config = tracing_config or TracingConfig.create( service_name=APP_NAME, tracing_settings=app.state.settings.INVITATIONS_TRACING ) + app.state.tracing_config = tracing_config assert app.state.settings.API_VERSION == API_VERSION # nosec - if get_tracing_config(app).tracing_enabled: - setup_tracing(app, tracing_config=get_tracing_config(app)) + if tracing_config.tracing_enabled: + setup_tracing(app, tracing_config=tracing_config) # PLUGINS SETUP setup_api_routes(app) @@ -55,8 +55,8 @@ def create_app( if app.state.settings.INVITATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) - if get_tracing_config(app).tracing_enabled: - initialize_fastapi_app_tracing(app, tracing_config=get_tracing_config(app)) + if tracing_config.tracing_enabled: + initialize_fastapi_app_tracing(app, tracing_config=tracing_config) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index 15465d656515..1831fab085a9 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -237,11 +237,11 @@ async def initialized_app( mock_celery_app: None, app_settings: ApplicationSettings, ) -> AsyncIterator[FastAPI]: - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) - app = create_app(app_settings, tracing_config=tracing_data) + app = create_app(app_settings, tracing_config=tracing_config) # NOTE: the timeout is sometime too small for CI machines, and even larger machines async with LifespanManager( app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT @@ -1018,13 +1018,13 @@ async def with_storage_celery_worker( # Signals must be explicitily connected monkeypatch.setenv("STORAGE_WORKER_MODE", "true") app_settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) app_server = FastAPIAppServer( - app=create_app(app_settings, tracing_config=tracing_data) + app=create_app(app_settings, tracing_config=tracing_config) ) def _on_worker_init_wrapper(sender: WorkController, **_kwargs): diff --git a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py index cd154744985d..9a411b6dbb83 100644 --- a/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py +++ b/services/storage/tests/unit/test__legacy_storage_sdk_compatibility.py @@ -64,11 +64,11 @@ async def _wait_for_server_ready(server: URL) -> None: @pytest.fixture async def real_storage_server(app_settings: ApplicationSettings) -> AsyncIterator[URL]: settings = ApplicationSettings.create_from_envs() - tracing_data = TracingConfig.create( + tracing_config = TracingConfig.create( tracing_settings=None, # disable tracing in tests service_name="storage-api", ) - app = create_app(settings, tracing_config=tracing_data) + app = create_app(settings, tracing_config=tracing_config) storage_port = unused_port() with log_context( logging.INFO, From 8b2642414b57cfe611fba1a65fe7b764a89f89ed Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 9 Oct 2025 14:51:55 +0200 Subject: [PATCH 58/62] clean up dynamic scheduler tracing --- .../servicelib/fastapi/http_client_thin.py | 6 +-- .../tests/fastapi/test_http_client_thin.py | 42 +++++++++++++------ .../utils/logs.py | 2 +- .../cli/_client.py | 9 +++- .../dynamic_sidecar/api_client/_thin.py | 1 - services/director/tests/unit/conftest.py | 3 +- .../services/catalog/_thin_client.py | 1 - .../services/director_v0/_thin_client.py | 1 - .../services/director_v2/_thin_client.py | 1 - 9 files changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/http_client_thin.py b/packages/service-library/src/servicelib/fastapi/http_client_thin.py index 7c2a887113ba..0a48f104d54d 100644 --- a/packages/service-library/src/servicelib/fastapi/http_client_thin.py +++ b/packages/service-library/src/servicelib/fastapi/http_client_thin.py @@ -9,7 +9,6 @@ from httpx import AsyncClient, ConnectError, HTTPError, PoolTimeout, Response from httpx._types import TimeoutTypes, URLTypes from servicelib.tracing import TracingConfig -from settings_library.tracing import TracingSettings from tenacity import RetryCallState from tenacity.asyncio import AsyncRetrying from tenacity.before_sleep import before_sleep_log @@ -201,8 +200,7 @@ def __init__( self, *, total_retry_interval: float, - tracing_settings: TracingSettings | None, - tracing_config: TracingConfig | None, + tracing_config: TracingConfig, base_url: URLTypes | None = None, default_http_client_timeout: TimeoutTypes | None = None, extra_allowed_method_names: set[str] | None = None, @@ -226,7 +224,7 @@ def __init__( client_args["timeout"] = default_http_client_timeout client = AsyncClient(**client_args) - if tracing_settings and tracing_config: + if tracing_config.tracing_enabled: setup_httpx_client_tracing(client, tracing_config=tracing_config) super().__init__(client=client) diff --git a/packages/service-library/tests/fastapi/test_http_client_thin.py b/packages/service-library/tests/fastapi/test_http_client_thin.py index 6cecb7e43467..0fc72f354ceb 100644 --- a/packages/service-library/tests/fastapi/test_http_client_thin.py +++ b/packages/service-library/tests/fastapi/test_http_client_thin.py @@ -24,6 +24,7 @@ expect_status, retry_on_errors, ) +from servicelib.tracing import TracingConfig _TIMEOUT_OVERWRITE: Final[int] = 1 @@ -71,8 +72,11 @@ def request_timeout() -> int: @pytest.fixture async def thick_client(request_timeout: int) -> AsyncIterable[FakeThickClient]: + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) async with FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) as client: yield client @@ -99,8 +103,11 @@ async def test_retry_on_errors( test_url: str, caplog_info_level: pytest.LogCaptureFixture, ) -> None: + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) with pytest.raises(ClientHttpError): @@ -125,8 +132,11 @@ async def raises_request_error(self) -> Response: request=Request(method="GET", url=test_url), ) + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) with pytest.raises(ClientHttpError): @@ -153,8 +163,11 @@ async def raises_http_error(self) -> Response: msg = "mock_http_error" raise HTTPError(msg) + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) with pytest.raises(ClientHttpError): @@ -169,9 +182,10 @@ async def public_method_ok(self) -> Response: # type: ignore """this method will be ok even if no code is used""" # OK - OKTestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None ) + OKTestClient(total_retry_interval=request_timeout, tracing_config=tracing_config) class FailWrongAnnotationTestClient(BaseThinClient): async def public_method_wrong_annotation(self) -> None: @@ -180,8 +194,7 @@ async def public_method_wrong_annotation(self) -> None: with pytest.raises(AssertionError, match="should return an instance"): FailWrongAnnotationTestClient( total_retry_interval=request_timeout, - tracing_settings=None, - tracing_config=None, + tracing_config=tracing_config, ) class FailNoAnnotationTestClient(BaseThinClient): @@ -191,8 +204,7 @@ async def public_method_no_annotation(self): with pytest.raises(AssertionError, match="should return an instance"): FailNoAnnotationTestClient( total_retry_interval=request_timeout, - tracing_settings=None, - tracing_config=None, + tracing_config=tracing_config, ) @@ -217,8 +229,11 @@ async def get_wrong_state(self) -> Response: respx_mock.get(url_get_200_ok).mock(return_value=Response(codes.OK)) respx_mock.get(get_wrong_state).mock(return_value=Response(codes.OK)) + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) test_client = ATestClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) # OK @@ -240,8 +255,11 @@ async def test_retry_timeout_overwrite( request_timeout: int, caplog_info_level: pytest.LogCaptureFixture, ) -> None: + tracing_config = TracingConfig.create( + service_name="test-client", tracing_settings=None + ) client = FakeThickClient( - total_retry_interval=request_timeout, tracing_settings=None, tracing_config=None + total_retry_interval=request_timeout, tracing_config=tracing_config ) caplog_info_level.clear() diff --git a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py index 4d753d0d2a24..e5da1b40c1ef 100644 --- a/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py +++ b/services/dask-sidecar/src/simcore_service_dask_sidecar/utils/logs.py @@ -15,7 +15,7 @@ def setup_app_logging(settings: ApplicationSettings) -> None: tracing_config = TracingConfig.create( - service_name=PROJECT_NAME, tracing_settings=None + service_name=PROJECT_NAME, tracing_settings=None # no tracing for dask sidecar ) setup_loggers( log_format_local_dev_enabled=settings.DASK_LOG_FORMAT_LOCAL_DEV_ENABLED, diff --git a/services/director-v2/src/simcore_service_director_v2/cli/_client.py b/services/director-v2/src/simcore_service_director_v2/cli/_client.py index 19328423643d..78bdfd2caa0f 100644 --- a/services/director-v2/src/simcore_service_director_v2/cli/_client.py +++ b/services/director-v2/src/simcore_service_director_v2/cli/_client.py @@ -5,17 +5,22 @@ expect_status, retry_on_errors, ) +from servicelib.tracing import TracingConfig + +from .._meta import APP_NAME class ThinDV2LocalhostClient(BaseThinClient): BASE_ADDRESS: str = "http://localhost:8000" # NOSONAR def __init__(self): + tracing_config = TracingConfig.create( + service_name=APP_NAME, tracing_settings=None + ) super().__init__( total_retry_interval=10, default_http_client_timeout=Timeout(5), - tracing_settings=None, - tracing_config=None, + tracing_config=tracing_config, ) def _get_url(self, postfix: str) -> str: diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index 3342acba2946..d40bb530a15c 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -59,7 +59,6 @@ def __init__(self, app: FastAPI): scheduler_settings.DYNAMIC_SIDECAR_API_REQUEST_TIMEOUT, connect=scheduler_settings.DYNAMIC_SIDECAR_API_CONNECT_TIMEOUT, ), - tracing_settings=tracing_settings, tracing_config=tracing_config, ) diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 62ff5cee8f31..ad60821585bd 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -15,6 +15,7 @@ from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.tracing import TracingConfig from settings_library.docker_registry import RegistrySettings +from simcore_service_director._meta import APP_NAME from simcore_service_director.core.application import create_app from simcore_service_director.core.settings import ApplicationSettings @@ -165,7 +166,7 @@ async def app( app_settings: ApplicationSettings, is_pdb_enabled: bool ) -> AsyncIterator[FastAPI]: tracing_config = TracingConfig.create( - service_name="director", tracing_settings=None # disable tracing in tests + service_name=APP_NAME, tracing_settings=None # disable tracing in tests ) the_test_app = create_app(settings=app_settings, tracing_config=tracing_config) async with LifespanManager( diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py index 4bafaaed53d1..3d845d26946c 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/catalog/_thin_client.py @@ -35,7 +35,6 @@ def __init__(self, app: FastAPI) -> None: "set_to_app_state", }, base_url=settings.DYNAMIC_SCHEDULER_CATALOG_SETTINGS.api_base_url, - tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, tracing_config=get_tracing_config(app), ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py index 900873cd1701..442b0205d612 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v0/_thin_client.py @@ -37,7 +37,6 @@ def __init__(self, app: FastAPI) -> None: "set_to_app_state", }, base_url=settings.DYNAMIC_SCHEDULER_DIRECTOR_V0_SETTINGS.endpoint, - tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, tracing_config=get_tracing_config(app), ) diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py index 47b733cb75d2..884972c5b878 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py @@ -42,7 +42,6 @@ def __init__(self, app: FastAPI) -> None: DEFAULT_LEGACY_WB_TO_DV2_HTTP_REQUESTS_TIMEOUT_S ), extra_allowed_method_names={"attach_lifespan_to"}, - tracing_settings=settings.DYNAMIC_SCHEDULER_TRACING, tracing_config=get_tracing_config(app), ) From e1256322b31d234ed978a7dabc6955bf72611523 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 9 Oct 2025 14:54:55 +0200 Subject: [PATCH 59/62] TRACING_SAMPLING_PROBABILITY -> TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY --- .env-devel | 2 +- packages/service-library/src/servicelib/tracing.py | 4 +++- .../service-library/tests/aiohttp/test_tracing.py | 12 +++++++----- .../service-library/tests/fastapi/test_tracing.py | 12 +++++++----- .../settings-library/src/settings_library/tracing.py | 2 +- services/docker-compose.yml | 4 ++-- 6 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.env-devel b/.env-devel index aa83fcdab41d..9980683c0637 100644 --- a/.env-devel +++ b/.env-devel @@ -377,7 +377,7 @@ TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE=2 TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT=http://opentelemetry-collector TRACING_OPENTELEMETRY_COLLECTOR_EXPORTER_ENDPOINT=http://jaeger:4318 TRACING_OPENTELEMETRY_COLLECTOR_PORT=4318 -TRACING_SAMPLING_PROBABILITY=1.0 +TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY=1.0 TRAEFIK_SIMCORE_ZONE=internal_simcore_stack TRASH_RETENTION_DAYS=7 TWILIO_ACCOUNT_SID=DUMMY diff --git a/packages/service-library/src/servicelib/tracing.py b/packages/service-library/src/servicelib/tracing.py index 4e59e07ea8f2..a7513391e992 100644 --- a/packages/service-library/src/servicelib/tracing.py +++ b/packages/service-library/src/servicelib/tracing.py @@ -67,7 +67,9 @@ def create( if tracing_settings: resource = Resource(attributes={"service.name": service_name}) sampler = ParentBased( - root=TraceIdRatioBased(tracing_settings.TRACING_SAMPLING_PROBABILITY) + root=TraceIdRatioBased( + tracing_settings.TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY + ) ) tracer_provider = TracerProvider(resource=resource, sampler=sampler) return cls( diff --git a/packages/service-library/tests/aiohttp/test_tracing.py b/packages/service-library/tests/aiohttp/test_tracing.py index 857d747f168d..199cb7e9fe57 100644 --- a/packages/service-library/tests/aiohttp/test_tracing.py +++ b/packages/service-library/tests/aiohttp/test_tracing.py @@ -44,14 +44,16 @@ def set_and_clean_settings_env_vars( sampling_probability_mocked = False if tracing_settings_in[2]: sampling_probability_mocked = True - monkeypatch.setenv("TRACING_SAMPLING_PROBABILITY", tracing_settings_in[2]) + monkeypatch.setenv( + "TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY", tracing_settings_in[2] + ) yield if endpoint_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT") if port_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_PORT") if sampling_probability_mocked: - monkeypatch.delenv("TRACING_SAMPLING_PROBABILITY") + monkeypatch.delenv("TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY") @pytest.mark.parametrize( @@ -216,14 +218,14 @@ async def handler(handler_data: dict, request: web.Request) -> web.Response: ], indirect=True, ) -async def test_tracing_sampling_probability_effective( +async def test_TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY_effective( mock_otel_collector: InMemorySpanExporter, aiohttp_client: Callable, set_and_clean_settings_env_vars: Callable[[], None], tracing_settings_in, ): """ - This test checks that the TRACING_SAMPLING_PROBABILITY setting in TracingSettings + This test checks that the TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY setting in TracingSettings is effective by sending 1000 requests and verifying that the number of collected traces is close to 0.05 * 1000 (with some tolerance). """ @@ -254,7 +256,7 @@ async def handler(request: web.Request) -> web.Response: } n_traces = len(trace_ids) expected_num_traces = int( - tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests + tracing_settings.TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY * n_requests ) tolerance = int(tolerance_probability * expected_num_traces) assert ( diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index e15bd219dc6f..37f53e6ea98f 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -59,14 +59,16 @@ def set_and_clean_settings_env_vars( sampling_probability_mocked = False if tracing_settings_in[2]: sampling_probability_mocked = True - monkeypatch.setenv("TRACING_SAMPLING_PROBABILITY", f"{tracing_settings_in[2]}") + monkeypatch.setenv( + "TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY", f"{tracing_settings_in[2]}" + ) yield if endpoint_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT") if port_mocked: monkeypatch.delenv("TRACING_OPENTELEMETRY_COLLECTOR_PORT") if sampling_probability_mocked: - monkeypatch.delenv("TRACING_SAMPLING_PROBABILITY") + monkeypatch.delenv("TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY") @pytest.mark.parametrize( @@ -313,14 +315,14 @@ async def handler(handler_data: dict): ], indirect=True, ) -async def test_tracing_sampling_probability_effective( +async def test_TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY_effective( mock_otel_collector: InMemorySpanExporter, mocked_app: FastAPI, set_and_clean_settings_env_vars: Callable[[], None], tracing_settings_in: Callable[[], dict[str, Any]], ): """ - This test checks that the TRACING_SAMPLING_PROBABILITY setting in TracingSettings + This test checks that the TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY setting in TracingSettings is effective by sending 1000 requests and verifying that the number of collected traces is close to 0.05 * 1000 (with some tolerance). """ @@ -353,7 +355,7 @@ async def handler(): } n_traces = len(trace_ids) expected_num_traces = int( - tracing_settings.TRACING_SAMPLING_PROBABILITY * n_requests + tracing_settings.TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY * n_requests ) # Allow a 50% tolerance due to randomness tolerance = int(tolerance_probability * expected_num_traces) diff --git a/packages/settings-library/src/settings_library/tracing.py b/packages/settings-library/src/settings_library/tracing.py index f2d9ab5da554..adafd7883733 100644 --- a/packages/settings-library/src/settings_library/tracing.py +++ b/packages/settings-library/src/settings_library/tracing.py @@ -15,7 +15,7 @@ class TracingSettings(BaseCustomSettings): TRACING_OPENTELEMETRY_COLLECTOR_PORT: Annotated[ RegisteredPortInt, Field(description="Opentelemetry compatible collector port") ] - TRACING_SAMPLING_PROBABILITY: Annotated[ + TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY: Annotated[ float, Field(description="Probability of sampling traces (0.0 - 1.0)", ge=0.0, le=1.0), ] diff --git a/services/docker-compose.yml b/services/docker-compose.yml index e623b0e770db..b89d5b62e9f5 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -10,7 +10,7 @@ x-tracing-open-telemetry: &tracing_open_telemetry_environs TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT: ${TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT} TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE: ${TRACING_OPENTELEMETRY_COLLECTOR_BATCH_SIZE} TRACING_OPENTELEMETRY_COLLECTOR_PORT: ${TRACING_OPENTELEMETRY_COLLECTOR_PORT} - TRACING_SAMPLING_PROBABILITY: ${TRACING_SAMPLING_PROBABILITY} + TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY: ${TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY} x-webserver-diagnostics: &webserver_diagnostics_environs DIAGNOSTICS_HEALTHCHECK_ENABLED: ${DIAGNOSTICS_HEALTHCHECK_ENABLED} @@ -1507,7 +1507,7 @@ services: - "--tracing.addinternals" - "--tracing.otlp=true" - "--tracing.otlp.http=true" - - "--tracing.sampleRate=${TRACING_SAMPLING_PROBABILITY}" + - "--tracing.sampleRate=${TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY}" healthcheck: # NOTE: this healthcheck to check if traefik is up and running must be run on the ping entrypoint defined in command! test: traefik healthcheck --ping --ping.entryPoint=ping --entryPoints.ping.address=:9082 From 15afd8eb895036dfd480d86ca166c153c171e46d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 9 Oct 2025 15:11:08 +0200 Subject: [PATCH 60/62] add fixme --- packages/service-library/src/servicelib/aiohttp/tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-library/src/servicelib/aiohttp/tracing.py b/packages/service-library/src/servicelib/aiohttp/tracing.py index 6fc51c054298..e2c75aa85de5 100644 --- a/packages/service-library/src/servicelib/aiohttp/tracing.py +++ b/packages/service-library/src/servicelib/aiohttp/tracing.py @@ -80,7 +80,7 @@ async def aiohttp_server_opentelemetry_middleware(request: web.Request, handler): """This middleware is extracted from https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py and adapted to allow passing the tracer provider via the app instead of using the global object. The original code for the function is licensed under https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/LICENSE. - I have recorded this limitation in the official source here: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3801 and plan on providing a fix soon. + FIXME: I have recorded this limitation in the official source here: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3801 and plan on providing a fix soon. """ span_name, additional_attributes = get_default_span_details(request) From 92815f2d9382a449d16cfdcbda3425258e5aa5e7 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 9 Oct 2025 15:12:23 +0200 Subject: [PATCH 61/62] fix typo --- packages/service-library/tests/fastapi/test_tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 37f53e6ea98f..32b199cee263 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -331,7 +331,7 @@ async def test_TRACING_OPENTELEMETRY_SAMPLING_PROBABILITY_effective( tracing_settings = TracingSettings() tracing_config = TracingConfig.create( - tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest" + tracing_settings=tracing_settings, service_name="Mock-OpenTelemetry-Pytest" ) async def handler(): From d41d64d0ee45f7ad495349601b3df69a0e966234 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 9 Oct 2025 15:48:06 +0200 Subject: [PATCH 62/62] make pylint happy --- .../modules/dynamic_sidecar/api_client/_thin.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py index d40bb530a15c..2abe3f23dd64 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_thin.py @@ -13,7 +13,6 @@ retry_on_errors, ) from servicelib.fastapi.tracing import get_tracing_config -from settings_library.tracing import TracingSettings from ....core.dynamic_services_settings.scheduler import ( DynamicServicesSchedulerSettings, @@ -33,9 +32,6 @@ def __init__(self, app: FastAPI): scheduler_settings: DynamicServicesSchedulerSettings = ( app.state.settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER ) - tracing_settings: TracingSettings | None = ( - app.state.settings.DIRECTOR_V2_TRACING - ) tracing_config = get_tracing_config(app) # timeouts