|
9 | 9 | from unittest.mock import MagicMock, patch |
10 | 10 |
|
11 | 11 | from amazon.opentelemetry.distro.aws_opentelemetry_configurator import APPLICATION_SIGNALS_ENABLED_CONFIG |
12 | | -from amazon.opentelemetry.distro.aws_opentelemetry_distro import ( |
13 | | - AwsOpenTelemetryDistro, |
14 | | -) |
| 12 | +from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro |
15 | 13 | from opentelemetry import propagate |
16 | | -from opentelemetry.distro import OpenTelemetryDistro |
17 | 14 | from opentelemetry.environment_variables import ( |
18 | 15 | OTEL_LOGS_EXPORTER, |
19 | 16 | OTEL_METRICS_EXPORTER, |
@@ -59,6 +56,8 @@ def setUp(self): |
59 | 56 | "DJANGO_SETTINGS_MODULE", |
60 | 57 | OTEL_EXPORTER_OTLP_ENDPOINT, |
61 | 58 | OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, |
| 59 | + "AWS_AGENTIC_INSTRUMENTATION_OPT_IN", |
| 60 | + "CREWAI_DISABLE_TELEMETRY", |
62 | 61 | ] |
63 | 62 |
|
64 | 63 | # First, save all current values |
@@ -489,14 +488,116 @@ def test_application_signals_dimensions_disabled_with_agent_observability( |
489 | 488 | def test_agent_observability_respects_custom_disabled_instrumentations(self): |
490 | 489 | os.environ[OTEL_PYTHON_DISABLED_INSTRUMENTATIONS] = "custom_lib" |
491 | 490 | self._configure_with_agent_observability() |
492 | | - self.assertEqual(os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS), "custom_lib") |
| 491 | + disabled = os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") |
| 492 | + self.assertTrue(disabled.startswith("custom_lib")) |
493 | 493 |
|
494 | 494 | def test_base_otlp_endpoint_does_not_prevent_specific_endpoints(self): |
495 | 495 | os.environ[OTEL_EXPORTER_OTLP_ENDPOINT] = "http://my-collector:4318" |
496 | 496 | self._configure_with_agent_observability() |
497 | 497 | self.assertIn(OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, os.environ) |
498 | 498 | self.assertIn(OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, os.environ) |
499 | 499 |
|
| 500 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.entry_points") |
| 501 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region") |
| 502 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled") |
| 503 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed") |
| 504 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") |
| 505 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") |
| 506 | + def test_auto_detect_disables_native_when_thirdparty_registered( |
| 507 | + self, mock_super, mock_patches, mock_installed, mock_agent, mock_region, mock_eps |
| 508 | + ): |
| 509 | + """When a third-party instrumentor is registered, the corresponding AWS native one should be disabled.""" |
| 510 | + mock_agent.return_value = True |
| 511 | + mock_region.return_value = "us-east-1" |
| 512 | + mock_installed.return_value = False |
| 513 | + |
| 514 | + mock_langchain_ep = MagicMock() |
| 515 | + mock_langchain_ep.name = "langchain" |
| 516 | + mock_crewai_ep = MagicMock() |
| 517 | + mock_crewai_ep.name = "crewai" |
| 518 | + mock_eps.return_value = [mock_langchain_ep, mock_crewai_ep] |
| 519 | + |
| 520 | + AwsOpenTelemetryDistro()._configure() |
| 521 | + |
| 522 | + disabled = os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") |
| 523 | + self.assertIn("aws_langchain", disabled) |
| 524 | + self.assertIn("aws_crewai", disabled) |
| 525 | + self.assertNotIn("aws_mcp", disabled) |
| 526 | + |
| 527 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.entry_points") |
| 528 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region") |
| 529 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled") |
| 530 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed") |
| 531 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") |
| 532 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") |
| 533 | + def test_auto_detect_no_thirdparty_no_native_disabled( |
| 534 | + self, mock_super, mock_patches, mock_installed, mock_agent, mock_region, mock_eps |
| 535 | + ): |
| 536 | + """When no third-party instrumentors are registered, no AWS native ones should be disabled.""" |
| 537 | + mock_agent.return_value = True |
| 538 | + mock_region.return_value = "us-east-1" |
| 539 | + mock_installed.return_value = False |
| 540 | + mock_eps.return_value = [] |
| 541 | + |
| 542 | + AwsOpenTelemetryDistro()._configure() |
| 543 | + |
| 544 | + disabled = os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") |
| 545 | + self.assertNotIn("aws_crewai", disabled) |
| 546 | + self.assertNotIn("aws_langchain", disabled) |
| 547 | + self.assertNotIn("aws_llama-index", disabled) |
| 548 | + self.assertNotIn("aws_mcp", disabled) |
| 549 | + self.assertNotIn("aws_openai_agents", disabled) |
| 550 | + |
| 551 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.entry_points") |
| 552 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region") |
| 553 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled") |
| 554 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed") |
| 555 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") |
| 556 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") |
| 557 | + def test_prefer_native_disables_thirdparty( |
| 558 | + self, mock_super, mock_patches, mock_installed, mock_agent, mock_region, mock_eps |
| 559 | + ): |
| 560 | + """When AWS_AGENTIC_INSTRUMENTATION_OPT_IN=true, third-party instrumentors should be disabled.""" |
| 561 | + mock_agent.return_value = True |
| 562 | + mock_region.return_value = "us-east-1" |
| 563 | + mock_installed.return_value = False |
| 564 | + os.environ["AWS_AGENTIC_INSTRUMENTATION_OPT_IN"] = "true" |
| 565 | + |
| 566 | + mock_langchain_ep = MagicMock() |
| 567 | + mock_langchain_ep.name = "langchain" |
| 568 | + mock_eps.return_value = [mock_langchain_ep] |
| 569 | + |
| 570 | + AwsOpenTelemetryDistro()._configure() |
| 571 | + |
| 572 | + disabled = os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") |
| 573 | + self.assertIn("langchain", disabled) |
| 574 | + self.assertNotIn("aws_langchain", disabled) |
| 575 | + |
| 576 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.entry_points") |
| 577 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region") |
| 578 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled") |
| 579 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed") |
| 580 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") |
| 581 | + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") |
| 582 | + def test_mutual_exclusion_appends_to_user_disabled( |
| 583 | + self, mock_super, mock_patches, mock_installed, mock_agent, mock_region, mock_eps |
| 584 | + ): |
| 585 | + """Mutual exclusion disables should append to user-provided OTEL_PYTHON_DISABLED_INSTRUMENTATIONS.""" |
| 586 | + mock_agent.return_value = True |
| 587 | + mock_region.return_value = "us-east-1" |
| 588 | + mock_installed.return_value = False |
| 589 | + os.environ[OTEL_PYTHON_DISABLED_INSTRUMENTATIONS] = "my_custom_lib" |
| 590 | + |
| 591 | + mock_langchain_ep = MagicMock() |
| 592 | + mock_langchain_ep.name = "langchain" |
| 593 | + mock_eps.return_value = [mock_langchain_ep] |
| 594 | + |
| 595 | + AwsOpenTelemetryDistro()._configure() |
| 596 | + |
| 597 | + disabled = os.environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") |
| 598 | + self.assertTrue(disabled.startswith("my_custom_lib,")) |
| 599 | + self.assertIn("aws_langchain", disabled) |
| 600 | + |
500 | 601 | def _configure_with_agent_observability(self, region="us-west-2"): |
501 | 602 | with patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure"), patch( |
502 | 603 | "amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" |
|
0 commit comments