11from dataclasses import dataclass , field
2- from typing import Optional , Tuple
2+ from typing import Optional
33
44import pytest
55from fastapi import FastAPI
66from fastapi .testclient import TestClient
77from inline_snapshot import snapshot
8- from opentelemetry .sdk import trace as tracesdk
9- from opentelemetry .sdk ._logs import LoggerProvider , LoggingHandler
10- from opentelemetry .sdk ._logs .export import BatchLogRecordProcessor , InMemoryLogExporter
11- from opentelemetry .sdk .trace .export import SimpleSpanProcessor
12- from opentelemetry .sdk .trace .export .in_memory_span_exporter import InMemorySpanExporter
8+ from opentelemetry import trace
139from opentelemetry .trace .span import format_trace_id
1410
1511from dbos import DBOS , DBOSConfig
16- from dbos ._logger import dbos_logger
17- from dbos ._tracer import dbos_tracer
1812from dbos ._utils import GlobalParams
19- from tests .conftest import default_config
13+ from tests .conftest import TestOtelType
2014
2115
2216@dataclass
@@ -26,18 +20,18 @@ class BasicSpan:
2620 parent_id : Optional [int ] = field (repr = False , compare = False , default = None )
2721
2822
29- def test_spans (config : DBOSConfig ) -> None :
30- exporter = InMemorySpanExporter ()
31- span_processor = SimpleSpanProcessor (exporter )
32- provider = tracesdk .TracerProvider ()
33- provider .add_span_processor (span_processor )
34- dbos_tracer .set_provider (provider )
23+ def test_spans (
24+ config : DBOSConfig , setup_in_memory_otlp_collector : TestOtelType
25+ ) -> None :
26+ exporter , log_processor , log_exporter = setup_in_memory_otlp_collector
3527
3628 DBOS .destroy (destroy_registry = True )
3729 config ["otlp_attributes" ] = {"foo" : "bar" }
30+ config ["enable_otlp" ] = True
3831 DBOS (config = config )
3932 DBOS .launch ()
4033
34+ provider = trace .get_tracer_provider ()
4135 my_tracer = provider .get_tracer ("dbos" )
4236
4337 @DBOS .workflow ()
@@ -60,12 +54,9 @@ def test_step() -> None:
6054 DBOS .logger .info ("This is a test_step" )
6155 return
6256
63- # Set up in-memory log exporter
64- log_exporter = InMemoryLogExporter () # type: ignore
65- log_processor = BatchLogRecordProcessor (log_exporter )
66- log_provider = LoggerProvider ()
67- log_provider .add_log_record_processor (log_processor )
68- dbos_logger .addHandler (LoggingHandler (logger_provider = log_provider ))
57+ log_processor .force_flush (timeout_millis = 5000 )
58+ log_exporter .clear () # Clear any logs generated during setup
59+ exporter .clear ()
6960
7061 test_workflow ()
7162
@@ -157,13 +148,18 @@ def test_step() -> None:
157148
158149
159150@pytest .mark .asyncio
160- async def test_spans_async (dbos : DBOS ) -> None :
161- exporter = InMemorySpanExporter ()
162- span_processor = SimpleSpanProcessor (exporter )
163- provider = tracesdk .TracerProvider ()
164- provider .add_span_processor (span_processor )
165- dbos_tracer .set_provider (provider )
151+ async def test_spans_async (
152+ config : DBOSConfig , setup_in_memory_otlp_collector : TestOtelType
153+ ) -> None :
154+ exporter , log_processor , log_exporter = setup_in_memory_otlp_collector
155+
156+ DBOS .destroy (destroy_registry = True )
157+ config ["otlp_attributes" ] = {"foo" : "bar" }
158+ config ["enable_otlp" ] = True
159+ DBOS (config = config )
160+ DBOS .launch ()
166161
162+ provider = trace .get_tracer_provider ()
167163 my_tracer = provider .get_tracer ("dbos" )
168164
169165 @DBOS .workflow ()
@@ -186,12 +182,9 @@ async def test_step() -> None:
186182 DBOS .logger .info ("This is a test_step" )
187183 return
188184
189- # Set up in-memory log exporter
190- log_exporter = InMemoryLogExporter () # type: ignore
191- log_processor = BatchLogRecordProcessor (log_exporter )
192- log_provider = LoggerProvider ()
193- log_provider .add_log_record_processor (log_processor )
194- dbos_logger .addHandler (LoggingHandler (logger_provider = log_provider ))
185+ log_processor .force_flush (timeout_millis = 5000 )
186+ log_exporter .clear () # Clear any logs generated during setup
187+ exporter .clear ()
195188
196189 await test_workflow ()
197190
@@ -281,27 +274,26 @@ async def test_step() -> None:
281274 )
282275
283276
284- def test_wf_fastapi (dbos_fastapi : Tuple [DBOS , FastAPI ]) -> None :
285- dbos , app = dbos_fastapi
277+ def test_wf_fastapi (
278+ config : DBOSConfig , setup_in_memory_otlp_collector : TestOtelType
279+ ) -> None :
280+ exporter , log_processor , log_exporter = setup_in_memory_otlp_collector
281+
282+ DBOS .destroy (destroy_registry = True )
283+ config ["enable_otlp" ] = True
284+ app = FastAPI ()
285+ dbos = DBOS (fastapi = app , config = config )
286+ DBOS .launch ()
286287
287288 @app .get ("/wf" )
288289 @DBOS .workflow ()
289290 def test_workflow_endpoint () -> str :
290291 dbos .logger .info ("This is a test_workflow_endpoint" )
291292 return "test"
292293
293- exporter = InMemorySpanExporter ()
294- span_processor = SimpleSpanProcessor (exporter )
295- provider = tracesdk .TracerProvider ()
296- provider .add_span_processor (span_processor )
297- dbos_tracer .set_provider (provider )
298-
299- # Set up in-memory log exporter
300- log_exporter = InMemoryLogExporter () # type: ignore
301- log_processor = BatchLogRecordProcessor (log_exporter )
302- log_provider = LoggerProvider ()
303- log_provider .add_log_record_processor (log_processor )
304- dbos_logger .addHandler (LoggingHandler (logger_provider = log_provider ))
294+ log_processor .force_flush (timeout_millis = 5000 )
295+ log_exporter .clear () # Clear any logs generated during setup
296+ exporter .clear ()
305297
306298 client = TestClient (app )
307299 response = client .get ("/wf" )
@@ -310,7 +302,8 @@ def test_workflow_endpoint() -> str:
310302
311303 log_processor .force_flush (timeout_millis = 5000 )
312304 logs = log_exporter .get_finished_logs ()
313- assert len (logs ) == 1
305+
306+ assert len (logs ) == 2
314307 assert logs [0 ].log_record .attributes is not None
315308 assert (
316309 logs [0 ].log_record .attributes ["applicationVersion" ] == DBOS .application_version
@@ -347,7 +340,11 @@ def test_workflow_endpoint() -> str:
347340 assert logs [0 ].log_record .trace_id == spans [0 ].context .trace_id
348341
349342
350- def test_disable_otlp_no_spans (config : DBOSConfig ) -> None :
343+ def test_disable_otlp_no_spans (
344+ config : DBOSConfig , setup_in_memory_otlp_collector : TestOtelType
345+ ) -> None :
346+ exporter , log_processor , log_exporter = setup_in_memory_otlp_collector
347+
351348 DBOS .destroy (destroy_registry = True )
352349 config ["otlp_attributes" ] = {"foo" : "bar" }
353350 config ["enable_otlp" ] = False
@@ -364,18 +361,9 @@ def test_step() -> None:
364361 DBOS .logger .info ("This is a test_step" )
365362 return
366363
367- exporter = InMemorySpanExporter ()
368- span_processor = SimpleSpanProcessor (exporter )
369- provider = tracesdk .TracerProvider ()
370- provider .add_span_processor (span_processor )
371- dbos_tracer .set_provider (provider )
372-
373- # Set up in-memory log exporter
374- log_exporter = InMemoryLogExporter () # type: ignore
375- log_processor = BatchLogRecordProcessor (log_exporter )
376- log_provider = LoggerProvider ()
377- log_provider .add_log_record_processor (log_processor )
378- dbos_logger .addHandler (LoggingHandler (logger_provider = log_provider ))
364+ log_processor .force_flush (timeout_millis = 5000 )
365+ log_exporter .clear () # Clear any logs generated during setup
366+ exporter .clear ()
379367
380368 test_workflow ()
381369
0 commit comments