o
    S۷i(7                     @   s  d dl Z d dlZd dlZd dlmZ d dlZd dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ zd d	l mZ W n ey[   ed
w zd dlmZ d dlmZ d dlm Z! d dl"m#Z#m$Z$ W n ey   edw z
d dl%m&Z'm(Z) W n ey   dZ'dZ)Y nw d dl*m+Z+ e+rd dl*m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl"m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 ed G dd de
Z:d1ddZ;G dd deZ<G dd  d e<Z=d1d!d"Z>	#	$		%d2d&d'Z?	(	)		%d3d*d+Z@d4d/d0ZAdS )5    Nisawaitable)OP)_check_minimum_versionIntegrationDidNotEnable)ignore_logger)should_send_default_pii)TransactionSource)capture_internal_exceptionsensure_integration_enabledevent_from_exceptionloggerpackage_version_get_installed_modules)cached_propertyz;strawberry-graphql integration requires Python 3.8 or newer)Schema)SchemaExtension)should_skip_tracing)async_base_viewsync_base_viewz#strawberry-graphql is not installed)SentryTracingExtensionSentryTracingExtensionSync)TYPE_CHECKING)AnyCallable	GeneratorListOptional)GraphQLErrorGraphQLResolveInfo)GraphQLHTTPResponse)ExecutionContext)EventEventProcessorzstrawberry.executionc                   @   s4   e Zd ZdZde ZddddZedd	d
ZdS )StrawberryIntegration
strawberryzauto.graphql.Nasync_executionOptional[bool]returnc                 C   s    |dvrt d||| _d S )N)NFTz6Invalid value for async_execution: "{}" (must be bool))
ValueErrorformatr'   )selfr'    r-   X/home/ubuntu/vllm_env/lib/python3.10/site-packages/sentry_sdk/integrations/strawberry.py__init__B   s   
zStrawberryIntegration.__init__c                  C   s$   t d} tt| d t  t  d S )Nzstrawberry-graphql)r   r   r%   _patch_schema_init_patch_views)versionr-   r-   r.   
setup_onceK   s   
z StrawberryIntegration.setup_onceN)r'   r(   r)   Nr)   N)__name__
__module____qualname__
identifieroriginr/   staticmethodr3   r-   r-   r-   r.   r%   >   s    
	r%   r)   c                     s8   t j t 								 d	 fdd} | t _d S )
Nr,   r   argsr   kwargsr)   c                    s   t  t}|d u r | g|R i |S |dpg }d }|jd ur(|j}nt|}|d u r9tjddd d}dd |D }|	|rFt
nt ||d<  | g|R i |S )N
extensionszwAssuming strawberry is running sync. If not, initialize the integration as StrawberryIntegration(async_execution=True).   )
stacklevelFc                 S   s   g | ]
}|t tfvr|qS r-   StrawberrySentryAsyncExtensionStrawberrySentrySyncExtension).0	extensionr-   r-   r.   
<listcomp>p   s    zK_patch_schema_init.<locals>._sentry_patched_schema_init.<locals>.<listcomp>)
sentry_sdk
get_clientget_integrationr%   getr'   _guess_if_using_asyncwarningswarnappendSentryAsyncExtensionSentrySyncExtension)r,   r<   r=   integrationr>   should_use_async_extensionold_schema_initr-   r.   _sentry_patched_schema_initW   s,   

