dbos 2.3.0a3__tar.gz → 2.3.0a5__tar.gz

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.

Files changed (99) hide show
  1. {dbos-2.3.0a3 → dbos-2.3.0a5}/PKG-INFO +1 -1
  2. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_logger.py +23 -16
  3. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_tracer.py +24 -19
  4. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/cli/cli.py +1 -15
  5. {dbos-2.3.0a3 → dbos-2.3.0a5}/pyproject.toml +1 -1
  6. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_queue.py +1 -1
  7. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_spans.py +1 -5
  8. {dbos-2.3.0a3 → dbos-2.3.0a5}/LICENSE +0 -0
  9. {dbos-2.3.0a3 → dbos-2.3.0a5}/README.md +0 -0
  10. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/__init__.py +0 -0
  11. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/__main__.py +0 -0
  12. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_admin_server.py +0 -0
  13. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_app_db.py +0 -0
  14. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_classproperty.py +0 -0
  15. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_client.py +0 -0
  16. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_conductor/conductor.py +0 -0
  17. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_conductor/protocol.py +0 -0
  18. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_context.py +0 -0
  19. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_core.py +0 -0
  20. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_croniter.py +0 -0
  21. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_dbos.py +0 -0
  22. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_dbos_config.py +0 -0
  23. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_debouncer.py +0 -0
  24. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_debug.py +0 -0
  25. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_docker_pg_helper.py +0 -0
  26. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_error.py +0 -0
  27. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_event_loop.py +0 -0
  28. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_fastapi.py +0 -0
  29. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_flask.py +0 -0
  30. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_kafka.py +0 -0
  31. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_kafka_message.py +0 -0
  32. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_migration.py +0 -0
  33. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_outcome.py +0 -0
  34. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_queue.py +0 -0
  35. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_recovery.py +0 -0
  36. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_registrations.py +0 -0
  37. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_roles.py +0 -0
  38. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_scheduler.py +0 -0
  39. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_schemas/__init__.py +0 -0
  40. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_schemas/application_database.py +0 -0
  41. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_schemas/system_database.py +0 -0
  42. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_serialization.py +0 -0
  43. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_sys_db.py +0 -0
  44. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_sys_db_postgres.py +0 -0
  45. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_sys_db_sqlite.py +0 -0
  46. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
  47. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  48. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  49. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  50. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  51. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/migrations/create_table.py.dbos +0 -0
  52. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  53. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_utils.py +0 -0
  54. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/_workflow_commands.py +0 -0
  55. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/cli/_github_init.py +0 -0
  56. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/cli/_template_init.py +0 -0
  57. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/cli/migration.py +0 -0
  58. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/dbos-config.schema.json +0 -0
  59. {dbos-2.3.0a3 → dbos-2.3.0a5}/dbos/py.typed +0 -0
  60. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/__init__.py +0 -0
  61. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/atexit_no_ctor.py +0 -0
  62. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/atexit_no_launch.py +0 -0
  63. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/classdefs.py +0 -0
  64. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/client_collateral.py +0 -0
  65. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/client_worker.py +0 -0
  66. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/conftest.py +0 -0
  67. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/dupname_classdefs1.py +0 -0
  68. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/dupname_classdefsa.py +0 -0
  69. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/more_classdefs.py +0 -0
  70. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/queuedworkflow.py +0 -0
  71. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/script_without_fastapi.py +0 -0
  72. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_admin_server.py +0 -0
  73. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_async.py +0 -0
  74. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_async_workflow_management.py +0 -0
  75. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_classdecorators.py +0 -0
  76. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_cli.py +0 -0
  77. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_client.py +0 -0
  78. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_concurrency.py +0 -0
  79. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_config.py +0 -0
  80. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_croniter.py +0 -0
  81. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_dbos.py +0 -0
  82. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_debouncer.py +0 -0
  83. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_debug.py +0 -0
  84. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_docker_secrets.py +0 -0
  85. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_failures.py +0 -0
  86. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_fastapi.py +0 -0
  87. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_fastapi_roles.py +0 -0
  88. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_flask.py +0 -0
  89. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_kafka.py +0 -0
  90. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_outcome.py +0 -0
  91. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_package.py +0 -0
  92. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_scheduler.py +0 -0
  93. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_schema_migration.py +0 -0
  94. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_singleton.py +0 -0
  95. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_sqlalchemy.py +0 -0
  96. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_streaming.py +0 -0
  97. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_workflow_introspection.py +0 -0
  98. {dbos-2.3.0a3 → dbos-2.3.0a5}/tests/test_workflow_management.py +0 -0
  99. {dbos-2.3.0a3 → dbos-2.3.0a5}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 2.3.0a3
3
+ Version: 2.3.0a5
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -68,30 +68,37 @@ def config_logger(config: "ConfigFile") -> None:
68
68
  )
69
69
  disable_otlp = config.get("telemetry", {}).get("disable_otlp", False) # type: ignore
70
70
 
71
- if not disable_otlp and otlp_logs_endpoints:
71
+ if not disable_otlp:
72
72
 
73
- from opentelemetry._logs import set_logger_provider
73
+ from opentelemetry._logs import get_logger_provider, set_logger_provider
74
74
  from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
75
75
  from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
76
76
  from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
77
77
  from opentelemetry.sdk.resources import Resource
78
78
  from opentelemetry.semconv.attributes.service_attributes import SERVICE_NAME
79
79
 
