Skip to content

Commit b6e58b4

Browse files
committed
update bootstrapping
1 parent f2d038b commit b6e58b4

File tree

6 files changed

+138
-100
lines changed

6 files changed

+138
-100
lines changed

app/application.py

+12-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import dataclasses
2+
13
import fastapi
24
import modern_di_fastapi
35
from advanced_alchemy.exceptions import DuplicateKeyError
4-
from lite_bootstrap import FastAPIBootstrapper, FastAPIConfig
6+
from lite_bootstrap import FastAPIBootstrapper
7+
from opentelemetry.instrumentation.asyncpg import AsyncPGInstrumentor
8+
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
59

610
from app import exceptions
711
from app.api.decks import ROUTER
@@ -13,22 +17,14 @@ def include_routers(app: fastapi.FastAPI) -> None:
1317

1418

1519
def build_app() -> fastapi.FastAPI:
16-
bootstrapper = FastAPIBootstrapper(
17-
bootstrap_config=FastAPIConfig(
18-
service_name=settings.service_name,
19-
service_version=settings.service_version,
20-
service_environment=settings.service_environment,
21-
service_debug=settings.service_debug,
22-
opentelemetry_endpoint=settings.opentelemetry_endpoint,
23-
sentry_dsn=settings.sentry_dsn,
24-
cors_allowed_origins=settings.cors_allowed_origins,
25-
cors_allowed_methods=settings.cors_allowed_methods,
26-
cors_allowed_headers=settings.cors_allowed_headers,
27-
cors_exposed_headers=settings.cors_exposed_headers,
28-
logging_buffer_capacity=settings.logging_buffer_capacity,
29-
swagger_offline_docs=settings.swagger_offline_docs,
30-
),
20+
bootstrap_config = dataclasses.replace(
21+
settings.api_bootstrapper_config,
22+
opentelemetry_instrumentors=[
23+
SQLAlchemyInstrumentor(),
24+
AsyncPGInstrumentor(capture_parameters=True), # type: ignore[no-untyped-call]
25+
],
3126
)
27+
bootstrapper = FastAPIBootstrapper(bootstrap_config=bootstrap_config)
3228
app: fastapi.FastAPI = bootstrapper.bootstrap()
3329
modern_di_fastapi.setup_di(app)
3430
include_routers(app)

app/resources/db.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
async def create_sa_engine() -> typing.AsyncIterator[sa.AsyncEngine]:
1313
logger.info("Initializing SQLAlchemy engine")
1414
engine = sa.create_async_engine(
15-
url=settings.db_dsn,
15+
url=settings.db_dsn_parsed,
1616
echo=settings.service_debug,
1717
echo_pool=settings.service_debug,
1818
pool_size=settings.db_pool_size,

app/settings.py

+21-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pydantic_settings
2-
from sqlalchemy.engine.url import URL
2+
from lite_bootstrap import FastAPIConfig
3+
from sqlalchemy.engine.url import URL, make_url
34

45

56
class Settings(pydantic_settings.BaseSettings):
@@ -9,13 +10,7 @@ class Settings(pydantic_settings.BaseSettings):
910
service_debug: bool = False
1011
log_level: str = "info"
1112

12-
db_driver: str = "postgresql+asyncpg"
13-
db_host: str = "db"
14-
db_port: int = 5432
15-
db_user: str = "postgres"
16-
db_password: str = "password"
17-
db_database: str = "postgres"
18-
13+
db_dsn: str = "postgresql+asyncpg://postgres:password@db/postgres"
1914
db_pool_size: int = 5
2015
db_max_overflow: int = 0
2116
db_echo: bool = False
@@ -34,14 +29,24 @@ class Settings(pydantic_settings.BaseSettings):
3429
cors_exposed_headers: list[str] = []
3530

3631
@property
37-
def db_dsn(self) -> URL:
38-
return URL.create(
39-
self.db_driver,
40-
self.db_user,
41-
self.db_password,
42-
self.db_host,
43-
self.db_port,
44-
self.db_database,
32+
def db_dsn_parsed(self) -> URL:
33+
return make_url(self.db_dsn)
34+
35+
@property
36+
def api_bootstrapper_config(self) -> FastAPIConfig:
37+
return FastAPIConfig(
38+
service_name=settings.service_name,
39+
service_version=settings.service_version,
40+
service_environment=settings.service_environment,
41+
service_debug=settings.service_debug,
42+
opentelemetry_endpoint=settings.opentelemetry_endpoint,
43+
sentry_dsn=settings.sentry_dsn,
44+
cors_allowed_origins=settings.cors_allowed_origins,
45+
cors_allowed_methods=settings.cors_allowed_methods,
46+
cors_allowed_headers=settings.cors_allowed_headers,
47+
cors_exposed_headers=settings.cors_exposed_headers,
48+
logging_buffer_capacity=settings.logging_buffer_capacity,
49+
swagger_offline_docs=settings.swagger_offline_docs,
4550
)
4651

4752

migrations/env.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
def get_dsn() -> URL:
11-
db_dsn = settings.db_dsn
11+
db_dsn = settings.db_dsn_parsed
1212
return db_dsn.set(drivername="postgresql")
1313

1414

pyproject.toml

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ dependencies = [
2121
"psycopg2",
2222
"sqlalchemy[asyncio]",
2323
"asyncpg",
24+
# tracing
25+
"opentelemetry-instrumentation-asyncpg",
26+
"opentelemetry-instrumentation-sqlalchemy",
2427
]
2528

2629
[dependency-groups]

0 commit comments

Comments
 (0)