o
    i                     @   s  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 Zdd Zdd ZG dd dejZ G dd de j!Z"dS )    N)config)_SPAN_MEASURED_KEY)	ERROR_MSG)
ERROR_TYPE)	SPAN_KIND)trace_utils)	constants)set_grpc_method_meta)SpanKind)	SpanTypes)core)	COMPONENT)schematize_url_operation)SpanDirection)tracerc                    s    fdd}t |S )Nc                    s*    j s| |S | |}|rt ||S |S N)enabled_TracedRpcMethodHandler)continuationhandler_call_detailsrpc_method_handlerpin d/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/grpc/server_interceptor.pyinterceptor_function   s   z7create_server_interceptor.<locals>.interceptor_function)_ServerInterceptor)r   r   r   r   r   create_server_interceptor   s   r   c                 C   s   d|_ | d ur:t| dr<| jd ur>t| jj}| jj}t|tr(|jddd}nt|}|	t
| |	t| d S d S d S d S )N   _statezutf-8ignore)errors)errorhasattrr   strcodedetails
isinstancebytesdecode_set_tag_strr   r   )server_contextspanr%   r&   r   r   r   _handle_server_exception(   s   
r-   c                 c   sj    z.z| D ]}|d urt d|f |V  qW n ty(   |  t||  w W |  d S |  w )Ngrpc.server.response.message)r   dispatch	Exceptionset_tracebackr-   finish)response_iteratorr+   r,   responser   r   r   _wrap_response_iterator5   s   
	r5   c                       sD   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z  Z	S )r   c                    s    t t| | || _|| _d S r   )superr   __init___pin_handler_call_details)selfr   r   wrapped	__class__r   r   r7   D   s   
z _TracedRpcMethodHandler.__init__c           
      C   s  t | jj}d }t|rt|d drt|d jdr|d }td||| jj| jjf t	j
ttj|d tjtddtjdtjt	| jtj| jjd}|ttjj |ttj |td	 t|| jj| |tj tj! t"|d	 t#j$r|d	 nd }| jj%r|&| jj% z<z||i |}	| j'j(rt)|	||}	n|	d urtd
|	f W n t*y   |+  t,||  w W | j'j(s|-  |	S | j'j(s|-  w w )Nr   
DESCRIPTORfieldszgrpc.server.data)
int_configrequest_headersgrpc)protocol	direction)	span_typeserviceresourcer   r.   ).dictr9   invocation_metadatalenr#   r>   r   r/   methodr   activate_distributed_headersr   r   grpc_servertracer   r   INBOUNDr   GRPCint_servicer8   r*   r   integration_namer   r
   SERVER
set_metricr   r	   r   GRPC_SPAN_KIND_KEYGRPC_SPAN_KIND_VALUE_SERVERr'   rB   ServicerContexttagsset_tags__wrapped__response_streamingr5   r0   r1   r-   r2   )
r:   method_kindbehaviorargskwargsheadersrequest_messager,   r+   response_or_iteratorr   r   r   _fnI   s^   


z_TracedRpcMethodHandler._fnc                 O      |  tj| jj||S r   )rc   r   GRPC_METHOD_KIND_UNARYrZ   unary_unaryr:   r^   r_   r   r   r   rf         z#_TracedRpcMethodHandler.unary_unaryc                 O   rd   r   )rc   r   !GRPC_METHOD_KIND_SERVER_STREAMINGrZ   unary_streamrg   r   r   r   rj      rh   z$_TracedRpcMethodHandler.unary_streamc                 O   rd   r   )rc   r   !GRPC_METHOD_KIND_CLIENT_STREAMINGrZ   stream_unaryrg   r   r   r   rl      rh   z$_TracedRpcMethodHandler.stream_unaryc                 O   rd   r   )rc   r   GRPC_METHOD_KIND_BIDI_STREAMINGrZ   stream_streamrg   r   r   r   rn      rh   z%_TracedRpcMethodHandler.stream_stream)
__name__
__module____qualname__r7   rc   rf   rj   rl   rn   __classcell__r   r   r<   r   r   C   s    @r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   rc   )r:   r   r   r   r   r7      s   
z_ServerInterceptor.__init__c                 C   s   |  ||S r   rs   )r:   r   r   r   r   r   intercept_service   s   z$_ServerInterceptor.intercept_serviceN)ro   rp   rq   r7   rt   r   r   r   r   r      s    r   )#rB   wraptddtracer   ddtrace.constantsr   r   r   r   ddtrace.contribr   ddtrace.contrib.internal.grpcr   #ddtrace.contrib.internal.grpc.utilsr	   ddtrace.extr
   r   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.schemar   -ddtrace.internal.schema.span_attribute_schemar   ddtrace.tracer   r   r-   r5   ObjectProxyr   ServerInterceptorr   r   r   r   r   <module>   s,    S