Skip to content

Commit 1f4f476

Browse files
committed
test coverage and lint
1 parent e6c479e commit 1f4f476

File tree

2 files changed

+101
-7
lines changed

2 files changed

+101
-7
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/instrumentation/mcp/mcp_instrumentor.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33
from typing import Any, Callable, Collection, Dict, Tuple
44

5+
import mcp.types as types
56
from wrapt import register_post_import_hook, wrap_function_wrapper
67

78
from opentelemetry import trace
@@ -128,8 +129,6 @@ async def _wrap_handle_request(
128129

129130
@staticmethod
130131
def _generate_mcp_attributes(span: trace.Span, request: Any, is_client: bool) -> None:
131-
import mcp.types as types # pylint: disable=import-outside-toplevel,consider-using-from-import
132-
133132
operation = MCPOperations.UNKNOWN_OPERATION
134133

135134
if isinstance(request, types.ListToolsRequest):
@@ -185,9 +184,6 @@ def _extract_span_context_from_traceparent(traceparent: str):
185184

186185
@staticmethod
187186
def _get_mcp_operation(req: Any) -> str:
188-
189-
import mcp.types as types # pylint: disable=import-outside-toplevel,consider-using-from-import
190-
191187
span_name = "unknown"
192188

193189
if isinstance(req, types.ListToolsRequest):

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_mcpinstrumentor.py

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,8 @@ def __init__(self):
660660
self.root = self
661661
self.params = MockParams()
662662

663-
def model_dump(self, **kwargs):
663+
@staticmethod
664+
def model_dump(**kwargs):
664665
return {"method": "test", "params": {"name": "test_tool"}}
665666

666667
@classmethod
@@ -687,7 +688,8 @@ class MockRequestNoRoot:
687688
def __init__(self):
688689
self.params = MockParams()
689690

690-
def model_dump(self, **kwargs):
691+
@staticmethod
692+
def model_dump(**kwargs):
691693
return {"method": "test", "params": {"name": "test_tool"}}
692694

693695
@classmethod
@@ -883,6 +885,102 @@ def model_validate(cls, data):
883885
return cls(params=FakeParams(name=data["params"].get("name")))
884886

885887

888+
class TestMCPTypesCoverage(unittest.TestCase):
889+
"""Test isinstance checks in _generate_mcp_attributes and _get_mcp_operation"""
890+
891+
def setUp(self) -> None:
892+
self.instrumentor = MCPInstrumentor()
893+
self.mock_span = MagicMock()
894+
895+
def test_generate_mcp_attributes_list_tools(self) -> None:
896+
"""Test _generate_mcp_attributes with ListToolsRequest"""
897+
from amazon.opentelemetry.distro.instrumentation.mcp.semconv import MCPAttributes
898+
899+
class MockListToolsRequest:
900+
pass
901+
902+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
903+
mock_types.ListToolsRequest = MockListToolsRequest
904+
mock_types.CallToolRequest = type("CallToolRequest", (), {})
905+
mock_types.InitializeRequest = type("InitializeRequest", (), {})
906+
907+
request = MockListToolsRequest()
908+
self.instrumentor._generate_mcp_attributes(self.mock_span, request, is_client=True)
909+
self.mock_span.set_attribute.assert_any_call(MCPAttributes.MCP_LIST_TOOLS, True)
910+
911+
def test_generate_mcp_attributes_call_tool(self) -> None:
912+
"""Test _generate_mcp_attributes with CallToolRequest"""
913+
from amazon.opentelemetry.distro.instrumentation.mcp.semconv import MCPAttributes
914+
915+
class MockCallToolRequest:
916+
def __init__(self):
917+
self.params = type("Params", (), {"name": "test_tool"})()
918+
919+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
920+
mock_types.ListToolsRequest = type("ListToolsRequest", (), {})
921+
mock_types.CallToolRequest = MockCallToolRequest
922+
mock_types.InitializeRequest = type("InitializeRequest", (), {})
923+
924+
request = MockCallToolRequest()
925+
self.instrumentor._generate_mcp_attributes(self.mock_span, request, is_client=True)
926+
self.mock_span.set_attribute.assert_any_call(MCPAttributes.MCP_CALL_TOOL, True)
927+
928+
def test_generate_mcp_attributes_initialize(self) -> None:
929+
"""Test _generate_mcp_attributes with InitializeRequest"""
930+
from amazon.opentelemetry.distro.instrumentation.mcp.semconv import MCPAttributes
931+
932+
class MockInitializeRequest:
933+
pass
934+
935+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
936+
mock_types.ListToolsRequest = type("ListToolsRequest", (), {})
937+
mock_types.CallToolRequest = type("CallToolRequest", (), {})
938+
mock_types.InitializeRequest = MockInitializeRequest
939+
940+
request = MockInitializeRequest()
941+
self.instrumentor._generate_mcp_attributes(self.mock_span, request, is_client=True)
942+
self.mock_span.set_attribute.assert_any_call(MCPAttributes.MCP_INITIALIZE, True)
943+
944+
def test_get_mcp_operation_list_tools(self) -> None:
945+
"""Test _get_mcp_operation with ListToolsRequest"""
946+
947+
class MockListToolsRequest:
948+
pass
949+
950+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
951+
mock_types.ListToolsRequest = MockListToolsRequest
952+
mock_types.CallToolRequest = type("CallToolRequest", (), {})
953+
954+
request = MockListToolsRequest()
955+
result = self.instrumentor._get_mcp_operation(request)
956+
self.assertEqual(result, "tools/list")
957+
958+
def test_get_mcp_operation_call_tool(self) -> None:
959+
"""Test _get_mcp_operation with CallToolRequest"""
960+
961+
class MockCallToolRequest:
962+
def __init__(self):
963+
self.params = type("Params", (), {"name": "my_tool"})()
964+
965+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
966+
mock_types.ListToolsRequest = type("ListToolsRequest", (), {})
967+
mock_types.CallToolRequest = MockCallToolRequest
968+
969+
request = MockCallToolRequest()
970+
result = self.instrumentor._get_mcp_operation(request)
971+
self.assertEqual(result, "tools/my_tool")
972+
973+
def test_get_mcp_operation_unknown(self) -> None:
974+
"""Test _get_mcp_operation with unknown request type"""
975+
with patch("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types") as mock_types:
976+
mock_types.ListToolsRequest = type("ListToolsRequest", (), {})
977+
mock_types.CallToolRequest = type("CallToolRequest", (), {})
978+
979+
unknown_request = object()
980+
result = self.instrumentor._get_mcp_operation(unknown_request)
981+
self.assertEqual(result, "unknown")
982+
983+
886984
class TestAdditionalCoverage(unittest.TestCase):
887985
def setUp(self):
888986
self.instrumentor = MCPInstrumentor()

0 commit comments

Comments
 (0)