o
    iK-                  	   @   s8  d dl Z d dlZd dlmZ d dlmZ d dlZer&d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" ee#Z$e
%dee j&dddee j&dddd de'fddZ(de)e'e'f fdd Z*dAd#d$Z+d%d&dee)e'e'f  fd'd(Z,d)e-d*e)fd+d,Z.d)e-d*e)fd-d.Z/d)e-d*e)fd/d0Z0d)e-d*e)fd1d2Z1d)e-d*e)fd3d4Z2d)e-d*e)fd5d6Z3d)e-d*e)fd7d8Z4d)e-d*e)fd9d:Z5d)e-d*e)fd;d<Z6d=d> Z7d?d@ Z8dS )B    N)TYPE_CHECKING)Optional)ClientRequest)Request)config)Span)	ERROR_MSG)activate_distributed_headers)unwrap)wrap)
get_logger)asbool)CLIENT_TOOL_CALL_OPERATION_NAME)SERVER_REQUEST_OPERATION_NAME)SERVER_TOOL_CALL_OPERATION_NAME)MCPIntegration)	_get_attr)HTTPPropagator)tracermcpDD_MCP_DISTRIBUTED_TRACINGT)defaultDD_MCP_CAPTURE_INTENTF)distributed_tracingcapture_intentreturnc                  C   s   ddl m}  | dS )Nr   versionr   )importlib.metadatar   r    r   V/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/mcp/patch.pyget_version)   s   r!   c                   C   s   ddiS )Nr   z>=1.10.0r   r   r   r   r    _supported_versions/   s   r"   requestr   c           
      C   s   t  }|du r
| S i }t|j| |s| S t| dddu r!| S zKt| jdd}|s.| W S t|dd}|r:| ni }||d< |jdd}||d< t|di |}| j }||d< t| jdi |}	t| |	W S  t	y~   t
jd	dd
 |  Y S w )z=Inject distributed tracing headers into MCP request metadata.Nrootparamsmeta_dd_trace_contextT)by_alias_metazEError injecting distributed tracing headers into MCP request metadata)exc_infor   )r   current_spanr   injectcontextr   r$   
model_dumptype	Exceptionlogerror)
r#   spanheadersrequest_paramsexisting_meta	meta_dictparams_dict
new_paramsrequest_dictnew_request_rootr   r   r    )_set_distributed_headers_into_mcp_request3   s6   
r<   request_rootr   c                 C   sR   t | dd}|rt |ddnd}|rt|dr| ni }|di }|r'|S dS )zGExtract distributed tracing headers from MCP request params.meta field.r%   Nr&   r.   r'   )r   hasattrr.   get)r=   r5   r&   r7   r4   r   r   r    -_extract_distributed_headers_from_mcp_request[   s
   r@   argskwargsc                 C   sF   |rt jjs| |i |S |d }t|}| |f|dd  i |S )z=Injects distributed tracing headers into MCP request metadatar      N)r   r   r   r<   )funcinstancerA   rB   r#   modified_requestr   r   r    traced_send_requestd   s
   rG   c           	   
      s   t j}|jtdd}zazG| |i |I d H }t|ddrBt|dg }d|_|r1t|tr1|d nd }|rBt|dd rB|t	|j
 |j||||td	 |W W |  S  tyl   |j|||d td	 |jt    w |  w )
NTsubmit_to_llmobsisErrorFcontentrC   r   textrA   rB   response	operation)r   _datadog_integrationtracer   getattrr2   
isinstancelistset_tagr   rL   llmobs_set_tagsfinishr0   set_exc_infosysr*   )	rD   rE   rA   rB   integrationr3   resultrK   content_blockr   r   r    traced_call_toolm   s0   



