Skip to content

Commit 673f113

Browse files
Merge branch 'master' into introduce-comp-runs-tasks-snapshot
2 parents 6085d15 + da1e85f commit 673f113

File tree

22 files changed

+154
-53
lines changed

22 files changed

+154
-53
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ def _startup(tracing_settings: TracingSettings, service_name: str) -> None:
101101
span_processor = BatchSpanProcessor(otlp_exporter)
102102
global_tracer_provider.add_span_processor(span_processor)
103103

104-
FastAPIInstrumentor().instrument()
105104
if HAS_AIOPG:
106105
with log_context(
107106
_logger,
@@ -181,14 +180,18 @@ def _shutdown() -> None:
181180
_logger.exception("Failed to uninstrument RequestsInstrumentor")
182181

183182

183+
def initialize_fastapi_app_tracing(app: FastAPI):
184+
FastAPIInstrumentor.instrument_app(app)
185+
186+
184187
def setup_httpx_client_tracing(client: AsyncClient | Client):
185188
HTTPXClientInstrumentor.instrument_client(client)
186189

187190

188191
def setup_tracing(
189192
app: FastAPI, tracing_settings: TracingSettings, service_name: str
190193
) -> None:
191-
194+
# NOTE: This does not instrument the app itself. Call setup_fastapi_app_tracing to do that.
192195
_startup(tracing_settings=tracing_settings, service_name=service_name)
193196

194197
def _on_shutdown() -> None:
@@ -200,7 +203,7 @@ def _on_shutdown() -> None:
200203
def get_tracing_instrumentation_lifespan(
201204
tracing_settings: TracingSettings, service_name: str
202205
):
203-
206+
# NOTE: This lifespan does not instrument the app itself. Call setup_fastapi_app_tracing to do that.
204207
_startup(tracing_settings=tracing_settings, service_name=service_name)
205208

206209
async def tracing_instrumentation_lifespan(

packages/service-library/src/servicelib/file_utils.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import asyncio
22
import hashlib
33
import shutil
4+
from collections.abc import Iterator
45
from contextlib import contextmanager
56
from logging import Logger
67
from pathlib import Path
7-
from typing import Final, Iterator, Protocol
8+
from typing import Final, Protocol
89

910
# https://docs.python.org/3/library/shutil.html#shutil.rmtree
1011
# https://docs.python.org/3/library/os.html#os.remove
@@ -13,11 +14,13 @@
1314
from pydantic import ByteSize, TypeAdapter
1415

1516
CHUNK_4KB: Final[ByteSize] = TypeAdapter(ByteSize).validate_python("4kb") # 4K blocks
17+
CHUNK_8MB: Final[ByteSize] = TypeAdapter(ByteSize).validate_python(
18+
"8MiB"
19+
) # 8mIB blocks
1620

1721

1822
class AsyncStream(Protocol):
19-
async def read(self, size: int = -1) -> bytes:
20-
...
23+
async def read(self, size: int = -1) -> bytes: ...
2124

2225

2326
_shutil_rmtree = sync_to_async(shutil.rmtree)
@@ -45,7 +48,7 @@ async def remove_directory(
4548

4649

4750
async def create_sha256_checksum(
48-
async_stream: AsyncStream, *, chunk_size: ByteSize = CHUNK_4KB
51+
async_stream: AsyncStream, *, chunk_size: ByteSize = CHUNK_8MB
4952
) -> str:
5053
"""
5154
Usage:

packages/simcore-sdk/src/simcore_sdk/node_ports_common/filemanager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ async def _generate_checksum(
291291
return checksum
292292
if isinstance(path_to_upload, Path):
293293
async with aiofiles.open(path_to_upload, mode="rb") as f:
294-
checksum = SHA256Str(await create_sha256_checksum(f))
294+
checksum = await create_sha256_checksum(f)
295295
elif isinstance(path_to_upload, UploadableFileObject):
296296
checksum = path_to_upload.sha256_checksum
297297
return checksum

packages/simcore-sdk/tests/integration/conftest.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def _assign_config(
337337
@pytest.fixture
338338
async def r_clone_settings_factory(
339339
minio_s3_settings: S3Settings, storage_service: URL
340-
) -> Awaitable[RCloneSettings]:
340+
) -> Callable[[], Awaitable[RCloneSettings]]:
341341
async def _factory() -> RCloneSettings:
342342
settings = RCloneSettings(
343343
R_CLONE_S3=minio_s3_settings, R_CLONE_PROVIDER=S3Provider.MINIO
@@ -347,35 +347,35 @@ async def _factory() -> RCloneSettings:
347347

348348
return settings
349349

350-
return _factory()
350+
return _factory
351351

352352

353353
@pytest.fixture
354354
async def aws_s3_cli_settings_factory(
355355
minio_s3_settings: S3Settings, storage_service: URL
356-
) -> Awaitable[AwsS3CliSettings]:
356+
) -> Callable[[], Awaitable[AwsS3CliSettings]]:
357357
async def _factory() -> AwsS3CliSettings:
358358
settings = AwsS3CliSettings(AWS_S3_CLI_S3=minio_s3_settings)
359359
if not await is_aws_s3_cli_available(settings):
360360
pytest.skip("aws cli not installed")
361361

362362
return settings
363363

364-
return _factory()
364+
return _factory
365365

366366

367367
@pytest.fixture
368368
async def r_clone_settings(
369-
r_clone_settings_factory: Awaitable[RCloneSettings],
369+
r_clone_settings_factory: Callable[[], Awaitable[RCloneSettings]],
370370
) -> RCloneSettings:
371-
return await r_clone_settings_factory
371+
return await r_clone_settings_factory()
372372

373373

374374
@pytest.fixture
375375
async def aws_s3_cli_settings(
376-
aws_s3_cli_settings_factory: Awaitable[AwsS3CliSettings],
376+
aws_s3_cli_settings_factory: Callable[[], Awaitable[AwsS3CliSettings]],
377377
) -> AwsS3CliSettings:
378-
return await aws_s3_cli_settings_factory
378+
return await aws_s3_cli_settings_factory()
379379

380380

381381
@pytest.fixture

packages/simcore-sdk/tests/integration/test_node_ports_common_filemanager.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,17 @@ class _SyncSettings(BaseModel):
5656
"Both RClone and AwsS3Cli disabled",
5757
],
5858
)
59-
def optional_sync_settings(
60-
r_clone_settings: RCloneSettings,
61-
aws_s3_cli_settings: AwsS3CliSettings,
59+
async def optional_sync_settings(
60+
r_clone_settings_factory: Callable[[], Awaitable[RCloneSettings]],
61+
aws_s3_cli_settings_factory: Callable[[], Awaitable[AwsS3CliSettings]],
6262
request: pytest.FixtureRequest,
6363
) -> _SyncSettings:
6464
_rclone_enabled, _aws_s3_cli_enabled = request.param
6565

66-
_r_clone_settings = r_clone_settings if _rclone_enabled else None
67-
_aws_s3_cli_settings = aws_s3_cli_settings if _aws_s3_cli_enabled else None
66+
_r_clone_settings = await r_clone_settings_factory() if _rclone_enabled else None
67+
_aws_s3_cli_settings = (
68+
await aws_s3_cli_settings_factory() if _aws_s3_cli_enabled else None
69+
)
6870

6971
return _SyncSettings(
7072
r_clone_settings=_r_clone_settings, aws_s3_cli_settings=_aws_s3_cli_settings

packages/simcore-sdk/tests/integration/test_node_ports_v2_nodeports2.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import pytest
2222
import sqlalchemy as sa
2323
from faker import Faker
24-
from models_library.projects import ProjectIDStr
2524
from models_library.projects_nodes_io import (
2625
BaseFileLink,
2726
DownloadLink,
@@ -156,10 +155,10 @@ def config_value_symlink_path(symlink_path: Path) -> dict[str, Any]:
156155

157156
@pytest.fixture(params=[True, False])
158157
async def option_r_clone_settings(
159-
request, r_clone_settings_factory: Awaitable[RCloneSettings]
158+
request, r_clone_settings_factory: Callable[[], Awaitable[RCloneSettings]]
160159
) -> RCloneSettings | None:
161160
if request.param:
162-
return await r_clone_settings_factory
161+
return await r_clone_settings_factory()
163162
return None
164163

165164

@@ -174,7 +173,7 @@ async def test_default_configuration(
174173
await check_config_valid(
175174
await node_ports_v2.ports(
176175
user_id=user_id,
177-
project_id=ProjectIDStr(project_id),
176+
project_id=project_id,
178177
node_uuid=node_uuid,
179178
r_clone_settings=option_r_clone_settings,
180179
),
@@ -192,7 +191,7 @@ async def test_invalid_ports(
192191
config_dict, _, _ = create_special_configuration()
193192
PORTS = await node_ports_v2.ports(
194193
user_id=user_id,
195-
project_id=ProjectIDStr(project_id),
194+
project_id=project_id,
196195
node_uuid=node_uuid,
197196
r_clone_settings=option_r_clone_settings,
198197
)
@@ -238,7 +237,7 @@ async def test_port_value_accessors(
238237

239238
PORTS = await node_ports_v2.ports(
240239
user_id=user_id,
241-
project_id=ProjectIDStr(project_id),
240+
project_id=project_id,
242241
node_uuid=node_uuid,
243242
r_clone_settings=option_r_clone_settings,
244243
)
@@ -298,7 +297,7 @@ async def test_port_file_accessors(
298297

299298
PORTS = await node_ports_v2.ports(
300299
user_id=user_id,
301-
project_id=ProjectIDStr(project_id),
300+
project_id=project_id,
302301
node_uuid=node_uuid,
303302
r_clone_settings=option_r_clone_settings,
304303
)
@@ -375,7 +374,7 @@ async def test_adding_new_ports(
375374
config_dict, project_id, node_uuid = create_special_configuration()
376375
PORTS = await node_ports_v2.ports(
377376
user_id=user_id,
378-
project_id=ProjectIDStr(project_id),
377+
project_id=project_id,
379378
node_uuid=node_uuid,
380379
r_clone_settings=option_r_clone_settings,
381380
)
@@ -429,7 +428,7 @@ async def test_removing_ports(
429428
) # pylint: disable=W0612
430429
PORTS = await node_ports_v2.ports(
431430
user_id=user_id,
432-
project_id=ProjectIDStr(project_id),
431+
project_id=project_id,
433432
node_uuid=node_uuid,
434433
r_clone_settings=option_r_clone_settings,
435434
)
@@ -489,7 +488,7 @@ async def test_get_value_from_previous_node(
489488

490489
PORTS = await node_ports_v2.ports(
491490
user_id=user_id,
492-
project_id=ProjectIDStr(project_id),
491+
project_id=project_id,
493492
node_uuid=node_uuid,
494493
r_clone_settings=option_r_clone_settings,
495494
)
@@ -541,7 +540,7 @@ async def test_get_file_from_previous_node(
541540
)
542541
PORTS = await node_ports_v2.ports(
543542
user_id=user_id,
544-
project_id=ProjectIDStr(project_id),
543+
project_id=project_id,
545544
node_uuid=node_uuid,
546545
r_clone_settings=option_r_clone_settings,
547546
)
@@ -598,7 +597,7 @@ async def test_get_file_from_previous_node_with_mapping_of_same_key_name(
598597
)
599598
PORTS = await node_ports_v2.ports(
600599
user_id=user_id,
601-
project_id=ProjectIDStr(project_id),
600+
project_id=project_id,
602601
node_uuid=node_uuid,
603602
r_clone_settings=option_r_clone_settings,
604603
)
@@ -659,7 +658,7 @@ async def test_file_mapping(
659658
)
660659
PORTS = await node_ports_v2.ports(
661660
user_id=user_id,
662-
project_id=ProjectIDStr(project_id),
661+
project_id=project_id,
663662
node_uuid=node_uuid,
664663
r_clone_settings=option_r_clone_settings,
665664
)
@@ -752,7 +751,7 @@ async def test_regression_concurrent_port_update_fails(
752751

753752
PORTS = await node_ports_v2.ports(
754753
user_id=user_id,
755-
project_id=ProjectIDStr(project_id),
754+
project_id=project_id,
756755
node_uuid=node_uuid,
757756
r_clone_settings=option_r_clone_settings,
758757
)
@@ -841,7 +840,7 @@ async def test_batch_update_inputs_outputs(
841840

842841
PORTS = await node_ports_v2.ports(
843842
user_id=user_id,
844-
project_id=ProjectIDStr(project_id),
843+
project_id=project_id,
845844
node_uuid=node_uuid,
846845
r_clone_settings=option_r_clone_settings,
847846
)

services/agent/src/simcore_service_agent/core/application.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
get_common_oas_options,
66
override_fastapi_openapi_method,
77
)
8-
from servicelib.fastapi.tracing import setup_tracing
8+
from servicelib.fastapi.tracing import (
9+
initialize_fastapi_app_tracing,
10+
setup_tracing,
11+
)
912
from servicelib.logging_utils import config_all_loggers
1013

1114
from .._meta import (
@@ -66,6 +69,9 @@ def create_app() -> FastAPI:
6669
setup_rest_api(app)
6770
setup_rpc_api_routes(app)
6871

72+
if settings.AGENT_TRACING:
73+
initialize_fastapi_app_tracing(app)
74+
6975
async def _on_startup() -> None:
7076
print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201
7177

services/api-server/src/simcore_service_api_server/core/application.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
from models_library.basic_types import BootModeEnum
66
from packaging.version import Version
77
from servicelib.fastapi.profiler import initialize_profiler
8-
from servicelib.fastapi.tracing import setup_tracing
8+
from servicelib.fastapi.tracing import (
9+
initialize_fastapi_app_tracing,
10+
setup_tracing,
11+
)
912
from servicelib.logging_utils import config_all_loggers
1013

1114
from .. import exceptions
@@ -93,6 +96,9 @@ def init_app(settings: ApplicationSettings | None = None) -> FastAPI:
9396
if app.state.settings.API_SERVER_PROMETHEUS_INSTRUMENTATION_ENABLED:
9497
setup_prometheus_instrumentation(app)
9598

99+
if settings.API_SERVER_TRACING:
100+
initialize_fastapi_app_tracing(app)
101+
96102
if settings.API_SERVER_WEBSERVER:
97103
webserver.setup(
98104
app,

services/autoscaling/src/simcore_service_autoscaling/core/application.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import logging
22

33
from fastapi import FastAPI
4-
from servicelib.fastapi.tracing import setup_tracing
4+
from servicelib.fastapi.tracing import (
5+
initialize_fastapi_app_tracing,
6+
setup_tracing,
7+
)
58

69
from .._meta import (
710
API_VERSION,
@@ -71,6 +74,9 @@ def create_app(settings: ApplicationSettings) -> FastAPI:
7174
setup_ssm(app)
7275
setup_redis(app)
7376

77+
if app.state.settings.AUTOSCALING_TRACING:
78+
initialize_fastapi_app_tracing(app)
79+
7480
setup_auto_scaler_background_task(app)
7581
setup_buffer_machines_pool_task(app)
7682

services/catalog/src/simcore_service_catalog/core/application.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
setup_prometheus_instrumentation,
99
)
1010
from servicelib.fastapi.openapi import override_fastapi_openapi_method
11-
from servicelib.fastapi.tracing import setup_tracing
11+
from servicelib.fastapi.tracing import (
12+
initialize_fastapi_app_tracing,
13+
setup_tracing,
14+
)
1215
from starlette.middleware.base import BaseHTTPMiddleware
1316

1417
from .._meta import (
@@ -68,6 +71,9 @@ def create_app() -> FastAPI:
6871
if settings.CATALOG_PROMETHEUS_INSTRUMENTATION_ENABLED:
6972
setup_prometheus_instrumentation(app)
7073

74+
if settings.CATALOG_TRACING:
75+
initialize_fastapi_app_tracing(app)
76+
7177
if settings.SC_BOOT_MODE != BootModeEnum.PRODUCTION:
7278
# middleware to time requests (ONLY for development)
7379
app.add_middleware(

0 commit comments

Comments
 (0)