From 63744015c50d430df7cf2819b14b827c1464fe4b Mon Sep 17 00:00:00 2001 From: William Easton Date: Tue, 14 Apr 2026 13:30:40 -0500 Subject: [PATCH] Hoist ToolError imports to module level, add rpc.* migration note Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/servers/telemetry.mdx | 4 ++++ src/fastmcp/client/telemetry.py | 3 +-- src/fastmcp/server/telemetry.py | 5 +---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/servers/telemetry.mdx b/docs/servers/telemetry.mdx index 7c2c9c324..bf755ceba 100644 --- a/docs/servers/telemetry.mdx +++ b/docs/servers/telemetry.mdx @@ -193,6 +193,10 @@ def risky_operation() -> str: ## Attributes Reference + +**Migrating from v3.1 or earlier:** The `rpc.system`, `rpc.service`, and `rpc.method` span attributes were removed in favor of the [MCP semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/) listed below. If you have dashboards or alerts keyed on those `rpc.*` attributes, update them to use `mcp.method.name` and the `fastmcp.*` attributes instead. + + ### MCP Semantic Conventions FastMCP implements the [OpenTelemetry MCP semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/): diff --git a/src/fastmcp/client/telemetry.py b/src/fastmcp/client/telemetry.py index 8ec4babf4..e66cd7b47 100644 --- a/src/fastmcp/client/telemetry.py +++ b/src/fastmcp/client/telemetry.py @@ -5,6 +5,7 @@ from contextlib import contextmanager from opentelemetry.trace import Span, SpanKind, Status, StatusCode +from fastmcp.exceptions import ToolError as _ToolError from fastmcp.telemetry import get_tracer @@ -44,8 +45,6 @@ def client_span( yield span except Exception as e: if span.is_recording(): - from fastmcp.exceptions import ToolError as _ToolError - error_type = ( "tool_error" if isinstance(e, _ToolError) else type(e).__qualname__ ) diff --git a/src/fastmcp/server/telemetry.py b/src/fastmcp/server/telemetry.py index 58599cbad..974d4dcf6 100644 --- a/src/fastmcp/server/telemetry.py +++ b/src/fastmcp/server/telemetry.py @@ -7,6 +7,7 @@ from mcp.server.lowlevel.server import request_ctx from opentelemetry.context import Context from opentelemetry.trace import Span, SpanKind, Status, StatusCode +from fastmcp.exceptions import ToolError as _ToolError from fastmcp.telemetry import extract_trace_context, get_tracer @@ -95,8 +96,6 @@ def server_span( yield span except Exception as e: if span.is_recording(): - from fastmcp.exceptions import ToolError as _ToolError - error_type = ( "tool_error" if isinstance(e, _ToolError) else type(e).__qualname__ ) @@ -132,8 +131,6 @@ def delegate_span( yield span except Exception as e: if span.is_recording(): - from fastmcp.exceptions import ToolError as _ToolError - error_type = ( "tool_error" if isinstance(e, _ToolError) else type(e).__qualname__ )