|
25 | 25 | _customize_sampler, |
26 | 26 | _customize_span_exporter, |
27 | 27 | _customize_span_processors, |
| 28 | + _export_unsampled_span_for_agent_observability, |
28 | 29 | _export_unsampled_span_for_lambda, |
29 | 30 | _init_logging, |
30 | 31 | _is_application_signals_enabled, |
@@ -682,6 +683,78 @@ def test_export_unsampled_span_for_lambda(self): |
682 | 683 | os.environ.pop("OTEL_AWS_APPLICATION_SIGNALS_ENABLED", None) |
683 | 684 | os.environ.pop("AWS_LAMBDA_FUNCTION_NAME", None) |
684 | 685 |
|
| 686 | + def test_export_unsampled_span_for_agent_observability(self): |
| 687 | + mock_tracer_provider: TracerProvider = MagicMock() |
| 688 | + |
| 689 | + # Test when agent observability is disabled (default) |
| 690 | + _export_unsampled_span_for_agent_observability(mock_tracer_provider, Resource.get_empty()) |
| 691 | + self.assertEqual(mock_tracer_provider.add_span_processor.call_count, 0) |
| 692 | + |
| 693 | + # Test when agent observability is enabled with AWS endpoint (the default case) |
| 694 | + os.environ["AGENT_OBSERVABILITY_ENABLED"] = "true" |
| 695 | + os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "https://xray.us-east-1.amazonaws.com/v1/traces" |
| 696 | + _export_unsampled_span_for_agent_observability(mock_tracer_provider, Resource.get_empty()) |
| 697 | + self.assertEqual(mock_tracer_provider.add_span_processor.call_count, 1) |
| 698 | + processor: SpanProcessor = mock_tracer_provider.add_span_processor.call_args_list[0].args[0] |
| 699 | + self.assertIsInstance(processor, BatchUnsampledSpanProcessor) |
| 700 | + |
| 701 | + # Clean up |
| 702 | + os.environ.pop("AGENT_OBSERVABILITY_ENABLED", None) |
| 703 | + os.environ.pop("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", None) |
| 704 | + |
| 705 | + def test_export_unsampled_span_for_agent_observability_uses_aws_exporter(self): |
| 706 | + """Test that OTLPAwsSpanExporter is used for AWS endpoints""" |
| 707 | + mock_tracer_provider: TracerProvider = MagicMock() |
| 708 | + |
| 709 | + with patch( |
| 710 | + "amazon.opentelemetry.distro.aws_opentelemetry_configurator.OTLPAwsSpanExporter" |
| 711 | + ) as mock_aws_exporter: |
| 712 | + with patch( |
| 713 | + "amazon.opentelemetry.distro.aws_opentelemetry_configurator.BatchUnsampledSpanProcessor" |
| 714 | + ) as mock_processor: |
| 715 | + with patch( |
| 716 | + "amazon.opentelemetry.distro.aws_opentelemetry_configurator.get_logger_provider" |
| 717 | + ) as mock_logger_provider: |
| 718 | + os.environ["AGENT_OBSERVABILITY_ENABLED"] = "true" |
| 719 | + os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "https://xray.us-east-1.amazonaws.com/v1/traces" |
| 720 | + |
| 721 | + _export_unsampled_span_for_agent_observability(mock_tracer_provider, Resource.get_empty()) |
| 722 | + |
| 723 | + # Verify OTLPAwsSpanExporter is created with correct parameters |
| 724 | + mock_aws_exporter.assert_called_once_with( |
| 725 | + endpoint="https://xray.us-east-1.amazonaws.com/v1/traces", |
| 726 | + logger_provider=mock_logger_provider.return_value, |
| 727 | + ) |
| 728 | + # Verify BatchUnsampledSpanProcessor wraps the exporter |
| 729 | + mock_processor.assert_called_once_with(span_exporter=mock_aws_exporter.return_value) |
| 730 | + # Verify processor is added to tracer provider |
| 731 | + mock_tracer_provider.add_span_processor.assert_called_once_with(mock_processor.return_value) |
| 732 | + |
| 733 | + # Clean up |
| 734 | + os.environ.pop("AGENT_OBSERVABILITY_ENABLED", None) |
| 735 | + os.environ.pop("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", None) |
| 736 | + |
| 737 | + def test_customize_span_processors_with_agent_observability(self): |
| 738 | + """Test that _customize_span_processors calls _export_unsampled_span_for_agent_observability""" |
| 739 | + mock_tracer_provider: TracerProvider = MagicMock() |
| 740 | + |
| 741 | + with patch( |
| 742 | + "amazon.opentelemetry.distro.aws_opentelemetry_configurator._export_unsampled_span_for_agent_observability" |
| 743 | + ) as mock_agent_observability: |
| 744 | + # Test that agent observability function is NOT called when disabled |
| 745 | + os.environ.pop("AGENT_OBSERVABILITY_ENABLED", None) |
| 746 | + _customize_span_processors(mock_tracer_provider, Resource.get_empty()) |
| 747 | + mock_agent_observability.assert_not_called() |
| 748 | + |
| 749 | + # Test that agent observability function is called when enabled |
| 750 | + mock_agent_observability.reset_mock() |
| 751 | + os.environ["AGENT_OBSERVABILITY_ENABLED"] = "true" |
| 752 | + _customize_span_processors(mock_tracer_provider, Resource.get_empty()) |
| 753 | + mock_agent_observability.assert_called_once_with(mock_tracer_provider, Resource.get_empty()) |
| 754 | + |
| 755 | + # Clean up |
| 756 | + os.environ.pop("AGENT_OBSERVABILITY_ENABLED", None) |
| 757 | + |
685 | 758 | def test_customize_metric_exporter(self): |
686 | 759 | metric_readers = [] |
687 | 760 | views = [] |
|
0 commit comments