Python MCP SDK 服务端 OpenTelemetry 追踪:零代码接入的默认可观测性机制

发布时间:2026/9/20 23:42:22

Python MCP SDK 服务端 OpenTelemetry 追踪:零代码接入的默认可观测性机制 人工智能MCP 服务MCP Clients【免费下载链接】python-sdkThe official Python SDK for Model Context Protocol servers and clients项目地址https://gitcode.com/gh_mirrors/pythonsd/python-sdk点击查看免费下载导读本文讲解 Model Context Protocol Python SDK本仓库服务端的 OpenTelemetry 追踪能力——从MCPServer(...)实例化那一刻起每个被处理的入站消息都会自动生成一个SERVERspan你无需编写或导入任何追踪代码。读完本文你将掌握默认 span 的命名规则与属性集、tools/call与prompts/get遵循 GenAI 语义约定带来的 UI 自动分组效果、从零成本 no-op到接入 exporter 的完整激活路径以及 W3C trace context 跨 client/server 自动传播的原理与关闭方式。开箱即用你的 Server 天生就是被追踪的原文档英文版印地语翻译版开宗明义你的 server 已经在产生 trace你什么都不用加。每创建一个 server它就会为处理的每一条消息发出一个 OpenTelemetry span——这段代码不是你写的你也没有 import 它它在你调用MCPServer(...)的那一刻就存在了。完整的、自带追踪的 server 只需要这些代码见 docs_src/opentelemetry/tutorial001.pyfrom mcp.server import MCPServer mcp MCPServer(Bookshop) mcp.tool() def search_books(query: str) - str: Search the catalog by title or author. return fFound 3 books matching {query!r}.对search_books发起一次tools/call就会为它创建一个 span。这一点对底层 API 同样成立无论是高层MCPServer还是 low-level 的Server追踪逻辑都内置其中。从源码看这一默认行为由 src/mcp/server/lowlevel/server.py 保证Server初始化时会将OpenTelemetryMiddleware()放在self.middleware列表的第一位注释明确写着OpenTelemetryMiddleware默认随每个 server 一起交付因此每个 server 都会发出 span。对应的测试 tests/server/test_otel.pytest_server_ships_opentelemetry_middleware_by_default也验证了一个裸Server(name..., version...)的 middleware 列表中必然包含OpenTelemetryMiddleware实例。你得到什么span 命名、属性与 GenAI 语义约定每个入站消息都会变成一个SERVER类型的 span命名规则为方法名 目标名对search_books的tools/call→ span 名tools/call search_books裸的tools/list→ span 名就是tools/list没有目标可命名。span 名称的拼接逻辑直接对应 src/mcp/server/_otel.py 中的实现namef{ctx.method}{f {target} if target else }其中target取自请求参数中的name字段。每个 span 都携带一组标准属性属性出现条件说明mcp.method.name每个 span消息方法名如tools/callmcp.protocol.version每个 span本次会话使用的 MCP 协议版本jsonrpc.request.id仅 requestJSON-RPC 请求 IDnotification 没有该属性error.type/rpc.response.status_code出错时handler 异常或工具返回错误时写入gen_ai.*仅tools/call、prompts/getGenAI 语义约定属性见下由于追踪工具调用是极常见的需求tools/callspan 遵循 OpenTelemetry 的GenAI 语义约定额外携带gen_ai.operation.name固定为execute_toolgen_ai.tool.name设置为被调用的工具名。同理prompts/getspan 会获得gen_ai.prompt.name。而tools/list这类 list 方法不带任何gen_ai.*键——它们没有可命名的对象语义上无从归属。提示正是这些 GenAI 属性让追踪 UI 把你的 tool calls 按照与其他任何 agent 相同的方式分组。这个分组能力是免费的不需要任何额外代码。源码级验证错误状态与工具错误标记src/mcp/server/_otel.py 完整展示了 span 状态管理逻辑比文档描述得更细handler 抛出MCPErrorspan 上写入error.type与rpc.response.status_code取错误码并将 span 状态置为StatusCode.ERROR随后重新抛出参数校验失败ValidationError以INVALID_PARAMS错误码标记 span 错误状态与线上返回的 sanitized 响应保持一致避免泄露客户端输入其他任意异常写入error.type取异常类的__qualname__、记录异常事件并置为StatusCode.ERROR工具返回错误结果文档说is_errorTrue的 tool result 也会置错。源码对两种情况生效——CallToolResult(is_errorTrue)模型实例或原始 dict 形式{isError: True}注意必须是字面布尔值True因为线上 wire 校验只保留 camelCase 别名。命中后写入error.typetool_error并置StatusCode.ERROR。这些分支都有对应测试覆盖见 tests/server/test_otel.pytest_emits_server_span_with_method_and_target验证了 span 名、mcp.method.name、两个gen_ai.*属性及jsonrpc.request.idtest_tool_error_dict_result_sets_error_type与test_tool_error_model_result_sets_error_type验证了两种错误结果形态test_snake_case_dict_result_is_not_a_tool_error则确认{is_error: True}这类 snake_case dict不会被误判为工具错误。它在你想要之前零成本默认开启之所以能成为一个舒适的默认值关键在于成本结构。SDK 的运行依赖只有opentelemetry-api见 pyproject.toml 中的opentelemetry-api1.28.0这是 OpenTelemetry 的轻量半壁——只提供 span/tracer 的 API 骨架。当环境中既没有 OpenTelemetry SDK 也没有任何 exporter 时创建 span 就是一个no-op你 server 此刻发出的这些 span 几乎不消耗任何东西而且也没有人在收集它们。直到你想看到它们的那一天再安装另一半并把它指向某个后端uv add opentelemetry-sdk opentelemetry-exporter-otlp仓库开发环境依赖中已包含opentelemetry-sdk1.39.1见 pyproject.toml。然后按 OpenTelemetry 的常规方式配置 exporter——例如通过环境变量OTEL_EXPORTER_OTLP_ENDPOINT指向 OTLP Collector或按所选后端的要求初始化——SDK 一直在默默创建的 span 就全部点亮了。你的 server 代码一行都不用改。文档还特别提到一类开箱即用的后端[Pydantic Logfire] 就是建立在 OpenTelemetry 之上的服务它替你完成了配置pip install logfire、调用logfire.configure()你的 MCP spans 就会出现在 live view 中。由于它基于 OpenTelemetry本文描述的一切对它同样适用。跨 wire 的 traceclient 到 server 的自动关联一条 trace 最有价值的时刻是它能以一张连续图景跟踪请求从 client 进入 server 的全过程。当client 和 server 都运行本 SDK时这种关联是自动发生的。其机制对应 src/mcp/shared/_otel.py 中两个对称的辅助函数inject_trace_context(meta)client 在发出请求前把W3C trace contexttraceparent/tracestate头注入到请求的_meta字典中使用的是 OpenTelemetry 标准propagate.injectextract_trace_context(meta)server 在收到请求后从_meta中取出上下文交给 span 创建逻辑见 src/mcp/server/_otel.py 中contextextract_trace_context(ctx.meta)。于是 server span 会嵌套到同一个 trace 中 client span 的下方形成完整链路。这就是 MCP 生态中的 SEP-414 提案所定义的 trace context 传播你无需任何额外请求就能获得。如果入站消息不携带 trace context——例如请求来自一个不使用本 SDK 的 client——那么 server span 不会强行开启一条全新的孤儿 trace而是直接作为 server 当前已激活 span 的子 span。这一设计意图在 src/mcp/shared/_otel.py 的 docstring 中有明确说明extract_trace_context在载体缺失、格式非法或无有效traceparent时返回None让调用方自然回退到 ambient parenting若返回一个显式空Context反而会孤立 span。对应的测试test_nests_under_ambient_span_when_no_traceparent见 tests/server/test_otel.py验证了嵌套关系内层 span 的parent.span_id等于外层 span 的context.span_id。关闭它移除默认的追踪中间件Tracing 本质上是middleware位于你 server 的中间件列表首位见 src/mcp/server/lowlevel/server.py。如果你确实需要一个完全不发出 span 的 server可以把它移除from mcp.server._otel import OpenTelemetryMiddleware mcp._lowlevel_server.middleware[:] [ m for m in mcp._lowlevel_server.middleware if not isinstance(m, OpenTelemetryMiddleware) ]警告上面 import 中的前导下划线是故意的——OpenTelemetryMiddleware是 provisional临时类与Server.middleware的 provisional 状态一致参见 middleware 文档import 路径未来可能会变化。而且你几乎永远不需要关闭它没有安装 exporter 时 span 是免费的所以通常的答案是保持开启、不安装 exporter。总结每个MCPServer和每个 low-levelServer都开箱即用地为每条入站消息发出一个SERVERspan你不需要写任何代码。span 携带mcp.method.name与mcp.protocol.versiontools/call和prompts/get还携带 GenAI 属性让你的 tool calls 像任何其他 agent 一样被自动分组展示。在安装 OpenTelemetry SDK 和 exporter 之前成本为零安装后无需改动 server 代码即可看到全部 span。当 client 与 server 都运行本 SDK 时client 到 server 的 trace context 自动传播无 trace context 时 span 回退到当前 server 环境的父 span。至于一条请求是否会被执行则由 Authorization 授权机制 决定——追踪记录的是发生了什么事授权决定的是这件事允不允许发生。延伸阅读想深入理解实现可直接阅读 OpenTelemetry 中间件源码、底层 server 的中间件装配、共享 OTel 辅助函数以及完整的行为测试套件也可参考文档主目录下的 opentelemetry 部署运行指南 与其他 run 系列文档。赞分享人工智能MCP 服务MCP Clients【免费下载链接】python-sdkThe official Python SDK for Model Context Protocol servers and clients项目地址https://gitcode.com/gh_mirrors/pythonsd/python-sdk点击查看免费下载相关推荐gulp-util API详解掌握文件操作、流处理与模板渲染的核心方法gulp util API详解掌握文件操作、流处理与模板渲染的核心方法 gulp util是一个功能强大的工具库为开发者提供了丰富的API来简化Gulp任务人工智能MCP 服务MCP Clientspython-sdk 服务端 OpenTelemetry 可观测性零代码开箱即用的 MCP 全链路追踪python sdk 服务端 OpenTelemetry 可观测性零代码开箱即用的 MCP 全链路追踪 导读 本文讲解 Model Context Proto人工智能MCP 服务MCP ClientsMCP Python SDK 服务端 OpenTelemetry 追踪指南默认开启的 span、GenAI 语义与零成本观测MCP Python SDK 服务端 OpenTelemetry 追踪指南默认开启的 span、GenAI 语义与零成本观测 本篇指南围绕官方 Python人工智能MCP 服务MCP Clients创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/20 23:42:22

