Skip to content

Commit b5e08ae

Browse files
committed
add additional test case
1 parent 2c13cb3 commit b5e08ae

File tree

2 files changed

+64
-61
lines changed

2 files changed

+64
-61
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/patches/_starlette_patches.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from logging import Logger, getLogger
55
from typing import Collection
66

7-
from amazon.opentelemetry.distro._utils import AGENT_OBSERVABILITY_ENABLED
7+
from amazon.opentelemetry.distro._utils import is_agent_observability_enabled
88

99
_logger: Logger = getLogger(__name__)
1010

@@ -31,10 +31,10 @@ def patched_instrumentation_dependencies(self) -> Collection[str]:
3131
# Apply the patch
3232
StarletteInstrumentor.instrumentation_dependencies = patched_instrumentation_dependencies
3333

34-
# Patch to exclude http receive/send ASGI event spans, this Middleware instrumentation is injected
35-
# internally by Starlette Instrumentor, see:
34+
# Patch to exclude http receive/send ASGI event spans from Bedrock AgentCore,
35+
# this Middleware instrumentation is injected internally by Starlette Instrumentor, see:
3636
# https://github.com/open-telemetry/opentelemetry-python-contrib/blob/51da0a766e5d3cbc746189e10c9573163198cfcd/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py#L573
37-
if AGENT_OBSERVABILITY_ENABLED:
37+
if is_agent_observability_enabled():
3838
original_init = OpenTelemetryMiddleware.__init__
3939

4040
def patched_init(self, app, **kwargs):

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/patches/test_starlette_patches.py

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,74 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3-
from unittest import TestCase
3+
import unittest
44
from unittest.mock import MagicMock, patch
55

66
from amazon.opentelemetry.distro.patches._starlette_patches import _apply_starlette_instrumentation_patches
77

88

9-
class TestStarlettePatch(TestCase):
9+
class TestStarlettePatch(unittest.TestCase):
1010
"""Test the Starlette instrumentation patches."""
1111

