dbos 0.26.0a25__py3-none-any.whl → 0.27.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
dbos/_app_db.py CHANGED
@@ -77,12 +77,24 @@ class ApplicationDatabase:
77
77
  pool_size = database.get("app_db_pool_size")
78
78
  if pool_size is None:
79
79
  pool_size = 20
80
+
81
+ engine_kwargs = database.get("db_engine_kwargs")
82
+ if engine_kwargs is None:
83
+ engine_kwargs = {}
84
+
85
+ # Respect user-provided values. Otherwise, set defaults.
86
+ if "pool_size" not in engine_kwargs:
87
+ engine_kwargs["pool_size"] = pool_size
88
+ if "max_overflow" not in engine_kwargs:
89
+ engine_kwargs["max_overflow"] = 0
90
+ if "pool_timeout" not in engine_kwargs:
91
+ engine_kwargs["pool_timeout"] = 30
92
+ if "connect_args" not in engine_kwargs:
93
+ engine_kwargs["connect_args"] = connect_args
94
+
80
95
  self.engine = sa.create_engine(
81
96
  app_db_url,
82
- pool_size=pool_size,
83
- max_overflow=0,
84
- pool_timeout=30,
85
- connect_args=connect_args,
97
+ **engine_kwargs,
86
98
  )
87
99
  self.sessionmaker = sessionmaker(bind=self.engine)
88
100
  self.debug_mode = debug_mode
dbos/_dbos.py CHANGED
@@ -65,7 +65,7 @@ from ._registrations import (
65
65
  from ._roles import default_required_roles, required_roles
66
66
  from ._scheduler import ScheduledWorkflow, scheduled
67
67
  from ._sys_db import StepInfo, WorkflowStatus, reset_system_database
68
- from ._tracer import dbos_tracer
68
+ from ._tracer import DBOSTracer, dbos_tracer
69
69
 
70
70
  if TYPE_CHECKING:
71
71
  from fastapi import FastAPI
@@ -1166,6 +1166,11 @@ class DBOS:
1166
1166
  ctx.authenticated_user = authenticated_user
1167
1167
  ctx.authenticated_roles = authenticated_roles
1168
1168
 
1169
+ @classproperty
1170
+ def tracer(self) -> DBOSTracer:
1171
+ """Return the DBOS OpenTelemetry tracer."""
1172
+ return dbos_tracer
1173
+
1169
1174
 
1170
1175
  class WorkflowHandle(Generic[R], Protocol):
1171
1176
  """
dbos/_dbos_config.py CHANGED
@@ -31,6 +31,7 @@ class DBOSConfig(TypedDict, total=False):
31
31
  app_db_pool_size (int): Application database pool size
32
32
  sys_db_name (str): System database name
33
33
  sys_db_pool_size (int): System database pool size
34
+ db_engine_kwargs (Dict[str, Any]): SQLAlchemy engine kwargs (See https://docs.sqlalchemy.org/en/20/core/engines.html#sqlalchemy.create_engine)
34
35
  log_level (str): Log level
35
36
  otlp_traces_endpoints: List[str]: OTLP traces endpoints
36
37
  otlp_logs_endpoints: List[str]: OTLP logs endpoints
@@ -43,6 +44,7 @@ class DBOSConfig(TypedDict, total=False):
43
44
  app_db_pool_size: Optional[int]
44
45
  sys_db_name: Optional[str]
45
46
  sys_db_pool_size: Optional[int]
47
+ db_engine_kwargs: Optional[Dict[str, Any]]
46
48
  log_level: Optional[str]
47
49
  otlp_traces_endpoints: Optional[List[str]]
48
50
  otlp_logs_endpoints: Optional[List[str]]
@@ -64,6 +66,7 @@ class DatabaseConfig(TypedDict, total=False):
64
66
  app_db_pool_size (int): Application database pool size
65
67
  sys_db_name (str): System database name
66
68
  sys_db_pool_size (int): System database pool size
69
+ db_engine_kwargs (Dict[str, Any]): SQLAlchemy engine kwargs
67
70
  migrate (List[str]): Migration commands to run on startup
68
71
  """
69
72
 
@@ -76,6 +79,7 @@ class DatabaseConfig(TypedDict, total=False):
76
79
  app_db_pool_size: Optional[int]
77
80
  sys_db_name: Optional[str]
78
81
  sys_db_pool_size: Optional[int]
82
+ db_engine_kwargs: Optional[Dict[str, Any]]
79
83
  ssl: Optional[bool] # Will be removed in a future version
80
84
  ssl_ca: Optional[str] # Will be removed in a future version
81
85
  migrate: Optional[List[str]]
@@ -183,6 +187,8 @@ def translate_dbos_config_to_config_file(config: DBOSConfig) -> ConfigFile:
183
187
  db_config["app_db_pool_size"] = config.get("app_db_pool_size")
184
188
  if "sys_db_pool_size" in config:
185
189
  db_config["sys_db_pool_size"] = config.get("sys_db_pool_size")
190
+ if "db_engine_kwargs" in config:
191
+ db_config["db_engine_kwargs"] = config.get("db_engine_kwargs")
186
192
  if db_config:
187
193
  translated_config["database"] = db_config
188
194
 
dbos/_sys_db.py CHANGED
@@ -267,12 +267,23 @@ class SystemDatabase:
267
267
  if pool_size is None:
268
268
  pool_size = 20
269
269
 
270
+ engine_kwargs = database.get("db_engine_kwargs")
271
+ if engine_kwargs is None:
272
+ engine_kwargs = {}
273
+
274
+ # Respect user-provided values. Otherwise, set defaults.
275
+ if "pool_size" not in engine_kwargs:
276
+ engine_kwargs["pool_size"] = pool_size
277
+ if "max_overflow" not in engine_kwargs:
278
+ engine_kwargs["max_overflow"] = 0
279
+ if "pool_timeout" not in engine_kwargs:
280
+ engine_kwargs["pool_timeout"] = 30
281
+ if "connect_args" not in engine_kwargs:
282
+ engine_kwargs["connect_args"] = {"connect_timeout": 10}
283
+
270
284
  self.engine = sa.create_engine(
271
285
  system_db_url,
272
- pool_size=pool_size,
273
- max_overflow=0,
274
- pool_timeout=30,
275
- connect_args={"connect_timeout": 10},
286
+ **engine_kwargs,
276
287
  )
277
288
 
278
289
  # Run a schema migration for the system database
@@ -378,7 +389,6 @@ class SystemDatabase:
378
389
  cmd = cmd.returning(SystemSchema.workflow_status.c.recovery_attempts, SystemSchema.workflow_status.c.status, SystemSchema.workflow_status.c.workflow_deadline_epoch_ms, SystemSchema.workflow_status.c.name, SystemSchema.workflow_status.c.class_name, SystemSchema.workflow_status.c.config_name, SystemSchema.workflow_status.c.queue_name) # type: ignore
379
390
 
380
391
  results = conn.execute(cmd)
381
-
382
392
  row = results.fetchone()
383
393
  if row is not None:
384
394
  # Check the started workflow matches the expected name, class_name, config_name, and queue_name
dbos/_tracer.py CHANGED
@@ -3,8 +3,10 @@ from typing import TYPE_CHECKING, Optional
3
3
 
4
4
  from opentelemetry import trace
5
5
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
6
+ from opentelemetry.sdk.resources import Resource
6
7
  from opentelemetry.sdk.trace import TracerProvider
7
8
  from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
9
+ from opentelemetry.semconv.resource import ResourceAttributes
8
10
  from opentelemetry.trace import Span
9
11
 
10
12
  from dbos._utils import GlobalParams
@@ -23,7 +25,13 @@ class DBOSTracer:
23
25
 
24
26
  def config(self, config: ConfigFile) -> None:
25
27
  if not isinstance(trace.get_tracer_provider(), TracerProvider):
26
- provider = TracerProvider()
28
+ resource = Resource(
29
+ attributes={
30
+ ResourceAttributes.SERVICE_NAME: config["name"],
31
+ }
32
+ )
33
+
34
+ provider = TracerProvider(resource=resource)
27
35
  if os.environ.get("DBOS__CONSOLE_TRACES", None) is not None:
28
36
  processor = BatchSpanProcessor(ConsoleSpanExporter())
29
37
  provider.add_span_processor(processor)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.26.0a25
3
+ Version: 0.27.0a2
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,11 +1,11 @@
1
- dbos-0.26.0a25.dist-info/METADATA,sha256=y73owgsrh99hU87_NM7oNpnqeDqdrOoO3xvr-83yn3I,5554
2
- dbos-0.26.0a25.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- dbos-0.26.0a25.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-0.26.0a25.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-0.27.0a2.dist-info/METADATA,sha256=Lb1wutYFgas-KLBWBsHoDgHJh8My-tp8CsrB3d08juU,5553
2
+ dbos-0.27.0a2.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ dbos-0.27.0a2.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-0.27.0a2.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=VoGS7H9GVtNAnD2S4zseIEioS1dNIJXRovQ4oHlg8og,842
6
6
  dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
7
  dbos/_admin_server.py,sha256=RrbABfR1D3p9c_QLrCSrgFuYce6FKi0fjMRIYLjO_Y8,9038
8
- dbos/_app_db.py,sha256=obNlgC9IZ20y8tqQeA1q4TjceG3jBFalxz70ieDOWCA,11332
8
+ dbos/_app_db.py,sha256=cMrSPA_MlajgSuw0Qg-fTvMPti5KYnS3b_7OQZux2Kk,11812
9
9
  dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
10
10
  dbos/_client.py,sha256=f1n5bbtVO-Mf5dDvI3sNlozxHSUfstWtgPirSqv1kpE,12518
11
11
  dbos/_conductor/conductor.py,sha256=HYzVL29IMMrs2Mnms_7cHJynCnmmEN5SDQOMjzn3UoU,16840
@@ -13,8 +13,8 @@ dbos/_conductor/protocol.py,sha256=zEKIuOQdIaSduNqfZKpo8PSD9_1oNpKIPnBNCu3RUyE,6
13
13
  dbos/_context.py,sha256=aHzJxO7LLAz9w3G2dkZnOcFW_GG-Yaxd02AaoLu4Et8,21861
14
14
  dbos/_core.py,sha256=ylTVSv02h2M5SmDgYEJAZmNiKX35zPq0z-9WA-f4byY,47900
15
15
  dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
16
- dbos/_dbos.py,sha256=zE-4CcTQo8ICz-6Ng776IUKdur4qOt3bb810fUAhQc0,47343
17
- dbos/_dbos_config.py,sha256=Q_YH1HSWzCzzCX7m6z3EjTp_YIjtFbohil6qmcmNARI,21311
16
+ dbos/_dbos.py,sha256=aXpoMSpbfT64LmVUigrcjXTaJAPVHu0G35sn9VAucy0,47490
17
+ dbos/_dbos_config.py,sha256=L0Z0OOB5FoPM9g-joZqXGeJnlxWQsEUtgPtgtg9Uf48,21732
18
18
  dbos/_debug.py,sha256=MNlQVZ6TscGCRQeEEL0VE8Uignvr6dPeDDDefS3xgIE,1823
19
19
  dbos/_docker_pg_helper.py,sha256=NmcgqmR5rQA_4igfeqh8ugNT2z3YmoOvuep_MEtxTiY,5854
20
20
  dbos/_error.py,sha256=9ITvFsN_Udpx0xXtYQHXXXb6PjPr3TmMondGmprV-L0,7003
@@ -46,7 +46,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
47
47
  dbos/_schemas/system_database.py,sha256=aChSK7uLECD-v-7BZeOfuZFbtWayllaS3PaowaKDHwY,5490
48
48
  dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
49
- dbos/_sys_db.py,sha256=SjYTleSEPtZVrPRimgXKeIvTjY8VN9G9jlgbcPT8ghg,80631
49
+ dbos/_sys_db.py,sha256=PhWOITCCspLiKo2-n4L-_KwbfsDdLxzgMXRiulEIqCw,81109
50
50
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
51
51
  dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  dbos/_templates/dbos-db-starter/__package/main.py,sha256=nJMN3ZD2lmwg4Dcgmiwqc-tQGuCJuJal2Xl85iA277U,2453
@@ -57,7 +57,7 @@ dbos/_templates/dbos-db-starter/migrations/env.py.dbos,sha256=GUV6sjkDzf9Vl6wkGE
57
57
  dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
58
58
  dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=MpS7LGaJS0CpvsjhfDkp9EJqvMvVCjRPfUp4c0aE2ys,941
59
59
  dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
60
- dbos/_tracer.py,sha256=dFDSFlta-rfA3-ahIRLYwnnoAOmlavdxAGllqwFgnCA,2440
60
+ dbos/_tracer.py,sha256=yN6GRDKu_1p-EqtQLNarMocPfga2ZuqpzStzzSPYhzo,2732
61
61
  dbos/_utils.py,sha256=nFRUHzVjXG5AusF85AlYHikj63Tzi-kQm992ihsrAxA,201
62
62
  dbos/_workflow_commands.py,sha256=7wyxTfIyh2IVIqlkaTr8CMBq8yxWP3Hhddyv1YJY8zE,3576
63
63
  dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
@@ -66,4 +66,4 @@ dbos/cli/cli.py,sha256=1qCTs__A9LOEfU44XZ6TufwmRwe68ZEwbWEPli3vnVM,17873
66
66
  dbos/dbos-config.schema.json,sha256=8KcwJb_sQc4-6tQG2TLmjE_nratfrQa0qVLl9XPsvWE,6367
67
67
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
68
68
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
69
- dbos-0.26.0a25.dist-info/RECORD,,
69
+ dbos-0.27.0a2.dist-info/RECORD,,