Skip to content

Commit aab4e7d

Browse files
committed
add session id extraction logic
1 parent d7666ca commit aab4e7d

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class McpInstrumentor(BaseInstrumentor):
2828

2929
_DEFAULT_CLIENT_SPAN_NAME = "span.mcp.client"
3030
_DEFAULT_SERVER_SPAN_NAME = "span.mcp.server"
31+
_MCP_SESSION_ID_HEADER = "mcp-session-id"
3132

3233
def __init__(self, **kwargs):
3334
super().__init__()
@@ -226,8 +227,12 @@ async def _wrap_server_message_handler(
226227
with self.tracer.start_as_current_span(
227228
self._DEFAULT_SERVER_SPAN_NAME, kind=SpanKind.SERVER, context=parent_ctx
228229
) as server_span:
230+
231+
# Extract session ID if available
232+
session_id = self._extract_session_id(args)
233+
if session_id:
234+
server_span.set_attribute(MCPSpanAttributes.MCP_SESSION_ID, session_id)
229235

230-
server_span.set_attribute(SpanAttributes.RPC_SERVICE, instance.name)
231236
self._generate_mcp_message_attrs(server_span, incoming_msg, request_id)
232237

233238
try:
@@ -238,7 +243,27 @@ async def _wrap_server_message_handler(
238243
server_span.set_status(Status(StatusCode.ERROR, str(e)))
239244
server_span.record_exception(e)
240245
raise
241-
246+
247+
def _extract_session_id(self, args: Tuple[Any, ...]) -> Optional[str]:
248+
"""
249+
Extract session ID from server method arguments.
250+
"""
251+
try:
252+
from mcp.shared.session import RequestResponder # pylint: disable=import-outside-toplevel
253+
from mcp.shared.message import ServerMessageMetadata # pylint: disable=import-outside-toplevel
254+
255+
message = args[0]
256+
if isinstance(message, RequestResponder):
257+
if message.message_metadata and isinstance(message.message_metadata, ServerMessageMetadata):
258+
request_context = message.message_metadata.request_context
259+
if request_context:
260+
headers = getattr(request_context, 'headers', None)
261+
if headers:
262+
return headers.get(self._MCP_SESSION_ID_HEADER)
263+
return None
264+
except Exception:
265+
return None
266+
242267
@staticmethod
243268
def _generate_mcp_message_attrs(span: trace.Span, message, request_id: Optional[int]) -> None:
244269
import mcp.types as types # pylint: disable=import-outside-toplevel,consider-using-from-import

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ class MCPSpanAttributes:
4848
The transport type used for MCP communication.
4949
Examples: stdio, streamable_http
5050
"""
51+
MCP_SESSION_ID = "mcp.session.id"
52+
"""
53+
The session identifier for HTTP transport connections.
54+
Only present for streamable_http transport, not available for stdio.
55+
"""
56+
5157

5258
class MCPMethodValue:
5359

0 commit comments

Comments
 (0)