Skip to content

Commit 85300eb

Browse files
committed
instrument httpx clients in api-server
1 parent 89b3e44 commit 85300eb

File tree

7 files changed

+37
-13
lines changed

7 files changed

+37
-13
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66

77
from fastapi import FastAPI
8+
from httpx import AsyncClient, Client
89
from opentelemetry import trace
910
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
1011
OTLPSpanExporter as OTLPSpanExporterHTTP,
@@ -84,9 +85,8 @@ def setup_tracing(
8485
otlp_exporter = OTLPSpanExporterHTTP(endpoint=tracing_destination)
8586
span_processor = BatchSpanProcessor(otlp_exporter)
8687
global_tracer_provider.add_span_processor(span_processor)
87-
# Instrument FastAPI and all httpx clients
88+
# Instrument FastAPI
8889
FastAPIInstrumentor().instrument_app(app)
89-
HTTPXClientInstrumentor().instrument()
9090

9191
if HAS_AIOPG:
9292
with log_context(
@@ -123,3 +123,7 @@ def setup_tracing(
123123
msg="Attempting to add requests opentelemetry autoinstrumentation...",
124124
):
125125
RequestsInstrumentor().instrument()
126+
127+
128+
def setup_httpx_client_tracing(client: AsyncClient | Client):
129+
HTTPXClientInstrumentor.instrument_client(client)

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,22 @@ def init_app(settings: ApplicationSettings | None = None) -> FastAPI:
8282

8383
setup_rabbitmq(app)
8484

85-
if settings.API_SERVER_WEBSERVER:
86-
webserver.setup(app, settings.API_SERVER_WEBSERVER)
85+
add_tracing = False
8786
if app.state.settings.API_SERVER_TRACING:
87+
add_tracing = True
8888
setup_tracing(app, app.state.settings.API_SERVER_TRACING, APP_NAME)
8989

90+
if settings.API_SERVER_WEBSERVER:
91+
webserver.setup(app, settings.API_SERVER_WEBSERVER, add_tracing=add_tracing)
92+
9093
if settings.API_SERVER_CATALOG:
91-
catalog.setup(app, settings.API_SERVER_CATALOG)
94+
catalog.setup(app, settings.API_SERVER_CATALOG, add_tracing=add_tracing)
9295

9396
if settings.API_SERVER_STORAGE:
94-
storage.setup(app, settings.API_SERVER_STORAGE)
97+
storage.setup(app, settings.API_SERVER_STORAGE, add_tracing=add_tracing)
9598

9699
if settings.API_SERVER_DIRECTOR_V2:
97-
director_v2.setup(app, settings.API_SERVER_DIRECTOR_V2)
100+
director_v2.setup(app, settings.API_SERVER_DIRECTOR_V2, add_tracing=add_tracing)
98101

99102
# setup app
100103
app.add_event_handler("startup", create_start_app_handler(app))

services/api-server/src/simcore_service_api_server/services/catalog.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,14 @@ async def get_latest_release(
209209
# MODULES APP SETUP -------------------------------------------------------------
210210

211211

212-
def setup(app: FastAPI, settings: CatalogSettings) -> None:
212+
def setup(app: FastAPI, settings: CatalogSettings, add_tracing: bool = False) -> None:
213213
if not settings:
214214
settings = CatalogSettings()
215215

216216
setup_client_instance(
217-
app, CatalogApi, api_baseurl=settings.api_base_url, service_name="catalog"
217+
app,
218+
CatalogApi,
219+
api_baseurl=settings.api_base_url,
220+
service_name="catalog",
221+
add_tracing=add_tracing,
218222
)

services/api-server/src/simcore_service_api_server/services/director_v2.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,14 @@ async def get_computation_logs(
191191
# MODULES APP SETUP -------------------------------------------------------------
192192

193193

194-
def setup(app: FastAPI, settings: DirectorV2Settings) -> None:
194+
def setup(
195+
app: FastAPI, settings: DirectorV2Settings, add_tracing: bool = False
196+
) -> None:
195197
setup_client_instance(
196198
app,
197199
DirectorV2Api,
198200
# WARNING: it has /v0 and /v2 prefixes
199201
api_baseurl=settings.base_url,
200202
service_name="director_v2",
203+
add_tracing=add_tracing,
201204
)

services/api-server/src/simcore_service_api_server/services/storage.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,16 @@ async def create_soft_link(
209209
# MODULES APP SETUP -------------------------------------------------------------
210210

211211

212-
def setup(app: FastAPI, settings: StorageSettings) -> None:
212+
def setup(app: FastAPI, settings: StorageSettings, add_tracing: bool = False) -> None:
213213
if not settings:
214214
settings = StorageSettings()
215215

216216
setup_client_instance(
217-
app, StorageApi, api_baseurl=settings.api_base_url, service_name="storage"
217+
app,
218+
StorageApi,
219+
api_baseurl=settings.api_base_url,
220+
service_name="storage",
221+
add_tracing=add_tracing,
218222
)
219223

220224

services/api-server/src/simcore_service_api_server/services/webserver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,19 +588,21 @@ async def get_service_pricing_plan(
588588
# MODULES APP SETUP -------------------------------------------------------------
589589

590590

591-
def setup(app: FastAPI, settings: WebServerSettings) -> None:
591+
def setup(app: FastAPI, settings: WebServerSettings, add_tracing: bool = False) -> None:
592592

593593
setup_client_instance(
594594
app,
595595
WebserverApi,
596596
api_baseurl=settings.api_base_url,
597597
service_name="webserver",
598+
add_tracing=add_tracing,
598599
)
599600
setup_client_instance(
600601
app,
601602
LongRunningTasksClient,
602603
api_baseurl="",
603604
service_name="long_running_tasks_client",
605+
add_tracing=add_tracing,
604606
)
605607

606608
def _on_startup() -> None:

services/api-server/src/simcore_service_api_server/utils/client_base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import httpx
55
from fastapi import FastAPI
66
from httpx import AsyncClient
7+
from servicelib.fastapi.tracing import setup_httpx_client_tracing
78

89
from .app_data import AppDataMixin
910

@@ -43,6 +44,7 @@ def setup_client_instance(
4344
api_cls: type[BaseServiceClientApi],
4445
api_baseurl,
4546
service_name: str,
47+
add_tracing: bool = False,
4648
**extra_fields,
4749
) -> None:
4850
"""Helper to add init/cleanup of ServiceClientApi instances in the app lifespam"""
@@ -51,6 +53,8 @@ def setup_client_instance(
5153

5254
# NOTE: this term is mocked in tests. If you need to modify pay attention to the mock
5355
client = AsyncClient(base_url=api_baseurl)
56+
if add_tracing:
57+
setup_httpx_client_tracing(client)
5458

5559
# events
5660
def _create_instance() -> None:

0 commit comments

Comments
 (0)