dbos 2.3.0a4__py3-none-any.whl → 2.4.0__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/_tracer.py CHANGED
@@ -25,6 +25,10 @@ class DBOSTracer:
25
25
  def config(self, config: ConfigFile) -> None:
26
26
  self.otlp_attributes = config.get("telemetry", {}).get("otlp_attributes", {}) # type: ignore
27
27
  self.disable_otlp = config.get("telemetry", {}).get("disable_otlp", False) # type: ignore
28
+ otlp_traces_endpoints = (
29
+ config.get("telemetry", {}).get("OTLPExporter", {}).get("tracesEndpoint") # type: ignore
30
+ )
31
+
28
32
  if not self.disable_otlp:
29
33
  from opentelemetry import trace
30
34
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
@@ -38,25 +42,26 @@ class DBOSTracer:
38
42
  )
39
43
  from opentelemetry.semconv.attributes.service_attributes import SERVICE_NAME
40
44
 
41
- if not isinstance(trace.get_tracer_provider(), TracerProvider):
42
- resource = Resource(
43
- attributes={
44
- SERVICE_NAME: config["name"],
45
- }
46
- )
47
-
48
- provider = TracerProvider(resource=resource)
49
- if os.environ.get("DBOS__CONSOLE_TRACES", None) is not None:
50
- processor = BatchSpanProcessor(ConsoleSpanExporter())
51
- provider.add_span_processor(processor)
52
- otlp_traces_endpoints = (
53
- config.get("telemetry", {}).get("OTLPExporter", {}).get("tracesEndpoint") # type: ignore
54
- )
55
- if otlp_traces_endpoints:
56
- for e in otlp_traces_endpoints:
57
- processor = BatchSpanProcessor(OTLPSpanExporter(endpoint=e))
58
- provider.add_span_processor(processor)
59
- trace.set_tracer_provider(provider)
45
+ tracer_provider = trace.get_tracer_provider()
46
+
47
+ # Only set up OTLP provider and exporter if endpoints are provided
48
+ if otlp_traces_endpoints is not None and len(otlp_traces_endpoints) > 0:
49
+ if not isinstance(tracer_provider, TracerProvider):
50
+ resource = Resource(
51
+ attributes={
52
+ SERVICE_NAME: config["name"],
53
+ }
54
+ )
55
+
56
+ tracer_provider = TracerProvider(resource=resource)
57
+ if os.environ.get("DBOS__CONSOLE_TRACES", None) is not None:
58
+ processor = BatchSpanProcessor(ConsoleSpanExporter())
59
+ tracer_provider.add_span_processor(processor)
60
+ trace.set_tracer_provider(tracer_provider)
61
+
62
+ for e in otlp_traces_endpoints:
63
+ processor = BatchSpanProcessor(OTLPSpanExporter(endpoint=e))
64
+ tracer_provider.add_span_processor(processor)
60
65
 
61
66
  def set_provider(self, provider: "Optional[TracerProvider]") -> None:
62
67
  self.provider = provider
dbos/_utils.py CHANGED
@@ -1,5 +1,7 @@
1
1
  import importlib.metadata
2
2
  import os
3
+ import sys
4
+ import uuid
3
5
 
4
6
  import psycopg
5
7
  from sqlalchemy.exc import DBAPIError
@@ -12,6 +14,7 @@ request_id_header = "x-request-id"
12
14
  class GlobalParams:
13
15
  app_version: str = os.environ.get("DBOS__APPVERSION", "")
14
16
  executor_id: str = os.environ.get("DBOS__VMID", "local")
17
+ dbos_cloud: bool = os.environ.get("DBOS__CLOUD") == "true"
15
18
  try:
16
19
  # Only works on Python >= 3.8
17
20
  dbos_version = importlib.metadata.version("dbos")
@@ -57,3 +60,10 @@ def retriable_sqlite_exception(e: Exception) -> bool:
57
60
  return True
58
61
  else:
59
62
  return False
