5050from opentelemetry .exporter .otlp .proto .http ._log_exporter import OTLPLogExporter
5151from opentelemetry .exporter .otlp .proto .http .metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter
5252from opentelemetry .exporter .otlp .proto .http .trace_exporter import OTLPSpanExporter
53+ from opentelemetry .processor .baggage import BaggageSpanProcessor
5354from opentelemetry .sdk .environment_variables import OTEL_TRACES_SAMPLER , OTEL_TRACES_SAMPLER_ARG
5455from opentelemetry .sdk .metrics ._internal .export import PeriodicExportingMetricReader
5556from opentelemetry .sdk .resources import Resource
@@ -340,6 +341,73 @@ def test_customize_span_exporter_with_agent_observability(self):
340341 os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
341342 os .environ .pop (OTEL_EXPORTER_OTLP_TRACES_ENDPOINT , None )
342343
344+ def test_customize_span_processors_with_agent_observability (self ):
345+ mock_tracer_provider : TracerProvider = MagicMock ()
346+
347+ # Test that BaggageSpanProcessor is not added when agent observability is disabled
348+ os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
349+ _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
350+ self .assertEqual (mock_tracer_provider .add_span_processor .call_count , 0 )
351+
352+ # Reset mock for next test
353+ mock_tracer_provider .reset_mock ()
354+
355+ # Test that BaggageSpanProcessor is added when agent observability is enabled
356+ os .environ ["AGENT_OBSERVABILITY_ENABLED" ] = "true"
357+ _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
358+ self .assertEqual (mock_tracer_provider .add_span_processor .call_count , 1 )
359+
360+ # Verify the added processor is BaggageSpanProcessor
361+ added_processor = mock_tracer_provider .add_span_processor .call_args_list [0 ].args [0 ]
362+ self .assertIsInstance (added_processor , BaggageSpanProcessor )
363+
364+ # Clean up
365+ os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
366+
367+ def test_baggage_span_processor_session_id_filtering (self ):
368+ """Test that BaggageSpanProcessor only set session.id filter by default"""
369+
370+ # Set up agent observability
371+ os .environ ["AGENT_OBSERVABILITY_ENABLED" ] = "true"
372+
373+ # Create a new tracer provider for this test
374+ tracer_provider = TracerProvider ()
375+
376+ # Add our span processors
377+ _customize_span_processors (tracer_provider , Resource .get_empty ())
378+
379+ # Verify that the BaggageSpanProcessor was added
380+ # The _active_span_processor is a composite processor containing all processors
381+ active_processor = tracer_provider ._active_span_processor
382+
383+ # Check if it's a composite processor with multiple processors
384+ if hasattr (active_processor , "_span_processors" ):
385+ processors = active_processor ._span_processors
386+ else :
387+ # If it's a single processor, wrap it in a list
388+ processors = [active_processor ]
389+
390+ baggage_processors = [
391+ processor for processor in processors if processor .__class__ .__name__ == "BaggageSpanProcessor"
392+ ]
393+ self .assertEqual (len (baggage_processors ), 1 )
394+
395+ # Verify the predicate function only accepts session.id
396+ baggage_processor = baggage_processors [0 ]
397+ predicate = baggage_processor ._baggage_key_predicate
398+
399+ # Test the predicate function directly
400+ self .assertTrue (predicate ("session.id" ))
401+ self .assertFalse (predicate ("user.id" ))
402+ self .assertFalse (predicate ("request.id" ))
403+ self .assertFalse (predicate ("other.key" ))
404+ self .assertFalse (predicate ("" ))
405+ self .assertFalse (predicate ("session" ))
406+ self .assertFalse (predicate ("id" ))
407+
408+ # Clean up
409+ os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
410+
343411 def test_customize_span_exporter_sigv4 (self ):
344412
345413 traces_good_endpoints = [
@@ -574,9 +642,18 @@ def capture_exporter(*args, **kwargs):
574642
575643 def test_customize_span_processors (self ):
576644 mock_tracer_provider : TracerProvider = MagicMock ()
645+ # Clean up environment to ensure consistent test state
646+ os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
647+ os .environ .pop ("OTEL_AWS_APPLICATION_SIGNALS_ENABLED" , None )
648+ os .environ .pop ("OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED" , None )
649+
577650 _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
578651 self .assertEqual (mock_tracer_provider .add_span_processor .call_count , 0 )
579652
653+ # Reset mock for next test
654+ mock_tracer_provider .reset_mock ()
655+
656+ # Test application signals only
580657 os .environ .setdefault ("OTEL_AWS_APPLICATION_SIGNALS_ENABLED" , "True" )
581658 os .environ .setdefault ("OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED" , "False" )
582659 _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
@@ -586,8 +663,27 @@ def test_customize_span_processors(self):
586663 second_processor : SpanProcessor = mock_tracer_provider .add_span_processor .call_args_list [1 ].args [0 ]
587664 self .assertIsInstance (second_processor , AwsSpanMetricsProcessor )
588665
666+ # Reset mock for next test
667+ mock_tracer_provider .reset_mock ()
668+
669+ # Test both agent observability and application signals enabled
670+ os .environ .setdefault ("AGENT_OBSERVABILITY_ENABLED" , "true" )
671+ _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
672+ self .assertEqual (mock_tracer_provider .add_span_processor .call_count , 3 )
673+
674+ # Verify processors are added in the expected order
675+ processors = [call .args [0 ] for call in mock_tracer_provider .add_span_processor .call_args_list ]
676+ self .assertIsInstance (processors [0 ], BaggageSpanProcessor ) # Agent observability processor added first
677+ self .assertIsInstance (processors [1 ], AttributePropagatingSpanProcessor ) # Application signals processors
678+ self .assertIsInstance (processors [2 ], AwsSpanMetricsProcessor )
679+
589680 def test_customize_span_processors_lambda (self ):
590681 mock_tracer_provider : TracerProvider = MagicMock ()
682+ # Clean up environment to ensure consistent test state
683+ os .environ .pop ("AGENT_OBSERVABILITY_ENABLED" , None )
684+ os .environ .pop ("OTEL_AWS_APPLICATION_SIGNALS_ENABLED" , None )
685+ os .environ .pop ("AWS_LAMBDA_FUNCTION_NAME" , None )
686+
591687 _customize_span_processors (mock_tracer_provider , Resource .get_empty ())
592688 self .assertEqual (mock_tracer_provider .add_span_processor .call_count , 0 )
593689
0 commit comments