r]   c                       t j}|jd|jj| jf dd-}d }z| |i |I d H }|W |j||||dd W  d    S |j||||dd w 1 sBw   Y  d S )N%s.%sTrH   
initializerM   r   rP   rQ   	__class____name__rV   rD   rE   rA   rB   rZ   r3   rN   r   r   r     traced_client_session_initialize      re   c                    r^   )Nr_   TrH   
list_toolsrM   ra   rd   r   r   r     traced_client_session_list_tools   rf   rh   c                    sf   t j}|j|jjddd}t|d| z| |i |I d H W S  ty2   |jt	   |
   w )NTclient_session)rI   r/   _dd_span)r   rP   rQ   rb   rc   setattrr0   rX   rY   r*   rW   rD   rE   rA   rB   rZ   r3   r   r   r    traced_client_session_aenter   s   rm   c                    s   t j}t|dd }z;z)| |i |I d H W W |r4|j|g tt|dd t|dd dd dd |  S S  tyE   |rD|jt	
    w |rc|j|g tt|dd t|dd dd dd |  w w )Nrj   _read_stream_write_stream)read_streamwrite_streamsessionrM   )r   rP   rR   rV   dictr   rW   r0   rX   rY   r*   rl   r   r   r    traced_client_session_aexit   sH   







rt   c              	   C   s   ddl m} ddl m} tj}t|dd }t|dd }|r't||s.t||s.| |i |S t||rDtjjrDt	| }	rDt
ttj|	 t||rKtnt}
|j|
ddt|dd	d
}t|d| t||rm||| | |i |S )Nr   )CallToolRequest)InitializeRequestr#   r$   Tzmcp.{}methodunknown)rI   	span_namerj   )	mcp.typesru   rv   r   rP   r   rS   r   r   r@   r	   r   r   r   rQ   formatrk   process_telemetry_argument)rD   rE   rA   rB   ru   rv   rZ   request_wrapperr=   r4   operation_namer3   r   r   r    traced_request_responder_enter   s:   

r   c                 C   s   t |dd }|r;t|dkr|d nd }t|dkr|d nd }t|dkr*|d nd }|d ur7|||| |  | |i |S )Nrj   r   rC      )rR   lenrX   rW   )rD   rE   rA   rB   r3   exc_typeexc_valexc_tbr   r   r    traced_request_responder_exit   s   r   c           	         s   ddl m} t|dkr|d nd }t|dd }tj}t|dd }tjjr0t||r0|	| |rE|j
||tdi |d|id td | |i |I d H S )Nr   )ListToolsResultr$   rj   request_responderrM   r   )rz   r   r   rR   r   rP   r   r   rS   inject_tools_list_responserV   rs   r   )	rD   rE   rA   rB   r   response_argrN   rZ   r3   r   r   r     traced_request_responder_respond   s"   
r   c                  C   s   t tddrd S dt_ttjdt_ddlm}  ddlm	} ddlm
} t| d	t t| d
t t|dt t| dt t| dt t| dt t|dt t|dt t|dt d S )N__datadog_patchFT)integration_configr   ClientSessionBaseSessionRequestResponder
__aenter__	__aexit__send_request	call_toolrg   r`   	__enter____exit__respond)rR   r   r   r   r   rP   mcp.client.sessionr   mcp.shared.sessionr   r   r   rm   rt   rG   r]   rh   re   r   r   r   r   r   r   r   r   r    patch  s    r   c                  C   s   t tddsd S dt_ddlm}  ddlm} ddlm} t| d t| d t|d	 t| d
 t| d t| d t|d t|d t|d t	td d S )Nr   Fr   r   r   r   r   r   r   r   rg   r`   r   r   r   rP   )
rR   r   r   r   r   r   r   r   r
   delattrr   r   r   r    unpatch-  s    








r   )r#   r   r   r   )9osrY   typingr   r   r   rz   r   r   ddtracer   ddtrace._trace.spanr   ddtrace.constantsr   $ddtrace.contrib.internal.trace_utilsr	   ddtrace.contrib.trace_utilsr
   r   ddtrace.internal.loggerr   ddtrace.internal.utils.formatsr    ddtrace.llmobs._integrations.mcpr   r   r   r   ddtrace.llmobs._utilsr   ddtrace.propagation.httpr   ddtrace.tracer   rc   r1   _addgetenvstrr!   rs   r"   r<   r@   tuplerG   r]   re   rh   rm   rt   r   r   r   r   r   r   r   r   r    <module>   sZ    	
(		'