1+ """Patching utilities for mcp-agent telemetry integration.
2+
3+ We replace mcp_agent.tracing.telemetry.get_tracer to return the AgentOps tracer,
4+ so spans created by mcp-agent flow through AgentOps' configured provider.
5+ """
6+
7+ from typing import Optional
8+
9+ from opentelemetry .trace import Tracer
10+
11+ from agentops .logging import logger
12+
13+
14+ _original_get_tracer = None # type: ignore[var-annotated]
15+
16+
17+ def patch_mcp_agent (agentops_tracer : Optional [Tracer ]) -> None :
18+ """Patch mcp-agent telemetry to use the AgentOps tracer.
19+
20+ If the AgentOps tracer is None (unexpected), the patch is skipped.
21+ """
22+ if agentops_tracer is None :
23+ logger .debug ("patch_mcp_agent: AgentOps tracer is None; skipping patch" )
24+ return
25+
26+ global _original_get_tracer
27+
28+ try :
29+ import mcp_agent .tracing .telemetry as mcp_telemetry # type: ignore
30+
31+ get_tracer_func = getattr (mcp_telemetry , "get_tracer" , None )
32+ if get_tracer_func is None :
33+ logger .debug ("patch_mcp_agent: mcp_agent.tracing.telemetry.get_tracer not found; skipping patch" )
34+ return
35+
36+ if getattr (get_tracer_func , "__agentops_patched__" , False ):
37+ logger .debug ("patch_mcp_agent: already patched; skipping" )
38+ return
39+
40+ _original_get_tracer = get_tracer_func
41+
42+ def _agentops_get_tracer (_context ): # context is ignored; AgentOps manages provider
43+ return agentops_tracer
44+
45+ # Tag function to avoid double patching
46+ setattr (_agentops_get_tracer , "__agentops_patched__" , True )
47+
48+ mcp_telemetry .get_tracer = _agentops_get_tracer # type: ignore[attr-defined]
49+ logger .debug ("Patched mcp_agent.tracing.telemetry.get_tracer to use AgentOps tracer" )
50+ except Exception as e :
51+ logger .debug (f"patch_mcp_agent: failed to patch mcp-agent telemetry: { e } " )
52+
53+
54+ def unpatch_mcp_agent () -> None :
55+ """Restore original mcp-agent telemetry.get_tracer if it was patched."""
56+ global _original_get_tracer
57+ try :
58+ if _original_get_tracer is None :
59+ return
60+ import mcp_agent .tracing .telemetry as mcp_telemetry # type: ignore
61+
62+ mcp_telemetry .get_tracer = _original_get_tracer # type: ignore[attr-defined]
63+ _original_get_tracer = None
64+ logger .debug ("Restored original mcp_agent.tracing.telemetry.get_tracer" )
65+ except Exception as e :
66+ logger .debug (f"unpatch_mcp_agent: failed to restore mcp-agent telemetry: { e } " )
0 commit comments