z7_patch_schema_init.<locals>._sentry_patched_schema_init)r,   r   r<   r   r=   r   r)   N)r   r/   	functoolswraps)rU   r-   rS   r.   r0   T   s   
(r0   c                   @   s   e Zd Zdd					d#dd	Zedefd
dZdedefddZd$ddZd$ddZ	d$ddZ
dddddefddZdddddddeddddfdd Zdddddddeddddfd!d"ZdS )%rO   Nexecution_contextr,   r   rY   Optional[ExecutionContext]r)   c                C   s   |r|| _ d S d S r4   rX   )r,   rY   r-   r-   r.   r/      s   
zSentryAsyncExtension.__init__c                 C   s*   |  | jj}| jjrd| jj|S |S )Nz{}:{})
hash_queryrY   queryoperation_namer+   )r,   
query_hashr-   r-   r.   _resource_name   s   z#SentryAsyncExtension._resource_namer\   c                 C   s   t |d S )Nzutf-8)hashlibmd5encode	hexdigest)r,   r\   r-   r-   r.   r[      s   zSentryAsyncExtension.hash_queryGenerator[None, None, None]c                 c   sf   | j j| _d}tj}| j jd u rd| j _| j j dr$d}tj}n| j j dr2d}tj	}|}| jr?|d
| j7 }tjd| j|dd t }t| j }|| t }|ri|j||tjd	| _n
tj||tjd	| _| jd
| | jd| j | jd| j j | jd| j d V  | jj}|r| j jr| j j|_tj|_||_| j  d S )Nr\    mutationsubscriptionz {}zgraphql.operation)r]   operation_type)categorydataopnamer:   zgraphql.operation.typezgraphql.operation.namezgraphql.documentzgraphql.resource_name)rY   r]   _operation_namer   GRAPHQL_QUERYr\   strip
startswithGRAPHQL_MUTATIONGRAPHQL_SUBSCRIPTIONr+   rG   add_breadcrumbget_isolation_scope_make_request_event_processoradd_event_processorget_current_spanstart_childr%   r:   graphql_span
start_spanset_datar_   containing_transactionrm   r
   	COMPONENTsourcerl   finish)r,   rh   rl   descriptionscopeevent_processorspantransactionr-   r-   r.   on_operation   s^   




z!SentryAsyncExtension.on_operationc                 c   .    | j jtjdtjd| _d V  | j  d S )N
validationrk   )rz   ry   r   GRAPHQL_VALIDATEr%   r:   validation_spanr   r,   r-   r-   r.   on_validate      z SentryAsyncExtension.on_validatec                 c   r   )Nparsingrk   )rz   ry   r   GRAPHQL_PARSEr%   r:   parsing_spanr   r   r-   r-   r.   on_parse   r   zSentryAsyncExtension.on_parse_nextz2Callable[[Any, GraphQLResolveInfo, Any, Any], Any]infor    c                 C   s
   t ||S r4   )strawberry_should_skip_tracing)r,   r   r   r-   r-   r.   r      s   
z(SentryAsyncExtension.should_skip_tracingrootr<   r=   c                    s0   |||g|R i |}t |r|I d H }|S r4   r   )r,   r   r   r   r<   r=   resultr-   r-   r.   _resolve   s
   
zSentryAsyncExtension._resolvec              
      s   |  ||r| j|||g|R i |I d H S d|j|j}| jjtjd|t	j
d=}|d|j |d|jj |d| |ddtt|j  | j|||g|R i |I d H W  d    S 1 snw   Y  d S 	Nz{}.{}zresolving {}rk   zgraphql.field_namezgraphql.parent_typezgraphql.field_pathzgraphql.path.)r   r   r+   parent_type
field_namerz   ry   r   GRAPHQL_RESOLVEr%   r:   r|   rm   joinmapstrpathas_listr,   r   r   r   r<   r=   
field_pathr   r-   r-   r.   resolve  s    " $zSentryAsyncExtension.resolve)r,   r   rY   rZ   r)   N)r)   rd   )r6   r7   r8   r/   r   r   r_   r[   r   r   r   boolr   r   r   r-   r-   r-   r.   rO      s`    


=


rO   c                   @   s.   e Zd Zdddddddeddd	dfd
dZdS )rP   r   z#Callable[[Any, Any, Any, Any], Any]r   r   r   r    r<   r=   r)   c              
   O   s   |  ||r|||g|R i |S d|j|j}| jjtjd|tj	d8}|