12-
@patch("amazon.opentelemetry.distro.patches._starlette_patches.AGENT_OBSERVABILITY_ENABLED", True)
1312
@patch("amazon.opentelemetry.distro.patches._starlette_patches._logger")
1413
def test_starlette_patch_applied_successfully(self, mock_logger):
1514
"""Test that the Starlette instrumentation patch is applied successfully."""
16-
# Create a mock StarletteInstrumentor class
17-
mock_instrumentor_class = MagicMock()
18-
mock_instrumentor_class.__name__ = "StarletteInstrumentor"
19-
20-
class MockMiddleware:
21-
def __init__(self, app, **kwargs):
22-
pass
23-
24-
mock_middleware_class = MockMiddleware
25-
original_init = mock_middleware_class.__init__
26-
27-
# Create mock modules
28-
mock_starlette_module = MagicMock()
29-
mock_starlette_module.StarletteInstrumentor = mock_instrumentor_class
30-
31-
mock_asgi_module = MagicMock()
32-
mock_asgi_module.OpenTelemetryMiddleware = mock_middleware_class
33-
34-
# Mock the imports
35-
with patch.dict(
36-
"sys.modules",
37-
{
38-
"opentelemetry.instrumentation.starlette": mock_starlette_module,
39-
"opentelemetry.instrumentation.asgi": mock_asgi_module,
40-
},
41-
):
42-
# Apply the patch
43-
_apply_starlette_instrumentation_patches()
44-
45-
# Verify the instrumentation_dependencies method was replaced
46-
self.assertTrue(hasattr(mock_instrumentor_class, "instrumentation_dependencies"))
47-
48-
# Test the patched method returns the expected value
49-
mock_instance = MagicMock()
50-
result = mock_instrumentor_class.instrumentation_dependencies(mock_instance)
51-
self.assertEqual(result, ("starlette >= 0.13",))
52-
53-
self.assertNotEqual(mock_middleware_class.__init__, original_init)
54-
55-
# Test middleware patching sets exclude flags
56-
mock_middleware_instance = MagicMock()
57-
mock_middleware_instance.exclude_receive_span = False
58-
mock_middleware_instance.exclude_send_span = False
59-
60-
mock_middleware_class.__init__(mock_middleware_instance, "app")
61-
62-
self.assertTrue(mock_middleware_instance.exclude_receive_span)
63-
self.assertTrue(mock_middleware_instance.exclude_send_span)
64-
65-
# Verify logging
66-
mock_logger.debug.assert_called_once_with(
67-
"Successfully patched Starlette instrumentation_dependencies method"
68-
)
15+
for agent_enabled in [True, False]:
16+
with self.subTest(agent_enabled=agent_enabled):
17+
with patch.dict("os.environ", {"AGENT_OBSERVABILITY_ENABLED": "true" if agent_enabled else "false"}):
18+
# Create a mock StarletteInstrumentor class
19+
mock_instrumentor_class = MagicMock()
20+
mock_instrumentor_class.__name__ = "StarletteInstrumentor"
21+
22+
def create_middleware_class():
23+
class MockMiddleware:
24+
def __init__(self, app, **kwargs):
25+
pass
26+
27+
return MockMiddleware
28+
29+
mock_middleware_class = create_middleware_class()
30+
31+
mock_starlette_module = MagicMock()
32+
mock_starlette_module.StarletteInstrumentor = mock_instrumentor_class
33+
34+
mock_asgi_module = MagicMock()
35+
mock_asgi_module.OpenTelemetryMiddleware = mock_middleware_class
36+
37+
with patch.dict(
38+
"sys.modules",
39+
{
40+
"opentelemetry.instrumentation.starlette": mock_starlette_module,
41+
"opentelemetry.instrumentation.asgi": mock_asgi_module,
42+
},
43+
):
44+
# Apply the patch
45+
_apply_starlette_instrumentation_patches()
46+
47+
# Verify the instrumentation_dependencies method was replaced
48+
self.assertTrue(hasattr(mock_instrumentor_class, "instrumentation_dependencies"))
49+
50+
# Test the patched method returns the expected value
51+
mock_instance = MagicMock()
52+
result = mock_instrumentor_class.instrumentation_dependencies(mock_instance)
53+
self.assertEqual(result, ("starlette >= 0.13",))
54+
55+
mock_middleware_instance = MagicMock()
56+
mock_middleware_instance.exclude_receive_span = False
57+
mock_middleware_instance.exclude_send_span = False
58+
mock_middleware_class.__init__(mock_middleware_instance, "app")
59+
60+
# Test middleware patching sets exclude flags
61+
if agent_enabled:
62+
self.assertTrue(mock_middleware_instance.exclude_receive_span)
63+
self.assertTrue(mock_middleware_instance.exclude_send_span)
64+
else:
65+
self.assertFalse(mock_middleware_instance.exclude_receive_span)
66+
self.assertFalse(mock_middleware_instance.exclude_send_span)
67+
68+
# Verify logging
69+
mock_logger.debug.assert_called_with(
70+
"Successfully patched Starlette instrumentation_dependencies method"
71+
)
6972

7073
@patch("amazon.opentelemetry.distro.patches._starlette_patches._logger")
7174
def test_starlette_patch_handles_import_error(self, mock_logger):
@@ -108,7 +111,7 @@ class MockStarletteInstrumentor(metaclass=ErrorMeta):
108111
args = mock_logger.warning.call_args[0]
109112
self.assertIn("Failed to apply Starlette instrumentation patches", args[0])
110113

111-
def test_starlette_patch_logs_failure_with_no_logger_patch(self): # pylint: disable=no-self-use
114+
def test_starlette_patch_logs_failure_with_no_logger_patch(self):
112115
"""Test that the patch handles exceptions gracefully without logger mock."""
113116
# Mock the import to fail
114117
with patch.dict("sys.modules", {"opentelemetry.instrumentation.starlette": None}):

0 commit comments

Comments
 (0)