2121from opentelemetry .metrics import NoOpMeterProvider , get_meter_provider
2222from opentelemetry .sdk .metrics ._internal .export import PeriodicExportingMetricReader
2323from opentelemetry .sdk .metrics .export import InMemoryMetricReader
24- from opentelemetry .sdk .trace import ReadableSpan , SpanProcessor
24+ from opentelemetry .sdk .trace import ReadableSpan , SpanProcessor , SynchronousMultiSpanProcessor
2525from opentelemetry .sdk .trace .export import (
2626 BatchSpanProcessor ,
2727 ConsoleSpanExporter ,
4646from logfire ._internal .exporters .console import ShowParentsConsoleSpanExporter
4747from logfire ._internal .exporters .fallback import FallbackSpanExporter
4848from logfire ._internal .exporters .file import WritingFallbackWarning
49- from logfire ._internal .exporters .processor_wrapper import MainSpanProcessorWrapper
49+ from logfire ._internal .exporters .processor_wrapper import (
50+ CheckSuppressInstrumentationProcessorWrapper ,
51+ MainSpanProcessorWrapper ,
52+ )
5053from logfire ._internal .exporters .quiet_metrics import QuietMetricExporter
5154from logfire ._internal .exporters .remove_pending import RemovePendingSpansExporter
5255from logfire ._internal .exporters .wrapper import WrapperSpanExporter
@@ -570,11 +573,9 @@ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
570573 )
571574 wait_for_check_token_thread ()
572575
573- send_to_logfire_processor , * _ = get_span_processors ()
576+ batch_span_processor , * _ = get_span_processors ()
574577 # It's OK if these processor/exporter types change.
575578 # We just need access to the FallbackSpanExporter either way to swap out its underlying exporter.
576- assert isinstance (send_to_logfire_processor , MainSpanProcessorWrapper )
577- batch_span_processor = send_to_logfire_processor .processor
578579 assert isinstance (batch_span_processor , BatchSpanProcessor )
579580 exporter = batch_span_processor .span_exporter
580581 assert isinstance (exporter , WrapperSpanExporter )
@@ -622,9 +623,7 @@ def configure_tracking_exporter():
622623 )
623624 wait_for_check_token_thread ()
624625
625- send_to_logfire_processor , * _ = get_span_processors ()
626- assert isinstance (send_to_logfire_processor , MainSpanProcessorWrapper )
627- batch_span_processor = send_to_logfire_processor .processor
626+ batch_span_processor , * _ = get_span_processors ()
628627 assert isinstance (batch_span_processor , BatchSpanProcessor )
629628
630629 batch_span_processor .span_exporter = TrackingExporter ()
@@ -1460,16 +1459,19 @@ def test_default_exporters(monkeypatch: pytest.MonkeyPatch):
14601459
14611460 [console_processor , send_to_logfire_processor , pending_span_processor ] = get_span_processors ()
14621461
1463- assert isinstance (console_processor , MainSpanProcessorWrapper )
1464- assert isinstance (console_processor .processor , SimpleSpanProcessor )
1465- assert isinstance (console_processor .processor .span_exporter , ShowParentsConsoleSpanExporter )
1462+ assert isinstance (console_processor , SimpleSpanProcessor )
1463+ assert isinstance (console_processor .span_exporter , ShowParentsConsoleSpanExporter )
14661464
1467- assert isinstance (send_to_logfire_processor , MainSpanProcessorWrapper )
1468- assert isinstance (send_to_logfire_processor .processor , BatchSpanProcessor )
1469- assert isinstance (send_to_logfire_processor .processor .span_exporter , RemovePendingSpansExporter )
1465+ assert isinstance (send_to_logfire_processor , BatchSpanProcessor )
1466+ assert isinstance (send_to_logfire_processor .span_exporter , RemovePendingSpansExporter )
14701467
14711468 assert isinstance (pending_span_processor , PendingSpanProcessor )
1472- assert pending_span_processor .other_processors == (console_processor , send_to_logfire_processor )
1469+ assert isinstance (pending_span_processor .processor , MainSpanProcessorWrapper )
1470+ assert isinstance (pending_span_processor .processor .processor , SynchronousMultiSpanProcessor )
1471+ assert pending_span_processor .processor .processor ._span_processors == ( # type: ignore
1472+ console_processor ,
1473+ send_to_logfire_processor ,
1474+ )
14731475
14741476 [logfire_metric_reader ] = get_metric_readers ()
14751477 assert isinstance (logfire_metric_reader , PeriodicExportingMetricReader )
@@ -1487,9 +1489,8 @@ def test_custom_exporters():
14871489 metrics = logfire .MetricsOptions (additional_readers = [custom_metric_reader ]),
14881490 )
14891491
1490- [custom_processor_wrapper ] = get_span_processors ()
1491- assert isinstance (custom_processor_wrapper , MainSpanProcessorWrapper )
1492- assert custom_processor_wrapper .processor is custom_span_processor
1492+ [custom_span_processor2 ] = get_span_processors ()
1493+ assert custom_span_processor2 is custom_span_processor
14931494
14941495 [custom_metric_reader2 ] = get_metric_readers ()
14951496 assert custom_metric_reader2 is custom_metric_reader
@@ -1501,10 +1502,9 @@ def test_otel_exporter_otlp_endpoint_env_var():
15011502 logfire .configure (send_to_logfire = False , console = False )
15021503
15031504 [otel_processor ] = get_span_processors ()
1504- assert isinstance (otel_processor , MainSpanProcessorWrapper )
1505- assert isinstance (otel_processor .processor , BatchSpanProcessor )
1506- assert isinstance (otel_processor .processor .span_exporter , OTLPSpanExporter )
1507- assert otel_processor .processor .span_exporter ._endpoint == 'otel_endpoint/v1/traces' # type: ignore
1505+ assert isinstance (otel_processor , BatchSpanProcessor )
1506+ assert isinstance (otel_processor .span_exporter , OTLPSpanExporter )
1507+ assert otel_processor .span_exporter ._endpoint == 'otel_endpoint/v1/traces' # type: ignore
15081508
15091509 [otel_metric_reader ] = get_metric_readers ()
15101510 assert isinstance (otel_metric_reader , PeriodicExportingMetricReader )
@@ -1531,10 +1531,9 @@ def test_otel_metrics_exporter_env_var():
15311531 logfire .configure (send_to_logfire = False , console = False )
15321532
15331533 [otel_processor ] = get_span_processors ()
1534- assert isinstance (otel_processor , MainSpanProcessorWrapper )
1535- assert isinstance (otel_processor .processor , BatchSpanProcessor )
1536- assert isinstance (otel_processor .processor .span_exporter , OTLPSpanExporter )
1537- assert otel_processor .processor .span_exporter ._endpoint == 'otel_endpoint3/v1/traces' # type: ignore
1534+ assert isinstance (otel_processor , BatchSpanProcessor )
1535+ assert isinstance (otel_processor .span_exporter , OTLPSpanExporter )
1536+ assert otel_processor .span_exporter ._endpoint == 'otel_endpoint3/v1/traces' # type: ignore
15381537
15391538 assert len (list (get_metric_readers ())) == 0
15401539
@@ -1545,10 +1544,9 @@ def test_otel_exporter_otlp_traces_endpoint_env_var():
15451544 logfire .configure (send_to_logfire = False , console = False )
15461545
15471546 [otel_processor ] = get_span_processors ()
1548- assert isinstance (otel_processor , MainSpanProcessorWrapper )
1549- assert isinstance (otel_processor .processor , BatchSpanProcessor )
1550- assert isinstance (otel_processor .processor .span_exporter , OTLPSpanExporter )
1551- assert otel_processor .processor .span_exporter ._endpoint == 'otel_traces_endpoint' # type: ignore
1547+ assert isinstance (otel_processor , BatchSpanProcessor )
1548+ assert isinstance (otel_processor .span_exporter , OTLPSpanExporter )
1549+ assert otel_processor .span_exporter ._endpoint == 'otel_traces_endpoint' # type: ignore
15521550
15531551 assert len (list (get_metric_readers ())) == 0
15541552
@@ -1576,7 +1574,12 @@ def test_metrics_false(monkeypatch: pytest.MonkeyPatch):
15761574
15771575
15781576def get_span_processors () -> Iterable [SpanProcessor ]:
1579- return get_tracer_provider ().provider ._active_span_processor ._span_processors # type: ignore
1577+ [first , * rest ] = get_tracer_provider ().provider ._active_span_processor ._span_processors # type: ignore
1578+ assert isinstance (first , CheckSuppressInstrumentationProcessorWrapper )
1579+ assert isinstance (first .processor , MainSpanProcessorWrapper )
1580+ assert isinstance (first .processor .processor , SynchronousMultiSpanProcessor )
1581+
1582+ return [* first .processor .processor ._span_processors , * rest ] # type: ignore
15801583
15811584
15821585def get_metric_readers () -> Iterable [SpanProcessor ]:
0 commit comments