d|j |
d|jj |
d| |
ddtt|j  |||g|R i |W  d    S 1 scw   Y  d S r   )r   r+   r   r   rz   ry   r   r   r%   r:   r|   rm   r   r   r   r   r   r   r-   r-   r.   r     s   $zSentrySyncExtension.resolveN)r6   r7   r8   r   r   r-   r-   r-   r.   rP     s    rP   c                     s   t jjtjj								 d fdd	} 								 d fd
d}tt								 ddd | t j_|tj_d S )Nr,   r   errorsList[GraphQLError]response_datar!   r)   c                       | ||  | || d S r4   r-   r,   r   r   )_sentry_patched_handle_errorsold_async_view_handle_errorsr-   r.   (_sentry_patched_async_view_handle_errors:     z>_patch_views.<locals>._sentry_patched_async_view_handle_errorsc                    r   r4   r-   r   )r   old_sync_view_handle_errorsr-   r.   '_sentry_patched_sync_view_handle_errors@  r   z=_patch_views.<locals>._sentry_patched_sync_view_handle_errorsc                 S   s   |sd S t  }t|}|| t % |D ]}t|t  jtj	ddd\}}t j
||d qW d    d S 1 s<w   Y  d S )NF)typehandled)client_options	mechanism)hint)rG   ru   _make_response_event_processorrw   r   r   rH   optionsr%   r9   capture_event)r,   r   r   r   r   erroreventr   r-   r-   r.   r   F  s"   

"z3_patch_views.<locals>._sentry_patched_handle_errors)r,   r   r   r   r   r!   r)   N)r   AsyncBaseHTTPView_handle_errorsr   SyncBaseHTTPViewr   r%   )r   r   r-   )r   r   r   r.   r1   6  sD   
r1   rY   r"   r$   c                       d fdd}|S )	Nr   r#   r   dict[str, Any]r)   c              
      s   t  X t r0| di }d|d< |ds/d ji} jr# j|d<  jr+ j|d< ||d< nz| d d= W n ttfyB   Y nw W d    | S W d    | S W d    | S 1 s^w   Y  | S )Nrequestgraphql
api_targetrj   r\   	variablesoperationName)	r   r	   
setdefaultrJ   r\   r   r]   KeyError	TypeError)r   r   request_datarj   rX   r-   r.   innerh  s8   






z,_make_request_event_processor.<locals>.innerr   r#   r   r   r)   r#   r-   )rY   r   r-   rX   r.   rv   e  s   rv   r   r!   c                    r   )	Nr   r#   r   r   r)   c                    sZ   t    t r| di }d i|d< W d    | S W d    | S 1 s&w   Y  | S )Ncontextsrj   response)r   r	   r   )r   r   r   r   r-   r.   r     s   

z-_make_response_event_processor.<locals>.innerr   r-   )r   r   r-   r   r.   r     s   r   r>   List[SchemaExtension]r(   c                 C   s   t | v rdS t| v rdS d S )NTFrA   )r>   r-   r-   r.   rK     s
   rK   r5   )rY   r"   r)   r$   )r   r!   r)   r$   )r>   r   r)   r(   )BrV   r`   rL   inspectr   rG   sentry_sdk.constsr   sentry_sdk.integrationsr   r   r   sentry_sdk.integrations.loggingr   sentry_sdk.scoper	   sentry_sdk.tracingr
   sentry_sdk.utilsr   r   r   r   r   r   r   ImportErrorr&   r   strawberry.extensionsr   #strawberry.extensions.tracing.utilsr   r   strawberry.httpr   r   strawberry.extensions.tracingr   rB   r   rC   typingr   r   r   r   r   r   r   r   r    r!   strawberry.typesr"   sentry_sdk._typesr#   r$   r%   r0   rO   rP   r1   rv   r   rK   r-   r-   r-   r.   <module>   sn     	
/ 
/

