o
    i!5                  
   @   s  d dl mZ d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dl	m
Z
 d dl	m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- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl2m4Z4 d dl5m6Z6 d d l5m7Z7 ej8Z9e1e9Z:e:d!k rd d"l;m<Z< nd d#l;m=Z< d$e>fd%d&Z?d$e@e>e>f fd'd(ZAd)e
e> fd*d+ZBeCd,e@e&d,e/ejDd-d.d/eBeDd0d1 d2ZEd3ZFd4ZGd5d6 ZHd7d8 ZId9d: ZJd;d< ZKd=d> ZLd?d@ ZMdAdB ZNdCdD ZOdEdF ZPdGedHeQdIe@d$eQeQe@f fdJdKZRdLee>ee<f d$e>fdMdNZSdOedPeTd$e@fdQdRZUdSeTe dTe6d$dfdUdVZVdWdX ZWdS )Y    )Callable)Iterable)StringION)Optional)Union)MiddlewareManager)GraphQLError)ExecutionResult)Source)config)Pin)_SPAN_MEASURED_KEY)	ERROR_MSG)ERROR_STACK)
ERROR_TYPE)trace_utils)	SpanTypes)core)	COMPONENT)schematize_service_name)schematize_url_operation)SpanDirection)ArgumentError)get_argument_value)set_argument_value)asbool)parse_version)unwrap)wrap)Span)tracer   r   )Document)DocumentNodereturnc                   C   s   t S N)_graphql_version_str r(   r(   Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/graphql/patch.pyget_version2   s   r*   c                   C   s   ddiS )Ngraphqlz>=3.1r(   r(   r(   r(   r)   _supported_versions6   s   r,   error_extensionsc                 C   s$   | durdd |  dD }|S dS )z)Parse the user provided error extensions.Nc                 S   s   g | ]}|  qS r(   )strip).0er(   r(   r)   
<listcomp>=       z+_parse_error_extensions.<locals>.<listcomp>,)split)r-   fieldsr(   r(   r)   _parse_error_extensions:   s   r6   r+   "DD_TRACE_GRAPHQL_RESOLVERS_ENABLEDF)default!DD_TRACE_GRAPHQL_ERROR_EXTENSIONS)_default_serviceresolvers_enabled_error_extensionszgraphql.sourcezgraphql.operation.typezgraphql.operation.namec                  C   sF   t tddrd S dt_t t t D ]\} }}tt| || qd S )N_datadog_patchFT)getattrr+   r=   r   onto_get_patching_candidates_update_patchingr   
module_str	func_namewrapperr(   r(   r)   patchQ   s   rF   c                  C   sB   t tddr
tdk rd S t D ]\} }}tt| || qdt_d S )Nr=   F)   r   )r>   r+   _graphql_versionr@   rA   r   r=   rB   r(   r(   r)   unpatch[   s
   
rI   c                   C   sP   t dk rddtfddtfddtfdd	tfgS dd
tfddtfddtfdd	tfgS )Nr!   zgraphql.graphqlexecute_graphqlzgraphql.language.parserparsezgraphql.validation.validationvalidatezgraphql.execution.executorexecutegraphql_implzgraphql.validation.validatezgraphql.execution.execute)rH   _traced_query_traced_parse_traced_validate_traced_executer(   r(   r(   r)   r@   e   s   r@   c                 C   s"   t j| }t||}| || d S r&   )sysmodulesr>   )	operationrC   rD   rE   modulefuncr(   r(   r)   rA   u   s   

rA   c                 C   s   t t}|r| s| |i |S t||dd}t|}tjdt	|t
jtjd}|tt
jj |t| | |i |W  d    S 1 sKw   Y  d S )Nr   sourcezgraphql.parsenameservice	span_type)r   get_fromr+   enabledr   _get_source_strr    tracer   int_servicer   r   GRAPHQL_set_tag_strr   integration_name_GRAPHQL_SOURCE)rW   argskwargspinrX   
source_strspanr(   r(   r)   rP   {   s   
$rP   c                 C   s   t t}|r| s| |i |S t||dd}t|}tjdt	|t
jtjd$}|tt
jj |t| | |i |}t|| |W  d    S 1 sRw   Y  d S )N   astzgraphql.validaterY   )r   r]   r+   r^   r   r_   r    r`   r   ra   r   r   rb   rc   r   rd   re   _set_span_errors)rW   rf   rg   rh   documentri   rj   errorsr(   r(   r)   rQ      s"   

$rQ   c                 C   s
  t t}|r| s| |i |S tjjrtt||\}}tdk r*t	||dd}nt	||dd}t
|}tjd|p;d t|tjtjd5}|ttjj |td t|| |t| | |i |}t|trrt|j| |W  d    S 1 s~w   Y  d S )Nr!   rk   document_astrn   zgraphql.executerZ   resourcer[   r\   )r   r]   r+   r^   r   r;    _inject_trace_middleware_to_args_resolver_middlewarerH   r   r_   r    r`   r   ra   r   rb   rc   r   rd   
set_metricr   _set_span_operation_tagsre   
isinstancer	   rm   ro   )rW   rf   rg   rh   rn   ri   rj   resultr(   r(   r)   rR      s2   


$rR   c                 C   s   t t}|r| s| |i |S t||dd}t|}tjtddt	j
d|p)d t|tjtjd*}|ttjj |td | |i |}t|trUt|j| |W  d    S 1 saw   Y  d S )Nrk   rX   zgraphql.requestr+   )protocol	directionrq   )r   r]   r+   r^   r   r_   r    r`   r   r   INBOUNDr   ra   r   r   rb   rc   r   rd   ru   r   rw   r	   rm   ro   )rW   rf   rg   rh   rX   rr   rj   rx   r(   r(   r)   rO      s&   

$rO   c                 K   s   t t}|r| s| ||fi |S tjd|jtjd}|	t
tjj | ||fi |W  d   S 1 s:w   Y  dS )z
    trace middleware which wraps the resolvers of graphql fields.
    Note - graphql middlewares can not be a partial. It must be a class or a function.
    zgraphql.resolve)rZ   rr   r\   N)r   r]   r+   r^   r    r`   
