o
    i/                     @   s  d dl Z d dlmZ d dlZd dl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 d dlm Z  d dl!m"Z" d dl#m$Z$ d dl#m%Z% ee&Z'dd Z(dd Z)G dd de *ddej+Z,dd Z-d d! Z.d"d# Z/ed$e$fd%d&Z0G d'd( d(ej1Z2G d)d* d*ej3ej4ej5ej6Z7dS )+    N)contextmanager)config)_SPAN_MEASURED_KEY)	ERROR_MSG)ERROR_STACK)
ERROR_TYPE)	SPAN_KIND)trace_utils)	constants)utils)is_otlp_export)SpanKind)	SpanTypes)core)	COMPONENT)
get_logger)schematize_url_operation)SpanDirection)HTTPPropagator)Span)tracerc                 C   s   t | ||S N)_ClientInterceptor)pinhostport r   d/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/grpc/client_interceptor.pycreate_client_interceptor&   s   r   c           	      C   sh   |d }|dd  }t t|dd tr-|j}t|dd }|r-| |jg|R  }t||S | |i |S )Nr      _interceptor_channel)
isinstancegetattrr   r    r!   grpcintercept_channel)	wrappedinstanceargskwargschannelinterceptorsdd_interceptorbase_channelnew_channelr   r   r   r%   *   s   r%   c                   @   s   e Zd ZdS )_ClientCallDetailsN)__name__
__module____qualname__r   r   r   r   r/   7   s    r/   )methodtimeoutmetadatacredentialsc                    s    fdd}|S )Nc                    sZ   z'|   } tjt| |tjjkr!t | | W  	  d S W  	  d S  	  w r   )
code_set_tag_strr
   GRPC_STATUS_CODE_KEYstrr$   
StatusCodeOK_handle_errorfinish)responseresponse_codespanr   r   func?   s   z#_future_done_callback.<locals>.funcr   )rB   rC   r   rA   r   _future_done_callback>   s   rD   c                 C   sD   t |dr|jd urtd|jf t |dr |t|  d S d S )N	_responsegrpc.client.response.messageadd_done_callback)hasattrrE   r   dispatchrG   rD   )rB   r?   r   r   r   _handle_responseN   s   


rJ   c                 C   s
  t t|dd st t|dd st t|dd sd S | r7d| _t| }| t| | tt| d S |	 }|
 }|d ur|d urd| _t|tjrnt| }| t| | tt| | tt| d S t|}| ||| t| }d S d S d S )N	cancelled	exception	tracebackr   )callabler#   rK   errorr:   detailsr8   r   r   rL   rM   r"   r$   RpcErrorr   typeset_exc_infor7   )rB   response_errorstatus_codeexc_valrL   rM   exc_typer   r   r   r=   Z   s4   r=   rB   c              	   c   s@    t j }t j|  zd V  W t j| d S t j| w r   )r   context_provideractiveactivate)rB   	prev_spanr   r   r   _activated_span   s   
r\   c                       s8   e Zd Z fddZdd Zdd Zdd ZeZ  ZS )	_WrappedResponseCallFuturec                    s(   t t| | || _t| j| j d S r   )superr]   __init___spanrJ   __wrapped__)selfr&   rB   	__class__r   r   r_      s   z#_WrappedResponseCallFuture.__init__c                 C   s   | S r   r   )rb   r   r   r   __iter__   s   z#_WrappedResponseCallFuture.__iter__c              
   C   s   zt | j t| jW  d    W S 1 sw   Y  W d S  ty&     tjy9 } zt| j|  d }~w tyQ   t	j
ddd | j  | j   w )Nz7unexpected non-grpc exception raised, closing open spanT)exc_info)r\   r`   nextra   StopIterationr$   rQ   rJ   	Exceptionlogdebugset_tracebackr>   )rb   	rpc_errorr   r   r   _next   s    (

z _WrappedResponseCallFuture._nextc                 C   s"   |   }|d urtd|f |S )NrF   )rn   r   rI   )rb   nr   r   r   __next__   s   z#_WrappedResponseCallFuture.__next__)	r0   r1   r2   r_   re   rn   rp   rg   __classcell__r   r   rc   r   r]      s    r]   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s   || _ || _|| _d S r   )_pin_host_port)rb   r   r   r   r   r   r   r_      s   
z_ClientInterceptor.__init__c                 C   s  g }|j d urt|j }t|rd |fS tj }tjtddtj	dt
jt| jtj|j|d}|ttjj |ttj |td t||j| t|| j| j |tj tj! | jj"rj|#| jj" i }tjj$rvt%&|| |'|(  t)|j|j*||j+}||fS )Nr$   )protocol	direction)	span_typeserviceresourcechild_ofr   ),r5   listr   r   rX   rY   
start_spanr   r   OUTBOUNDr   GRPCr	   ext_servicerr   r   r$   r3   r8   r   integration_namer   r   CLIENT
set_metricr   r   set_grpc_method_metaset_grpc_client_metars   rt   r
   GRPC_SPAN_KIND_KEYGRPC_SPAN_KIND_VALUE_CLIENTtagsset_tagsdistributed_tracing_enabledr   injectextenditemsr/   r4   r6   )rb   method_kindclient_call_detailsr5   parentrB   headersr   r   r   _intercept_client_call   s@   


z)_ClientInterceptor._intercept_client_callc                 C      |  tj|\}}|d u r|||S t|) z|||}t|| W n tjy6 } zt||  d }~ww W d    |S 1 sBw   Y  |S r   )r   r
   GRPC_METHOD_KIND_UNARYr\   rJ   r$   rQ   )rb   continuationr   requestrB   r?   rm   r   r   r   intercept_unary_unary   (   




z(_ClientInterceptor.intercept_unary_unaryc                 C   f   |  tj|\}}|d u r|||S t| |||}t||}W d    |S 1 s,w   Y  |S r   )r   r
   !GRPC_METHOD_KIND_SERVER_STREAMINGr\   r]   )rb   r   r   r   rB   response_iteratorr   r   r   intercept_unary_stream
     



z)_ClientInterceptor.intercept_unary_streamc                 C   r   r   )r   r
   !GRPC_METHOD_KIND_CLIENT_STREAMINGr\   rJ   r$   rQ   )rb   r   r   request_iteratorrB   r?   rm   r   r   r   intercept_stream_unary  r   z)_ClientInterceptor.intercept_stream_unaryc                 C   r   r   )r   r
   GRPC_METHOD_KIND_BIDI_STREAMINGr\   r]   )rb   r   r   r   rB   r   r   r   r   intercept_stream_stream*  r   z*_ClientInterceptor.intercept_stream_streamN)	r0   r1   r2   r_   r   r   r   r   r   r   r   r   r   r      s    3r   )8collections
contextlibr   r$   wraptddtracer   ddtrace.constantsr   r   r   r   r   ddtrace.contribr	   ddtrace.contrib.internal.grpcr
   r   #ddtrace.contrib.internal.grpc.utilsr   ddtrace.extr   r   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   -ddtrace.internal.schema.span_attribute_schemar   ddtrace.propagation.httpr   ddtrace.tracer   r   r0   rj   r   r%   
namedtupleClientCallDetailsr/   rD   rJ   r=   r\   ObjectProxyr]   UnaryUnaryClientInterceptorUnaryStreamClientInterceptorStreamUnaryClientInterceptorStreamStreamClientInterceptorr   r   r   r   r   <module>   sV    	

%	
/