dbos 0.23.0a1__py3-none-any.whl → 0.23.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.

Potentially problematic release.


This version of dbos might be problematic. Click here for more details.

dbos/_context.py CHANGED
@@ -12,6 +12,8 @@ from typing import List, Literal, Optional, Type, TypedDict
12
12
  from opentelemetry.trace import Span, Status, StatusCode
13
13
  from sqlalchemy.orm import Session
14
14
 
15
+ from dbos._utils import GlobalParams
16
+
15
17
  from ._logger import dbos_logger
16
18
  from ._request import Request
17
19
  from ._tracer import dbos_tracer
@@ -48,7 +50,7 @@ class TracedAttributes(TypedDict, total=False):
48
50
 
49
51
  class DBOSContext:
50
52
  def __init__(self) -> None:
51
- self.executor_id = os.environ.get("DBOS__VMID", "local")
53
+ self.executor_id = GlobalParams.executor_id
52
54
  self.app_id = os.environ.get("DBOS__APPID", "")
53
55
 
54
56
  self.logger = dbos_logger
dbos/_core.py CHANGED
@@ -22,6 +22,7 @@ from typing import (
22
22
  )
23
23
 
24
24
  from dbos._outcome import Immediate, NoResult, Outcome, Pending
25
+ from dbos._utils import GlobalParams
25
26
 
26
27
  from ._app_db import ApplicationDatabase, TransactionResultInternal
27
28
 