80
- log_provider = LoggerProvider(
81
- Resource.create(
82
- attributes={
83
- SERVICE_NAME: config["name"],
84
- }
85
- )
86
- )
87
- set_logger_provider(log_provider)
88
- for e in otlp_logs_endpoints:
89
- log_provider.add_log_record_processor(
90
- BatchLogRecordProcessor(
91
- OTLPLogExporter(endpoint=e),
92
- export_timeout_millis=5000,
80
+ # Only set up OTLP provider and exporter if endpoints are provided
81
+ log_provider = get_logger_provider()
82
+ if otlp_logs_endpoints is not None:
83
+ if not isinstance(log_provider, LoggerProvider):
84
+ log_provider = LoggerProvider(
85
+ Resource.create(
86
+ attributes={
87
+ SERVICE_NAME: config["name"],
88
+ }
89
+ )
90
+ )
91
+ set_logger_provider(log_provider)
92
+
93
+ for e in otlp_logs_endpoints:
94
+ log_provider.add_log_record_processor(
95
+ BatchLogRecordProcessor(
96
+ OTLPLogExporter(endpoint=e),
97
+ export_timeout_millis=5000,
98
+ )
93
99
  )
94
- )
100
+
101
+ # Even if no endpoints are provided, we still need a LoggerProvider to create the LoggingHandler
95
102
  global _otlp_handler
96
103
  _otlp_handler = LoggingHandler(logger_provider=log_provider)
97
104
 
@@ -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:
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
@@ -140,26 +140,12 @@ def start() -> None:
140
140
  Forward kill signals to children.
141
141
 
142
142
  When we receive a signal, send it to the entire process group of the child.
143
- If that doesn't work, SIGKILL them then exit.
144
143
  """
145
144
  # Send the signal to the child's entire process group
146
145
  if process.poll() is None:
147
146
  os.killpg(os.getpgid(process.pid), signum)
148
147
 
149
- # Give some time for the child to terminate
150
- for _ in range(10): # Wait up to 1 second
151
- if process.poll() is not None:
152
- break
153
- time.sleep(0.1)
154
-
155
- # If the child is still running, force kill it
156
- if process.poll() is None:
157
- try:
158
- os.killpg(os.getpgid(process.pid), signal.SIGKILL)
159
- except Exception:
160
- pass
161
-
162
- # Exit immediately
148
+ # Exit
163
149
  os._exit(process.returncode if process.returncode is not None else 1)
164
150
 
165
151
  # Configure the single handler only on Unix-like systems.
@@ -34,7 +34,7 @@ classifiers = [
34
34
  "Topic :: Software Development :: Libraries :: Python Modules",
35
35
  "Framework :: AsyncIO",
36
36
  ]
37
- version = "2.3.0a3"
37
+ version = "2.3.0a5"
38
38
 
39
39
  [project.license]
40
40
  text = "MIT"
@@ -1476,7 +1476,7 @@ def test_unsetting_timeout(dbos: DBOS) -> None:
1476
1476
  queue.enqueue(child)
1477
1477
 
1478
1478
  child_one, child_two = str(uuid.uuid4()), str(uuid.uuid4())
1479
- with SetWorkflowTimeout(1.0):
1479
+ with SetWorkflowTimeout(2.0):
1480
1480
  queue.enqueue(parent, child_one, child_two).get_result()
1481
1481
 
1482
1482
  # Verify child one, which has a propagated timeout, is cancelled
@@ -5,7 +5,6 @@ import pytest
5
5
  from fastapi import FastAPI
6
6
  from fastapi.testclient import TestClient
7
7
  from inline_snapshot import snapshot
8
- from opentelemetry._logs import set_logger_provider
9
8
  from opentelemetry.sdk import trace as tracesdk
10
9
  from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
11
10
  from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, InMemoryLogExporter
@@ -17,6 +16,7 @@ from dbos import DBOS, DBOSConfig
17
16
  from dbos._logger import dbos_logger
18
17
  from dbos._tracer import dbos_tracer
19
18
  from dbos._utils import GlobalParams
19
+ from tests.conftest import default_config
20
20
 
21
21
 
22
22
  @dataclass
@@ -65,7 +65,6 @@ def test_spans(config: DBOSConfig) -> None:
65
65
  log_processor = BatchLogRecordProcessor(log_exporter)
66
66
  log_provider = LoggerProvider()
67
67
  log_provider.add_log_record_processor(log_processor)
68
- set_logger_provider(log_provider)
69
68
  dbos_logger.addHandler(LoggingHandler(logger_provider=log_provider))
70
69
 
71
70
  test_workflow()
@@ -192,7 +191,6 @@ async def test_spans_async(dbos: DBOS) -> None:
192
191
  log_processor = BatchLogRecordProcessor(log_exporter)
193
192
  log_provider = LoggerProvider()
194
193
  log_provider.add_log_record_processor(log_processor)
195
- set_logger_provider(log_provider)
196
194
  dbos_logger.addHandler(LoggingHandler(logger_provider=log_provider))
197
195
 
198
196
  await test_workflow()
@@ -303,7 +301,6 @@ def test_wf_fastapi(dbos_fastapi: Tuple[DBOS, FastAPI]) -> None:
303
301
  log_processor = BatchLogRecordProcessor(log_exporter)
304
302
  log_provider = LoggerProvider()
305
303
  log_provider.add_log_record_processor(log_processor)
306
- set_logger_provider(log_provider)
307
304
  dbos_logger.addHandler(LoggingHandler(logger_provider=log_provider))
308
305
 
309
306
  client = TestClient(app)
@@ -378,7 +375,6 @@ def test_disable_otlp_no_spans(config: DBOSConfig) -> None:
378
375
  log_processor = BatchLogRecordProcessor(log_exporter)
379
376
  log_provider = LoggerProvider()
380
377
  log_provider.add_log_record_processor(log_processor)
381
- set_logger_provider(log_provider)
382
378
  dbos_logger.addHandler(LoggingHandler(logger_provider=log_provider))
383
379
 
384
380
  test_workflow()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes