基于MCP协议实现端到端全链路追踪

本文通过一个简单的 AI 日志分析助手,演示 ARMS Python 探针通过 MCP 协议实现端到端全链路追踪。

背景介绍

在现代AI应用开发中,可观测性(Observability)已经成为不可或缺的重要环节。随着应用架构越来越复杂,开发者需要深入了解应用的运行状态、性能瓶颈和潜在问题。传统的监控方式往往需要大量的手动配置和代码改动,这不仅增加了开发成本,还可能引入新的错误。

MCP(Model Context Protocol) 是 Anthropic 推出的一个开放标准。如果把 AI Agent 比作一个聪明的助手,那么 MCP 就像是它的“万能工具箱”,集成了数据库查询、API 调用、文件读写、邮件发送等丰富功能。有了 MCP,AI Agent 从智能对话助手升级为全能执行助手,能够真正落地完成复杂的现实世界任务。

然而在 Agent 与 MCP 的实际应用中,开发者经常遇到以下关键痛点:

  • 工具选择盲区

    Agent 在面对复杂任务时,可能选择了不合适的工具来完成任务,导致执行效率低下或结果不准确。而且开发者缺乏可视化手段来分析 Agent 的决策过程和工具选择逻辑。

  • 错误排查困难

    工具调用时参数格式错误、类型不匹配或必填参数缺失,错误信息往往隐藏在复杂的调用链中,难以快速定位问题根源。

  • Token消耗黑洞

    Agent 与 MCP 工具的多轮交互容易产生意想不到的大量Token消耗,缺乏实时的成本监控,可能导致预算超支。而且无法清晰了解不同 MCP 工具的 Token 消耗占比,难以对成本进行精准优化。

  • 循环调用陷阱

    Agent可能陷入反复调用相同工具的循环中,缺乏合适手段及时发现和中断这种异常行为模式,造成资源浪费。

ARMS 提供了功能强大、开箱即用的Python探针,能够零代码侵入地为Python应用添加完整的可观测性能力。为了解决以上 MCP 使用过程中的痛点, ARMS Python探针最新版本新增了 MCP协议 可观测性支持,率先为 MCP 协议提供了专业的一站式监控能力。

  • 零代码接入:无需修改任何代码,开箱即用的完整的 AI 应用监控能力。

  • 可视化工具选择过程:深度集成 MCP 协议,可视化 AI Agent 的工具选择和调用过程。

  • 精准故障定位:当系统出现异常时,可能通过链路信息快速锁定问题根源。

  • Token 成本分析:提供大模型 Token 使用量的精确监控和成本关联数据。

  • 端到端链路追踪:从用户查询到 Agent、MCP 调用的完整调用链路展示,快速定位异常调用模式。

演示场景架构

下面将构建一个智能日志分析助手,展示 ARMS Python 探针如何监控基于 MCP 协议的 AI 应用。

首先使用 LangChain 框架构建一个 Agent,用户会向 Agent 发起提问。Agent 通过 Qwen Turbo 大模型的能力,自主规划解决问题的行动计划,并分步骤执行。在执行过程中 Agent 会通过 MCP 协议访问 SLS MCP 服务器,SLS MCP 服务器通过 SLS HTTP OpenAPI 访问日志服务的接口,完成日志分析请求。

请求中 LangChain Agent 与 SLS MCP 服务器产生的遥测数据会自动采集到 ARMS,在 ARMS 控制台上可以对采集到的数据做进一步的分析。

image

环境安装与配置

1. 前置条件

Python版本 ≥ 3.8

2. 准备环境变量

为 Python 应用配置环境变量,另外演示场景中需要调用大模型处理用户问题,此处以百炼大模型为例,环境变量中还需配置百炼API-Key

export ARMS_APP_NAME=xxx   # 应用名称。
export ARMS_REGION_ID=xxx   # 对应的阿里云账号的RegionID。
export ARMS_LICENSE_KEY=xxx   # 阿里云 LicenseKey。
export ARMS_IS_PUBLIC=True   # 添加该环境变量表示使用公网访问。
export BALIAN_API_KEY=sk-************   # 百炼API-Key。

您可以通过DescribeTraceLicenseKey OpenAPI获取阿里云LicenseKey。

3. 安装 Python 依赖