@@ -164,7 +165,7 @@ def _init_workflow(
164
165
  "output": None,
165
166
  "error": None,
166
167
  "app_id": ctx.app_id,
167
- "app_version": dbos.app_version,
168
+ "app_version": GlobalParams.app_version,
168
169
  "executor_id": ctx.executor_id,
169
170
  "request": (
170
171
  _serialization.serialize(ctx.request) if ctx.request is not None else None
dbos/_dbos.py CHANGED
@@ -32,6 +32,8 @@ from typing import (
32
32
 
33
33
  from opentelemetry.trace import Span
34
34
 
35
+ from dbos._utils import GlobalParams
36
+
35
37
  from ._classproperty import classproperty
36
38
  from ._core import (
37
39
  TEMP_SEND_WF_NAME,
@@ -290,6 +292,8 @@ class DBOS:
290
292
  if destroy_registry:
291
293
  global _dbos_global_registry
292
294
  _dbos_global_registry = None
295
+ GlobalParams.app_version = os.environ.get("DBOS__APPVERSION", "")
296
+ GlobalParams.executor_id = os.environ.get("DBOS__VMID", "local")
293
297
 
294
298
  def __init__(
295
299
  self,
@@ -319,8 +323,6 @@ class DBOS:
319
323
  self.flask: Optional["Flask"] = flask
320
324
  self._executor_field: Optional[ThreadPoolExecutor] = None
321
325
  self._background_threads: List[threading.Thread] = []
322
- self._executor_id: str = os.environ.get("DBOS__VMID", "local")
323
- self.app_version: str = os.environ.get("DBOS__APPVERSION", "")
324
326
 
325
327
  # If using FastAPI, set up middleware and lifecycle events
326
328
  if self.fastapi is not None:
@@ -389,10 +391,9 @@ class DBOS:
389
391
  dbos_logger.warning(f"DBOS was already launched")
390
392
  return
391
393
  self._launched = True
392
- if self.app_version == "":
393
- self.app_version = self._registry.compute_app_version()
394
- dbos_logger.info(f"Application version: {self.app_version}")
395
- dbos_tracer.app_version = self.app_version
394
+ if GlobalParams.app_version == "":
395
+ GlobalParams.app_version = self._registry.compute_app_version()
396
+ dbos_logger.info(f"Application version: {GlobalParams.app_version}")
396
397
  self._executor_field = ThreadPoolExecutor(max_workers=64)
397
398
  self._sys_db_field = SystemDatabase(self.config)
398
399
  self._app_db_field = ApplicationDatabase(self.config)
@@ -402,15 +403,15 @@ class DBOS:
402
403
  self._admin_server_field = AdminServer(dbos=self, port=admin_port)
403
404
 
404
405
  workflow_ids = self._sys_db.get_pending_workflows(
405
- self._executor_id, self.app_version
406
+ GlobalParams.executor_id, GlobalParams.app_version
406
407
  )
407
408
  if (len(workflow_ids)) > 0:
408
409
  self.logger.info(
409
- f"Recovering {len(workflow_ids)} workflows from application version {self.app_version}"
410
+ f"Recovering {len(workflow_ids)} workflows from application version {GlobalParams.app_version}"
410
411
  )
411
412
  else:
412
413
  self.logger.info(
413
- f"No workflows to recover from application version {self.app_version}"
414
+ f"No workflows to recover from application version {GlobalParams.app_version}"
414
415
  )
415
416
 
416
417
  self._executor.submit(startup_recovery_thread, self, workflow_ids)
@@ -456,7 +457,7 @@ class DBOS:
456
457
  # to enable their export in DBOS Cloud
457
458
  for handler in dbos_logger.handlers:
458
459
  handler.flush()
459
- add_otlp_to_all_loggers(self.app_version)
460
+ add_otlp_to_all_loggers()
460
461
  except Exception:
461
462
  dbos_logger.error(f"DBOS failed to launch: {traceback.format_exc()}")
462
463
  raise
dbos/_logger.py CHANGED
@@ -8,6 +8,8 @@ from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
8
8
  from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
9
9
  from opentelemetry.sdk.resources import Resource
10
10
 
11
+ from dbos._utils import GlobalParams
12
+
11
13
  if TYPE_CHECKING:
12
14
  from ._dbos_config import ConfigFile
13
15
 
@@ -19,13 +21,11 @@ class DBOSLogTransformer(logging.Filter):
19
21
  def __init__(self) -> None:
20
22
  super().__init__()
21
23
  self.app_id = os.environ.get("DBOS__APPID", "")
22
- self.app_version = os.environ.get("DBOS__APPVERSION", "")
23
- self.executor_id = os.environ.get("DBOS__VMID", "local")
24
24
 
25
25
  def filter(self, record: Any) -> bool:
26
26
  record.applicationID = self.app_id
27
- record.applicationVersion = self.app_version
28
- record.executorID = self.executor_id
27
+ record.applicationVersion = GlobalParams.app_version
28
+ record.executorID = GlobalParams.executor_id
29
29
  return True
30
30
 
31
31
 
@@ -86,9 +86,8 @@ def config_logger(config: "ConfigFile") -> None:
86
86
  dbos_logger.addFilter(_otlp_transformer)
87
87
 
88
88
 
89
- def add_otlp_to_all_loggers(app_version: str) -> None:
89
+ def add_otlp_to_all_loggers() -> None:
90
90
  if _otlp_handler is not None and _otlp_transformer is not None:
91
- _otlp_transformer.app_version = app_version
92
91
  root = logging.root
93
92
 
94
93
  root.addHandler(_otlp_handler)
dbos/_queue.py CHANGED
@@ -5,6 +5,8 @@ from typing import TYPE_CHECKING, Optional, TypedDict
5
5
  from psycopg import errors
6
6
  from sqlalchemy.exc import OperationalError
7
7
 
8
+ from dbos._utils import GlobalParams
9
+
8
10
  from ._core import P, R, execute_workflow_by_id, start_workflow
9
11
 
10
12
  if TYPE_CHECKING:
@@ -71,7 +73,9 @@ def queue_thread(stop_event: threading.Event, dbos: "DBOS") -> None:
71
73
  return
72
74
  for _, queue in dbos._registry.queue_info_map.items():
73
75
  try:
74
- wf_ids = dbos._sys_db.start_queued_workflows(queue, dbos._executor_id)
76
+ wf_ids = dbos._sys_db.start_queued_workflows(
77
+ queue, GlobalParams.executor_id
78
+ )
75
79
  for id in wf_ids:
76
80
  execute_workflow_by_id(dbos, id)
77
81
  except OperationalError as e:
dbos/_recovery.py CHANGED
@@ -4,6 +4,8 @@ import time
4
4
  import traceback
5
5
  from typing import TYPE_CHECKING, Any, List
6
6
 
7
+ from dbos._utils import GlobalParams
8
+
7
9
  from ._core import execute_workflow_by_id
8
10
  from ._error import DBOSWorkflowFunctionNotFoundError
9
11
  from ._sys_db import GetPendingWorkflowsOutput
@@ -45,7 +47,7 @@ def recover_pending_workflows(
45
47
  for executor_id in executor_ids:
46
48
  dbos.logger.debug(f"Recovering pending workflows for executor: {executor_id}")
47
49
  pending_workflows = dbos._sys_db.get_pending_workflows(
48
- executor_id, dbos.app_version
50
+ executor_id, GlobalParams.app_version
49
51
  )
50
52
  for pending_workflow in pending_workflows:
51
53
  if (
@@ -64,6 +66,6 @@ def recover_pending_workflows(
64
66
  execute_workflow_by_id(dbos, pending_workflow.workflow_uuid)
65
67
  )
66
68
  dbos.logger.info(
67
- f"Recovering {len(pending_workflows)} workflows from version {dbos.app_version}"
69
+ f"Recovering {len(pending_workflows)} workflows from version {GlobalParams.app_version}"
68
70
  )
69
71
  return workflow_handles
dbos/_sys_db.py CHANGED
@@ -27,6 +27,8 @@ from alembic.config import Config
27
27
  from sqlalchemy.exc import DBAPIError
28
28
  from sqlalchemy.sql import func
29
29
 
30
+ from dbos._utils import GlobalParams
31
+
30
32
  from . import _serialization
31
33
  from ._dbos_config import ConfigFile
32
34
  from ._error import (
@@ -192,9 +194,7 @@ class SystemDatabase:
192
194
  port=config["database"]["port"],
193
195
  database="postgres",
194
196
  # fills the "application_name" column in pg_stat_activity
195
- query={
196
- "application_name": f"dbos_transact_{os.environ.get('DBOS__VMID', 'local')}"
197
- },
197
+ query={"application_name": f"dbos_transact_{GlobalParams.executor_id}"},
198
198
  )
199
199
  engine = sa.create_engine(postgres_db_url)
200
200
  with engine.connect() as conn:
@@ -214,9 +214,7 @@ class SystemDatabase:
214
214
  port=config["database"]["port"],
215
215
  database=sysdb_name,
216
216
  # fills the "application_name" column in pg_stat_activity
217
- query={
218
- "application_name": f"dbos_transact_{os.environ.get('DBOS__VMID', 'local')}"
219
- },
217
+ query={"application_name": f"dbos_transact_{GlobalParams.executor_id}"},
220
218
  )
221
219
 
222
220
  # Create a connection pool for the system database
dbos/_tracer.py CHANGED
@@ -7,6 +7,8 @@ from opentelemetry.sdk.trace import TracerProvider
7
7
  from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
8
8
  from opentelemetry.trace import Span
9
9
 
10
+ from dbos._utils import GlobalParams
11
+
10
12
  from ._dbos_config import ConfigFile
11
13
 
12
14
  if TYPE_CHECKING:
@@ -17,8 +19,6 @@ class DBOSTracer:
17
19
 
18
20
  def __init__(self) -> None:
19
21
  self.app_id = os.environ.get("DBOS__APPID", None)
20
- self.app_version = os.environ.get("DBOS__APPVERSION", None)
21
- self.executor_id = os.environ.get("DBOS__VMID", "local")
22
22
  self.provider: Optional[TracerProvider] = None
23
23
 
24
24
  def config(self, config: ConfigFile) -> None:
@@ -51,8 +51,8 @@ class DBOSTracer:
51
51
  context = trace.set_span_in_context(parent) if parent else None
52
52
  span: Span = tracer.start_span(name=attributes["name"], context=context)
53
53
  attributes["applicationID"] = self.app_id
54
- attributes["applicationVersion"] = self.app_version
55
- attributes["executorID"] = self.executor_id
54
+ attributes["applicationVersion"] = GlobalParams.app_version
55
+ attributes["executorID"] = GlobalParams.executor_id
56
56
  for k, v in attributes.items():
57
57
  if k != "name" and v is not None and isinstance(v, (str, bool, int, float)):
58
58
  span.set_attribute(k, v)
dbos/_utils.py ADDED
@@ -0,0 +1,6 @@
1
+ import os
2
+
3
+
4
+ class GlobalParams:
5
+ app_version: str = os.environ.get("DBOS__APPVERSION", "")
6
+ executor_id: str = os.environ.get("DBOS__VMID", "local")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.23.0a1
3
+ Version: 0.23.0a2
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,7 +1,7 @@
1
- dbos-0.23.0a1.dist-info/METADATA,sha256=NXo3Kx4nz7Ri3w7fDiqiycU1XJn9QPLuttIHdEwr6Lk,5309
2
- dbos-0.23.0a1.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
- dbos-0.23.0a1.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-0.23.0a1.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-0.23.0a2.dist-info/METADATA,sha256=wgdLApRAu84t1Ar5ZfNUwDmH-k6PCT7goVKBXsLPmZw,5309
2
+ dbos-0.23.0a2.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ dbos-0.23.0a2.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-0.23.0a2.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=CxRHBHEthPL4PZoLbZhp3rdm44-KkRTT2-7DkK9d4QQ,724
6
6
  dbos/_admin_server.py,sha256=YiVn5lywz2Vg8_juyNHOYl0HVEy48--7b4phwK7r92o,5732
7
7
  dbos/_app_db.py,sha256=_tv2vmPjjiaikwgxH3mqxgJ4nUUcG2-0uMXKWCqVu1c,5509
@@ -9,18 +9,18 @@ dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
9
9
  dbos/_cloudutils/authentication.py,sha256=V0fCWQN9stCkhbuuxgPTGpvuQcDqfU3KAxPAh01vKW4,5007
10
10
  dbos/_cloudutils/cloudutils.py,sha256=YC7jGsIopT0KveLsqbRpQk2KlRBk-nIRC_UCgep4f3o,7797
11
11
  dbos/_cloudutils/databases.py,sha256=_shqaqSvhY4n2ScgQ8IP5PDZvzvcx3YBKV8fj-cxhSY,8543
12
- dbos/_context.py,sha256=gikN5lUVqnvR-ISoOElXYeYsR_BO2whebB3YP2DJBM4,17713
13
- dbos/_core.py,sha256=i6ehRlYuVQ9cBubCuu060ArwrTF7XjrOnHpGMT6D4l0,36512
12
+ dbos/_context.py,sha256=Ue5qu3rzLfRmPkz-UUZi9ZS8iXpapRN0NTM4mbA2QmQ,17738
13
+ dbos/_core.py,sha256=2nd_0p1aZM3nVN_nKzwtmgKosU9VIQwE-tPVqeBKryY,36557
14
14
  dbos/_croniter.py,sha256=hbhgfsHBqclUS8VeLnJ9PSE9Z54z6mi4nnrr1aUXn0k,47561
15
15
  dbos/_db_wizard.py,sha256=6tfJaCRa1NtkUdNW75a2yvi_mEgnPJ9C1HP2zPG1hCU,8067
16
- dbos/_dbos.py,sha256=g6W-WqGNTMuLmX0axmH7qJKdIR252J7a7_4bUukRX4Q,39027
16
+ dbos/_dbos.py,sha256=JNAFYQ3kVjnZsUl0qJ-JWeaSHKI51VGE3JBXdaPD8Oo,39054
17
17
  dbos/_dbos_config.py,sha256=DfiqVVxNqnafkocSzLqBp1Ig5vCviDTDK_GO3zTtQqI,8298
18
18
  dbos/_error.py,sha256=xqB7b7g5AF_OwOvqLKLXL1xldn2gAtORix2ZC2B8zK0,5089
19
19
  dbos/_fastapi.py,sha256=ke03vqsSYDnO6XeOtOVFXj0-f-v1MGsOxa9McaROvNc,3616
20
20
  dbos/_flask.py,sha256=DZKUZR5-xOzPI7tYZ53r2PvvHVoAb8SYwLzMVFsVfjI,2608
21
21
  dbos/_kafka.py,sha256=o6DbwnsYRDtvVTZVsN7BAK8cdP79AfoWX3Q7CGY2Yuo,4199
22
22
  dbos/_kafka_message.py,sha256=NYvOXNG3Qn7bghn1pv3fg4Pbs86ILZGcK4IB-MLUNu0,409
23
- dbos/_logger.py,sha256=hNEeOgR9yOwdgcOuvnW_wN9rbfpTk5OowPNhEJmjoQE,3644
23
+ dbos/_logger.py,sha256=utroNAXW71MLYb5D3lsM5xifXT19n5mAidyW-4kwyMA,3499
24
24
  dbos/_migrations/env.py,sha256=38SIGVbmn_VV2x2u1aHLcPOoWgZ84eCymf3g_NljmbU,1626
25
25
  dbos/_migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
26
26
  dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py,sha256=ICLPl8CN9tQXMsLDsAj8z1TsL831-Z3F8jSBvrR-wyw,736
@@ -31,8 +31,8 @@ dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py,sha256=8PyFi8rd6CN-m
31
31
  dbos/_migrations/versions/d76646551a6c_workflow_queue.py,sha256=G942nophZ2uC2vc4hGBC02Ptng1715roTjY3xiyzZU4,729
32
32
  dbos/_migrations/versions/eab0cc1d9a14_job_queue.py,sha256=uvhFOtqbBreCePhAxZfIT0qCAI7BiZTou9wt6QnbY7c,1412
33
33
  dbos/_outcome.py,sha256=FDMgWVjZ06vm9xO-38H17mTqBImUYQxgKs_bDCSIAhE,6648
34
- dbos/_queue.py,sha256=eZiapBcyn70-viW0y9fo7u09V6_VF5ACNGJxD-U_dNM,2844
35
- dbos/_recovery.py,sha256=GtNMvPFM9qetob-gCU9FPI2fo_BGZYRws4EFSpOuFa4,2675
34
+ dbos/_queue.py,sha256=I2gBc7zQ4G0vyDDBnKwIFzxtqfD7DxHO2IZ41brFSOM,2927
35
+ dbos/_recovery.py,sha256=j5OqZEWanwrrt51gHD6bOLS2shCJ5t7bWFOAvsYf-D8,2729
36
36
  dbos/_registrations.py,sha256=_zy6k944Ll8QwqU12Kr3OP23ukVtm8axPNN1TS_kJRc,6717
37
37
  dbos/_request.py,sha256=cX1B3Atlh160phgS35gF1VEEV4pD126c9F3BDgBmxZU,929
38
38
  dbos/_roles.py,sha256=iOsgmIAf1XVzxs3gYWdGRe1B880YfOw5fpU7Jwx8_A8,2271
@@ -41,7 +41,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  dbos/_schemas/application_database.py,sha256=KeyoPrF7hy_ODXV7QNike_VFSD74QBRfQ76D7QyE9HI,966
42
42
  dbos/_schemas/system_database.py,sha256=rwp4EvCSaXcUoMaRczZCvETCxGp72k3-hvLyGUDkih0,5163
43
43
  dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
44
- dbos/_sys_db.py,sha256=aGa3KDKUVeK9d7r_yK21uoKV3LJGzRzsg8S3Bea5j_U,62685
44
+ dbos/_sys_db.py,sha256=k3vz6G23IdHAO90LtY6lfcbWr74xcBbt0sHTZpFhgTE,62637
45
45
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
46
46
  dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  dbos/_templates/dbos-db-starter/__package/main.py,sha256=eI0SS9Nwj-fldtiuSzIlIG6dC91GXXwdRsoHxv6S_WI,2719
@@ -52,7 +52,8 @@ dbos/_templates/dbos-db-starter/migrations/env.py.dbos,sha256=GUV6sjkDzf9Vl6wkGE
52
52
  dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
53
53
  dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=U5thFWGqNN4QLrNXT7wUUqftIFDNE5eSdqD8JNW1mec,942
54
54
  dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
55
- dbos/_tracer.py,sha256=rvBY1RQU6DO7rL7EnaJJxGcmd4tP_PpGqUEE6imZnhY,2518
55
+ dbos/_tracer.py,sha256=_Id9j9kCrptSNpEpLiRk_g5VPp-DrTWP1WNZInd5BA4,2439
56
+ dbos/_utils.py,sha256=wjOJzxN66IzL9p4dwcEmQACRQah_V09G6mJI2exQfOM,155
56
57
  dbos/_workflow_commands.py,sha256=gAynfrq5sAMhdNpMIphiAm_hC2-xk1ZyWEYA-whtfPs,5402
57
58
  dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
58
59
  dbos/cli/_template_init.py,sha256=AfuMaO8bmr9WsPNHr6j2cp7kjVVZDUpH7KpbTg0hhFs,2722
@@ -60,4 +61,4 @@ dbos/cli/cli.py,sha256=_tXw2IQrWW7fV_h51f_R99vEBSi6aMLz-vCOxKaENiQ,14155
60
61
  dbos/dbos-config.schema.json,sha256=X5TpXNcARGceX0zQs0fVgtZW_Xj9uBbY5afPt9Rz9yk,5741
61
62
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
62
63
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
63
- dbos-0.23.0a1.dist-info/RECORD,,
64
+ dbos-0.23.0a2.dist-info/RECORD,,