field_namer   rb   rc   r   r   rd   )next_middlewarerootinforf   rh   rj   r(   r(   r)   rt      s   
$rt   trace_middlewarerf   rg   c                 C   sx   d}t dkrd}zt|||dpg }t|tr|j}W n ty&   g }Y nw t|| g }t|||d|\}}||fS )zJ
    Adds a trace middleware to graphql.execute(..., middleware, ...)
       )r"   rG   	   
middleware)rH   r   rw   r   middlewaresr   listr   )r   rf   rg   middlewares_argr   r(   r(   r)   rs      s   
rs   objc                 C   sX   t | tr| }nt | tr| j}nt | tr!| jdur!| jjj}nd}tdd|	 S )zo
    Parses graphql Documents and "Source" objects to retrieve
    the graphql source input for a request.
    N z\s+ )
rw   strr
   bodyr#   locrX   resubr.   )r   ri   r(   r(   r)   r_     s   

r_   errorerror_extension_fieldsc                 C   sT   i }|D ]#}|| j v r't| j | tttfr| j | ||< qt| j | ||< q|S )zValidate user-provided extensions format and return the formatted extensions.
    All extensions values MUST be stringified, EXCEPT for numeric values and
    boolean values, which remain in their original type.
    )
extensionsrw   intfloatboolr   )r   r   r-   fieldr(   r(   r)   _validate_error_extensions*  s   
r   ro   rj   c                 C   s`  | sdS d|_ dtjtjf }|t| ddd | D }|t| | D ]}|j|	dd}|j
rAd	d |j
D }||d
< |jrut|||j}}}	t }
tj|||	|
tjd |
 }||d< |t| td||||	f |jdurddd |jD }||d< tjj}|durt||}|r|D ]}|| |d| < q|jd|d q'dS )zC
    Set tags on error span and set span events on each error.
    Nrk   z%s.%s
c                 S      g | ]}t |qS r(   r   )r/   r   r(   r(   r)   r1   E  r2   z$_set_span_errors.<locals>.<listcomp>z
error.type)messagetypec                 S   s   g | ]}|j  d |j qS ):)linecolumn)r/   r   r(   r(   r)   r1   M  s    	locations)filelimit
stacktracezspan.exceptionr3   c                 S   r   r(   r   )r/   path_objr(   r(   r)   r1   \  r2   pathzextensions.zdd.graphql.query.error)rZ   
attributes)r   r   
__module____name__rc   r   joinr   r   get_tagr   __traceback__r   r   	tracebackprint_exceptionr   _span_traceback_max_sizegetvaluer   r   dispatchr   r+   r<   r   
_add_event)ro   rj   exc_type_str
error_msgsr   r   r   exc_typeexc_valexc_tbbufftbr   r   r   keyr(   r(   r)   rm   :  sH   

rm   c                 C   sX   t |}|s	d S tdk r| t|j n| t|jj |jr*| t|jj d S d S )Nr!   )	r+   get_operation_astrH   rc   _GRAPHQL_OPERATION_TYPErU   valuerZ   _GRAPHQL_OPERATION_NAME)rj   rn   operation_defr(   r(   r)   rv   k  s   
rv   )Xcollections.abcr   r   ior   osr   rS   r   typingr   r   r+   r   graphql.errorr   graphql.executionr	   graphql.language.sourcer
   ddtracer   ddtrace._trace.pinr   ddtrace.constantsr   r   r   r   ddtrace.contribr   ddtrace.extr   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.schemar   r   -ddtrace.internal.schema.span_attribute_schemar   ddtrace.internal.utilsr   r   r   ddtrace.internal.utils.formatsr   ddtrace.internal.utils.versionr   ddtrace.internal.wrappingr   r   ddtrace.tracer   r    __version__r'   rH   graphql.language.astr#   r$   r   r*   dictr,   r6   _addgetenvre   r   r   rF   rI   r@   rA   rP   rQ   rR   rO   rt   tuplers   r_   r   r   rm   rv   r(   r(   r(   r)   <module>   s    


%"1