使用 ncnn CMake 选项裁剪出最小化推理库:完整瘦身指南

使用 ncnn CMake 选项裁剪出最小化推理库:完整瘦身指南 【免费下载链接】ncnn ncnn is a high-performance neural network inference framework optimized for the mobile platform 项目地址: https://gitcode.com/gh_mirrors/nc/ncnn 如果你的目标是让 ncnn…

2026/9/20 23:42:22

校园二手交易系统概要设计:从架构到数据库的完整实践指南

简介:面向软件工程专业学生、毕业设计开发者及需要规范化文档支撑的校园项目团队,这份校园二手交易系统概要设计说明书以真实场景为依托,系统解决从需求确认到详细设计之间的蓝图缺失问题。文档遵循标准概要设计规范,完整涵盖编写…

2026/9/20 23:42:22

Celery Beat 周期任务调度器:celery.beat 模块架构与源码级解析

任务调度后端消息队列 【免费下载链接】celery Distributed Task Queue (development branch) 项目地址: https://gitcode.com/gh_mirrors/ce/celery 点击查看 免费下载 导读 本文以 Celery 仓库中的 docs/reference/celery.beat.rst API 参考文档为骨架&#xff…

2026/9/21 0:47:25

RAG技术优化:检索增强生成系统的关键策略与实践