# 安装项目依赖
pip install mcp==1.10.1 langchain-mcp-adapters langgraph "langchain[openai]" aliyun-bootstrap rich mcp_server_aliyun_observability -y

# 安装 ARMS Python 探针
aliyun-bootstrap -a install

场景演示

1. 启动 SLS MCP 服务器

在终端中执行以下命令,在本地启动 SLS MCP 服务器。获取 AccessKey 的方法,请参见创建AccessKey

aliyun-instrument python -m mcp_server_aliyun_observability \
  --transport sse \
  --access-key-id <阿里云AccessKey ID> \
  --access-key-secret <阿里云AccessKey Secret>

当看到如下日志输出时,说明 MCP 服务器已启动,ARMS Python 探针已经成功注入到 MCP 服务器中。

Load Aliyun python agent version: 1.6.1

2. 启动 Langchain Demo 程序

创建 demo.py 文件,执行 aliyun-instrument python demo.py 来启动此 Demo 程序。

此处示例Demo创建了一个 Agent,并向 Agent 提了两个问题,该 Agent 会使用 SLS MCP 服务处理日志分析请求。

from contextlib import asynccontextmanager
from mcp import ClientSession
from mcp.client.sse import sse_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
import asyncio
from opentelemetry import trace
import os

tracer = trace.get_tracer(__name__)

# 创建一个大模型对象
model = ChatOpenAI(
    model="qwen-turbo",
    api_key=os.getenv("BALIAN_API_KEY"),  # 百炼 API Key
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

# 创建 agent
@asynccontextmanager
async def sls_agent():
    with tracer.start_as_current_span("langchain-demo"):
        async with sse_client(url="http://0.0.0.0:8000/sse") as (read, write):
            async with ClientSession(read, write) as session:
                await session.initialize()
                tools = await load_mcp_tools(session)
                agent = create_react_agent(model, tools)
                yield agent

def print_response(response):
    for message in response['messages']:
        print(message.content)

async def main():
    # 创建一个 sls agent
    async with sls_agent() as agent:
        # 调用模型处理问题
        response = await agent.ainvoke(
            {"messages": "我要查询我在杭州地域的project的列表,取前10个"}
        )
        print_response(response)

        # 继续追问
        response = await agent.ainvoke(
            {
                "messages": "查询杭州地域下 demo-test 这个 project 下的 loghub_master 日志库的日志,分析最近十分钟写入了多少条日志"
            }
        )
        print_response(response)

if __name__ == "__main__":
    asyncio.run(main())

程序将会输出如下结果:

我要查询我在杭州地域的project的列表,取前10个

以下是您在杭州地域(cn-hangzhou)的前10个项目列表:

1. sls-aysls-pub-cn-hangzhou-b-xxxx
2. e2e-test-xxxx
3. workspace-xxxx
4. ws-xxxx (描述: Create by o11y)
5. clickbench8 (描述: clickbench8)
6. clickbench16 (描述: clickbench16)
7. clickbench (描述: clickbench)
8. job-e2e-project-xxxx
9. job-e2e-project-xxxx
10. job-e2e-project-xxxx
如果需要查询更多项目,您可以提供项目的关键词进行模糊搜索。

查询杭州地域下 demo-test 这个 project 下的 loghub_master 日志库的日志,分析最近十分钟写入了多少条日志

在最近的十分钟内,`demo-test` 项目下的 `loghub_master` 日志库共写入了 **8641 条日志**。

以上演示Demo较为简单,只展示了 MCP 与 AI Agent 集成的效果,更多 SLS 日志分析场景可以参考 alibabacloud-observability-mcp-server

查看 MCP 调用链路

  1. ARMS控制台应用监控 > 应用列表页面单击目标 Python 应用名称。

  2. 调用链分析页面单击Trace列表,单击Trace ID进行调用分析。

    image.png

    Trace详情会展示一个完整的调用过程追踪信息。以下链路详情中可以看到 AI Agent 调用了 MCP Client 来执行对日志服务 API 的访问,MCP Client 请求被发送到 MCP Server,MCP Server 通过 HTTP API 访问日志服务,总耗时 66ms。

    image.png

  3. 单击该 Span,在右侧区域可以看到更多详细信息,例如服务地址、请求协议、请求参数、返回 Body 大小等。 image.png

  4. 指标页签可以查看该请求相关联的指标信息,从而进一步分析吞吐量、延迟等指标。 image.png