63
+
64
+
65
+ def generate_uuid() -> str:
66
+ if sys.version_info >= (3, 14):
67
+ return str(uuid.uuid7())
68
+ else:
69
+ return str(uuid.uuid4())
@@ -1,13 +1,11 @@
1
- import time
2
- import uuid
3
1
  from datetime import datetime
4
2
  from typing import TYPE_CHECKING, List, Optional, Union
5
3
 
6
4
  from dbos._context import get_local_dbos_context
5
+ from dbos._utils import generate_uuid
7
6
 
8
7
  from ._app_db import ApplicationDatabase
9
8
  from ._sys_db import (
10
- GetQueuedWorkflowsInput,
11
9
  GetWorkflowsInput,
12
10
  StepInfo,
13
11
  SystemDatabase,
@@ -28,7 +26,9 @@ def list_workflows(
28
26
  end_time: Optional[str] = None,
29
27
  name: Optional[str] = None,
30
28
  app_version: Optional[str] = None,
29
+ forked_from: Optional[str] = None,
31
30
  user: Optional[str] = None,
31
+ queue_name: Optional[str] = None,
32
32
  limit: Optional[int] = None,
33
33
  offset: Optional[int] = None,
34
34
  sort_desc: bool = False,
@@ -43,6 +43,8 @@ def list_workflows(
43
43
  input.end_time = end_time
44
44
  input.status = status if status is None or isinstance(status, list) else [status]
45
45
  input.application_version = app_version
46
+ input.forked_from = forked_from
47
+ input.queue_name = queue_name
46
48
  input.limit = limit
47
49
  input.name = name
48
50
  input.offset = offset
@@ -61,6 +63,7 @@ def list_queued_workflows(
61
63
  *,
62
64
  queue_name: Optional[str] = None,
63
65
  status: Optional[Union[str, List[str]]] = None,
66
+ forked_from: Optional[str] = None,
64
67
  start_time: Optional[str] = None,
65
68
  end_time: Optional[str] = None,
66
69
  name: Optional[str] = None,
@@ -69,19 +72,20 @@ def list_queued_workflows(
69
72
  sort_desc: bool = False,
70
73
  load_input: bool = True,
71
74
  ) -> List[WorkflowStatus]:
72
- input: GetQueuedWorkflowsInput = {
73
- "queue_name": queue_name,
74
- "start_time": start_time,
75
- "end_time": end_time,
76
- "status": status if status is None or isinstance(status, list) else [status],
77
- "limit": limit,
78
- "name": name,
79
- "offset": offset,
80
- "sort_desc": sort_desc,
81
- }
82
-
83
- infos: List[WorkflowStatus] = sys_db.get_queued_workflows(
84
- input, load_input=load_input
75
+ input = GetWorkflowsInput()
76
+ input.start_time = start_time
77
+ input.end_time = end_time
78
+ input.status = status if status is None or isinstance(status, list) else [status]
79
+ input.forked_from = forked_from
80
+ input.limit = limit
81
+ input.name = name
82
+ input.offset = offset
83
+ input.sort_desc = sort_desc
84
+ input.queues_only = True
85
+ input.queue_name = queue_name
86
+
87
+ infos: List[WorkflowStatus] = sys_db.get_workflows(
88
+ input, load_input=load_input, load_output=False
85
89
  )
86
90
  return infos
87
91
 
@@ -121,7 +125,7 @@ def fork_workflow(
121
125
  forked_workflow_id = ctx.id_assigned_for_next_workflow
122
126
  ctx.id_assigned_for_next_workflow = ""
123
127
  else:
124
- forked_workflow_id = str(uuid.uuid4())
128
+ forked_workflow_id = generate_uuid()
125
129
  if app_db:
126
130
  app_db.clone_workflow_transactions(workflow_id, forked_workflow_id, start_step)
127
131
  sys_db.fork_workflow(
dbos/cli/cli.py CHANGED
@@ -145,7 +145,7 @@ def start() -> None:
145
145
  if process.poll() is None:
146
146
  os.killpg(os.getpgid(process.pid), signum)
147
147
 
148
- # Exit
148
+ # Exit
149
149
  os._exit(process.returncode if process.returncode is not None else 1)
150
150
 
151
151
  # Configure the single handler only on Unix-like systems.
dbos/cli/migration.py CHANGED
@@ -24,6 +24,7 @@ def migrate_dbos_databases(
24
24
  engine=None,
25
25
  schema=schema,
26
26
  serializer=DefaultSerializer(),
27
+ executor_id=None,
27
28
  )
28
29
  sys_db.run_migrations()
29
30
  if app_database_url:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 2.3.0a4
3
+ Version: 2.4.0
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,31 +1,31 @@
1
- dbos-2.3.0a4.dist-info/METADATA,sha256=bNVzQwEXHySnbyTr_mjNe3K0lwYJS0w6ttLL5Onhf6g,14532
2
- dbos-2.3.0a4.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
- dbos-2.3.0a4.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-2.3.0a4.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-2.4.0.dist-info/METADATA,sha256=f1Sq1IjKqPT7G0au8UEYeT2_KIApTj_fl08hNNARPoU,14530
2
+ dbos-2.4.0.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
3
+ dbos-2.4.0.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-2.4.0.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=M7FdFSBGhcvaLIXrNw_0eR68ijwMWV7_UEyimHMP_F4,1039
6
6
  dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
- dbos/_admin_server.py,sha256=hubQJw5T8zGKCPNS6FQTXy8jQ8GTJxoYQaDTMlICl9k,16267
8
- dbos/_app_db.py,sha256=mvWQ66ebdbiD9fpGKHZBWNVEza6Ulo1D-3UoTB_LwRc,16378
7
+ dbos/_admin_server.py,sha256=Kce_Cv6JXZBABzfOcNJdVHOwEukmp7SvO24TSa-gLIM,16371
8
+ dbos/_app_db.py,sha256=3XHvTePe1JaAI42rO3waWGoEeDyXkFKGzTFwJxQHUmo,16464
9
9
  dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
10
- dbos/_client.py,sha256=0VR9oWBn0i-34jNWHqkgeImKdg5aBefMWu2jaqRLH8Q,19658
11
- dbos/_conductor/conductor.py,sha256=3E_hL3c9g9yWqKZkvI6KA0-ZzPMPRo06TOzT1esMiek,24114
12
- dbos/_conductor/protocol.py,sha256=q3rgLxINFtWFigdOONc-4gX4vn66UmMlJQD6Kj8LnL4,7420
13
- dbos/_context.py,sha256=XKllmsDR_oMcWOuZnoe1X4yv2JeOi_vsAuyWC-mWs_o,28164
14
- dbos/_core.py,sha256=e-pKDbrvpN6BzcfyIZx4Nsb8wnMiGxLNzdpgtlRI-0I,50096
10
+ dbos/_client.py,sha256=Upl9tqrMKWQKDv8L13zaGbI03uWF2Cw3c7W_Cg-Bsls,20018
11
+ dbos/_conductor/conductor.py,sha256=8QNK2kXH2fG_YUg6E2fKGEhtIwFMcZIeelgP9b0kwrQ,24283
12
+ dbos/_conductor/protocol.py,sha256=nVjpcSw_OPoCM7NBU_IRWnk9dFQjOgAkg0ufhj8lFzI,8901
13
+ dbos/_context.py,sha256=GOoSpv1BE4jAXtMzTvPfy2VR6Rr4fSqTb0IjgCR_ER4,28165
14
+ dbos/_core.py,sha256=FCspRQFRMFyHpkl4vqR8IEw3aitD-VWB77CMVQrlyy8,50257
15
15
  dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
16
- dbos/_dbos.py,sha256=dr32Z_NT36JkUxWGyYVX7xkl3bYJmgsxVMOX8H9_mpM,59394
17
- dbos/_dbos_config.py,sha256=mfajyeyeV1ZHaAg2GU3dxwvp_19wZtY2prNdVrXgPb8,24846
18
- dbos/_debouncer.py,sha256=qNjIVmWqTPp64M2cEbLnpgGmlKVdCaAKysD1BPJgWh4,15297
16
+ dbos/_dbos.py,sha256=KUD5YJUYhPasx0yLZHpqjLVqcnE8UYWIpK7OZJlNR6M,60050
17
+ dbos/_dbos_config.py,sha256=eV8_jBRLotWwx0_aGO7VoqbeB0vyN9dmIgG4G22tIeE,24814
18
+ dbos/_debouncer.py,sha256=G3QwqNCmdWC0zDy3LMV4kfK771aI-Kx8ULBgU7NXAwE,15294
19
19
  dbos/_debug.py,sha256=0MfgNqutCUhI4PEmmra9x7f3DiFE_0nscfUCHdLimEY,1415
20
20
  dbos/_docker_pg_helper.py,sha256=xySum4hTA8TVMBODoG19u4cXQAB1vCock-jwM2pnmSI,7791
21
21
  dbos/_error.py,sha256=GwO0Ng4d4iB52brY09-Ss6Cz_V28Xc0D0cRCzZ6XmNM,8688
22
22
  dbos/_event_loop.py,sha256=cvaFN9-II3MsHEOq8QoICc_8qSKrjikMlLfuhC3Y8Dk,2923
23
- dbos/_fastapi.py,sha256=toYYfbe2aui2aHw0021PoXi2dKlI6NzO3M3pHB0dHOk,3421
24
- dbos/_flask.py,sha256=Npnakt-a3W5OykONFRkDRnumaDhTQmA0NPdUCGRYKXE,1652
23
+ dbos/_fastapi.py,sha256=2Dss2CpAbiGo2dNTrcfMHufUTdj_gUukJ_qZHbwBQao,3422
24
+ dbos/_flask.py,sha256=_ST-eLLrg_KVj1eUvbeT2XeDIlECyvG9uOp3KCSjb2A,1653
25
25
  dbos/_kafka.py,sha256=cA3hXyT-FR4LQZnaBMVLTZn7oko76rcTUC_kOo6aSis,4352
26
26
  dbos/_kafka_message.py,sha256=NYvOXNG3Qn7bghn1pv3fg4Pbs86ILZGcK4IB-MLUNu0,409
27
- dbos/_logger.py,sha256=djnCp147QoQ1iG9Bt3Uz8RyGaXGmi6gebccXsrA6Cps,4660
28
- dbos/_migration.py,sha256=Fvc3m4dC4oDpjPMHX-tUZVnXklVB9OMMojSLuVyV9ak,10312
27
+ dbos/_logger.py,sha256=vJhmTltDGFSZCpfcnj5EGJJWYgf-b-7taV2thwM67Rc,5160
28
+ dbos/_migration.py,sha256=GJdxHhMUnsr3pjrGwi1f4PT76ABnn9kFUyqWp4Hakmw,11701
29
29
  dbos/_outcome.py,sha256=7HvosMfEHTh1U5P6xok7kFTGLwa2lPaul0YApb3UnN4,8191
30
30
  dbos/_queue.py,sha256=GmqZHl9smES1KSmpauhSdsnZFJHDyfvRArmC-jBibhw,6228
31
31
  dbos/_recovery.py,sha256=K-wlFhdf4yGRm6cUzyhcTjQUS0xp2T5rdNMLiiBErYg,2882
@@ -34,9 +34,9 @@ dbos/_roles.py,sha256=kCuhhg8XLtrHCgKgm44I0abIRTGHltf88OwjEKAUggk,2317
34
34
  dbos/_scheduler.py,sha256=PLiCSUujlfEfojTnHwzY-P_AEOVEx7bvWvU5BuMgLPY,2708
35
35
  dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
37
- dbos/_schemas/system_database.py,sha256=mNsBV0ttlqJArvOqGPY60WvtuiWrHCpYnVxtvMfe2LI,5544
37
+ dbos/_schemas/system_database.py,sha256=tQAFCnEyZ7bEXZm3FbGIYk5SNGk-AHA3R_vuR0hfH8s,5717
38
38
  dbos/_serialization.py,sha256=ZGrkN5UclSLOqMVZgYpT72pw1l888ZXRoYuu3pIg3PA,2957
39
- dbos/_sys_db.py,sha256=FDboSk58CyQCAFjOF_KMLnRtIw05OL3IpJHT1qwKEKo,87596
39
+ dbos/_sys_db.py,sha256=nxxIgwtzoHCRWXydwQHQ65YOTMFmUVX_p8EDZftUXXg,86259
40
40
  dbos/_sys_db_postgres.py,sha256=_3m3hF6Pc23iZfUlIFYtDuC1Tw6KsjYqnDQE0HZpjt4,6965
41
41
  dbos/_sys_db_sqlite.py,sha256=ifjKdy-Z9vlVIBf5L6XnSaNjiBdvqPE73asVHim4A5Q,6998
42
42
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
@@ -46,14 +46,14 @@ dbos/_templates/dbos-db-starter/__package/schema.py,sha256=7Z27JGC8yy7Z44cbVXIRE
46
46
  dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos,sha256=0wPktElM7kMB3OPHTXw4xBk9bgGKMqOHrrr7x_R23Z8,446
47
47
  dbos/_templates/dbos-db-starter/migrations/create_table.py.dbos,sha256=pVm2Q0AsxS8pg85llbrXFD6jMccMqGjhGRjTEvS-hXk,942
48
48
  dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
49
- dbos/_tracer.py,sha256=PHbD7iTEkHk7z4B9hc-wPgi2dPTeI1rhZgLI33TQEeM,3786
50
- dbos/_utils.py,sha256=ZdoM1MDbHnlJrh31zfhp3iX62bAxK1kyvMwXnltC_84,1779
51
- dbos/_workflow_commands.py,sha256=k-i1bCfNrux43BHLT8wQ-l-MVZX3D6LGZLH7-uuiDRo,4951
49
+ dbos/_tracer.py,sha256=jVCn4EiPl8Lo21oN39yELAhS79JQilqSDLLFhkFEPCc,3993
50
+ dbos/_utils.py,sha256=OHFOQ1r5goT75eRRiddJd-s0-ik3zt3jSOIMUoElEhQ,2007
51
+ dbos/_workflow_commands.py,sha256=qQFFb4iQ1qReC4iwCTipDBVff0pjxtmeHM9uDdNg9Xg,5184
52
52
  dbos/cli/_github_init.py,sha256=R_94Fnn40CAmPy-zM00lwHi0ndyfv57TmIooADjmag4,3378
53
53
  dbos/cli/_template_init.py,sha256=AltKk256VocgvxLpuTxpjJyACrdHFjbGoqYhHzeLae4,2649
54
- dbos/cli/cli.py,sha256=hPZJmrQZWn8mcXou7DHaHl8luSEQTEWaYlnIsLw8WY4,27150
55
- dbos/cli/migration.py,sha256=I0_0ngWTuCPQf6Symbpd0lizaxWUKe3uTYEmuCmsrdU,3775
54
+ dbos/cli/cli.py,sha256=AHz_JJj_qWCTRV8yT1RSA-hISFVIJrE9eUalApw9sxg,27149
55
+ dbos/cli/migration.py,sha256=jRAr4H7Bpf-PfmLoOA6qXk9i15Cl1TehUz-cphjvYJM,3805
56
56
  dbos/dbos-config.schema.json,sha256=47wofTZ5jlFynec7bG0L369tAXbRQQ2euBxBXvg4m9c,1730
57
57
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
58
58
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
59
- dbos-2.3.0a4.dist-info/RECORD,,
59
+ dbos-2.4.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.4.5)
2
+ Generator: pdm-backend (2.4.6)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any