1. RAG技术体系概述检索增强生成(Retrieval-Augmented Generation)作为当前NLP领域的前沿技术,通过将信息检索与文本生成相结合,有效解决了传统大语言模型的知识固化问题。我在实际项目中发现,标准的RAG流程通常包含四…

2026/9/21 0:47:25

Claude Code 桌面版接入 DeepSeek 与离线 Skills 安装全攻略

1. 为什么我要折腾这套组合:Claude Code 桌面版 DeepSeek 离线 Skills先说清楚这套东西到底是什么。Claude Code 是 Anthropic 推出的一个命令行 AI 编程助手,它跟普通聊天式 AI 最大的区别在于:它能直接读写你本地的项目文件、执行终端命令…

2026/9/21 0:47:25

QGIS等时圈分析实战:ORS插件Key申请与参数设置避坑指南

1. 等时圈分析与ORS插件到底在做什么等时圈分析这件事,说白了就是回答一个很朴素的问题:从某个点出发,在给定时间内,我到底能走到哪些地方。做城市规划的要拿它评估公共服务覆盖范围,做商业选址的要拿它算门店辐射半径…

2026/9/21 0:47:25

普通人用AI变现,第一个工具到底该怎么选?

我见过太多人,一听说AI能变现,第一反应就是到处问:现在哪个AI工具最强?哪个能不限次数白嫖?哪个生成的内容最像真人?然后就开始了一场漫长的工具测评之旅。各种官网、教程、对比帖收藏了上百篇,…

2026/9/21 0:47:25

JDK 17.0.8免安装版Windows配置指南:从下载到环境变量

简介:JDK 17.0.8 Windows免安装版为Java开发者提供开箱即用的开发环境,无需经过复杂安装流程,解压配置环境变量即可使用。作为长期支持(LTS)版本,它包含javac编译器、Java运行环境、javadoc文档生成器、jdb…

2026/9/21 0:42:24

Xilinx 7系列FPGA入门:从选型架构到时序约束实战要点

简介:面向FPGA初学者与嵌入式开发者的Xilinx 7系列FPGA入门介绍文档,以简明方式梳理系列整体定位与核心技术要点。内容涵盖Spartan-7、Artix-7、Kintex-7、Virtex-7四个子系列的适用场景、性能参数与功耗优势,详细对比单位功耗性价比、成本削…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/21 0:02:23

OpenResearch:构建可复现的开放式研究工作流

第一次看到“OpenResearch”这个名字,我脑子里冒出的不是某个具体软件,而更像一种研究方式的宣言:开放、可复现、可验证。这三件事放在一起,其实比大多数人想象中难得多。过去几年我一直在折腾自己的研究工作流,从纯纸…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码