Ë
    S>{i€)  ã                   ó  — 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m	Z	m
Z
mZmZmZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZmZ d dlmZ d dl m!Z! d dl"m#Z$ e!rd dl%m&Z&m'Z'm(Z(m)Z) d dl m*Z*m+Z+ dZ,d„ Z- G d„ de«      Z.y)é    )Údatetime)Ú	get_value)ÚSpanProcessor)ÚSpanAttributes)Úformat_span_idÚformat_trace_idÚget_current_spanÚSpanContextÚSpanÚSpanKind)ÚINVALID_SPAN_IDÚINVALID_TRACE_ID)ÚINSTRUMENTER)ÚHub)ÚSENTRY_BAGGAGE_KEYÚSENTRY_TRACE_KEY©Úadd_global_event_processor)ÚTransactionr   )ÚDsn)ÚTYPE_CHECKING)Ú	parse_url)ÚAnyÚDictÚOptionalÚUnion)ÚEventÚHintÚotelc                 ó0  — t         j                  }|s| S |j                  r,|j                  j                  d   t        j
                  k7  r| S t        | d«      r
| d   dk(  r| S t        «       }|s| S |j                  «       }t        |j                  «      }t        |j                  «      }|t        k(  s	|t        k(  r| S |j                  |d «      }|s| S | j!                  di «      }|j!                  di «      j#                  |j%                  «       «       | S )NÚinstrumenterÚtypeÚtransactionÚcontextsÚtrace)r   ÚcurrentÚclientÚoptionsr   ÚOTELÚhasattrr	   Úget_span_contextr   Útrace_idr   Úspan_idr   r   ÚgetÚ
setdefaultÚupdateÚget_trace_context)	ÚeventÚotel_span_mapÚhubÚ	otel_spanÚctxr,   r-   Úsentry_spanr$   s	            úr/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentry_sdk/integrations/opentelemetry/span_processor.pyÚ!link_trace_context_to_error_eventr9   '   sù   € ä
�+‰+€CÙØˆà
‡z‚z�c—j‘j×(Ñ(¨Ñ8¼L×<MÑ<MÒMØˆäˆu�fÔ %¨¡-°=Ò"@Øˆä Ó"€IÙØˆà
×
$Ñ
$Ó
&€CÜ˜sŸ|™|Ó,€HÜ˜SŸ[™[Ó)€GàÔ#Ò# w´/Ò'AØˆà×#Ñ# G¨TÓ2€KÙØˆà×Ñ 
¨BÓ/€HØ×Ñ˜ Ó$×+Ñ+¨K×,IÑ,IÓ,KÔLà€Ló    c                   ó^   ‡ — e Zd ZdZi Zˆ fd„Zd„ Zdd„Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zˆ xZS )ÚSentrySpanProcessorzZ
    Converts OTel spans into Sentry spans so they can be sent to the Sentry backend.
    c                 ód   •— t        | d«      st        t        | �  | «      | _        | j                  S )NÚinstance)r*   Úsuperr<   Ú__new__r>   )ÚclsÚ	__class__s    €r8   r@   zSentrySpanProcessor.__new__P   s+   ø€ ä�s˜JÔ'Ü Ô!4°cÑBÀ3ÓGˆCŒLà�|‰|Ðr:   c                 ó"   ‡ — t         ˆ fd„«       }y )Nc                 ó0   •— t        | ‰j                  «      S ©N)r9   r3   )r2   ÚhintÚselfs     €r8   Úglobal_event_processorz<SentrySpanProcessor.__init__.<locals>.global_event_processorY   s   ø€ ô 5°U¸D×<NÑ<NÓOÐOr:   r   )rG   rH   s   ` r8   Ú__init__zSentrySpanProcessor.__init__W   s   ø€ ä	#ó	Pó 
$ñ	Pr:   c                 ó¦  — t         j                  }|sy |j                  r"|j                  r|j                  j                  sy 	 t	        |j                  j                  xs d«      }|j                  r+|j                  j                  d   t        j                  k7  ry |j                  «       j                  sy | j                  ||«      ry | j                  ||«      }|d   }|r| j                  j                  |d «      nd }d }|rQ|j                  |d   |j                   t#        j$                  |j&                  dz  «      t        j                  ¬«      }nY|j)                  |j                   |d   ||d   |d   t#        j$                  |j&                  dz  «      t        j                  ¬	«      }|| j                  |d   <   y # t
        $ r Y y w xY w)
NÚ r!   Úparent_span_idr-   ç    eÍÍA)r-   ÚdescriptionÚstart_timestampr!   r,   Úbaggage)Únamer-   rL   r,   rP   rO   r!   )r   r&   r'   Údsnr   Ú	Exceptionr(   r   r)   r+   Úis_validÚ_is_sentry_spanÚ_get_trace_datar3   r.   Ústart_childrQ   r   ÚfromtimestampÚ
start_timeÚstart_transaction)	rG   r5   Úparent_contextr4   Ú_Ú
trace_datarL   Úsentry_parent_spanr7   s	            r8   Úon_startzSentrySpanProcessor.on_start^   s¬  € ä�k‰kˆÙØà�zŠz˜cŸjšj°·±·²Øð	Ü�C—J‘J—N‘NÒ( bÓ)ˆAð �:Š:˜#Ÿ*™*×,Ñ,¨^Ñ<Ä×@QÑ@QÒQØà×)Ñ)Ó+×4Ò4Øà×Ñ  YÔ/Øà×)Ñ)¨)°^ÓDˆ
à#Ð$4Ñ5ˆá<JˆD×Ñ×"Ñ" >°4Ô8ÐPTð 	ð ˆÙØ,×8Ñ8Ø" 9Ñ-Ø%ŸN™NÜ (× 6Ñ 6°y×7KÑ7KÈcÑ7QÓ RÜ)×.Ñ.ð	 9ó ‰Kð ×/Ñ/Ø—^‘^Ø" 9Ñ-Ø-Ø# JÑ/Ø" 9Ñ-Ü (× 6Ñ 6°y×7KÑ7KÈcÑ7QÓ RÜ)×.Ñ.ð 0ó ˆKð 5@ˆ×Ñ˜: iÑ0Ò1øôM ò 	Ùð	ús   Á#G Ç	GÇGc                 óº  — t         j                  }|sy |j                  r+|j                  j                  d   t        j
                  k7  ry |j                  «       }|j                  sy t        |j                  «      }| j                  j                  |d «      }|sy |j                  |_        | j                  ||«       t        |t         «      rI|j                  |_        |j#                  t$        | j'                  |«      «       | j)                  ||«       n| j+                  ||«       |j-                  t/        j0                  |j2                  dz  «      ¬«       y )Nr!   rM   )Úend_timestamp)r   r&   r'   r(   r   r)   r+   rT   r   r-   r3   ÚpoprQ   ÚopÚ_update_span_with_otel_statusÚ
isinstancer   Úset_contextÚOPEN_TELEMETRY_CONTEXTÚ_get_otel_contextÚ"_update_transaction_with_otel_dataÚ_update_span_with_otel_dataÚfinishr   rX   Úend_time)rG   r5   r4   Úspan_contextr-   r7   s         r8   Úon_endzSentrySpanProcessor.on_end‘   s  € ä�k‰kˆÙØà�:Š:˜#Ÿ*™*×,Ñ,¨^Ñ<Ä×@QÑ@QÒQØà ×1Ñ1Ó3ˆØ×$Ò$Øä  ×!5Ñ!5Ó6ˆØ×(Ñ(×,Ñ,¨W°dÓ;ˆÙØà"Ÿ™ˆŒà×*Ñ*¨;¸	ÔBä�k¤;Ô/Ø(Ÿ~™~ˆKÔØ×#Ñ#Ü&¨×(>Ñ(>¸yÓ(Iôð ×3Ñ3°KÀÕKð ×,Ñ,¨[¸)ÔDà×ÑÜ"×0Ñ0°×1CÑ1CÀcÑ1IÓJð 	õ 	
r:   c                 óÜ   — |j                   j                  t        j                  d«      }|j                  xr- t        |j                  j                  xs d«      j                  }|r||v ryy)zs
        Break infinite loop:
        HTTP requests to Sentry are caught by OTel and send again to Sentry.
        NrK   TF)Ú
attributesr.   r   ÚHTTP_URLr'   r   rR   Únetloc)rG   r4   r5   Úotel_span_urlÚdsn_urls        r8   rU   z#SentrySpanProcessor._is_sentry_spanµ   sX   € ð "×,Ñ,×0Ñ0´×1HÑ1HÈ$ÓOˆØ—*‘*ÒA¤ S§Z¡Z§^¡^Ò%9°rÓ!:×!AÑ!Aˆá˜W¨Ñ5Øàr:   c                 óÂ   — i }|j                   rt        |j                   «      |d<   |j                  j                   r"t        |j                  j                   «      |d<   |S )zž
        Returns the OTel context for Sentry.
        See: https://develop.sentry.dev/sdk/performance/opentelemetry/#step-5-add-opentelemetry-context
        rp   Úresource)rp   Údictrv   )rG   r5   r6   s      r8   rh   z%SentrySpanProcessor._get_otel_contextÃ   sU   € ð ˆà×ÒÜ $ Y×%9Ñ%9Ó :ˆC�Ñà×Ñ×(Ò(Ü" 9×#5Ñ#5×#@Ñ#@ÓAˆC�
‰Oàˆ
r:   c                 óX  — i }|j                  «       }t        |j                  «      }||d<   t        |j                  «      }||d<   |j
                  rt        |j
                  j                  «      nd}||d<   t        t        |«      }|r|d   nd|d<   t        t        |«      }	|	|d<   |S )z^
        Extracts tracing information from one OTel span and its parent OTel context.
        r-   r,   NrL   Úparent_sampledrP   )	r+   r   r-   r   r,   Úparentr   r   r   )
rG   r5   r[   r]   rm   r-   r,   rL   Úsentry_trace_datarP   s
             r8   rV   z#SentrySpanProcessor._get_trace_dataÓ   sÄ   € ð
 ˆ
Ø ×1Ñ1Ó3ˆä  ×!5Ñ!5Ó6ˆØ 'ˆ
�9Ñä" <×#8Ñ#8Ó9ˆØ!)ˆ
�:Ñð 9B×8HÒ8HŒN˜9×+Ñ+×3Ñ3Ô4Èdð 	ð (6ˆ
Ð#Ñ$ä%Ô&6¸ÓGÐá3DÐÐ.Ò/È$ð 	Ð#Ñ$ô Ô.°Ó?ˆØ 'ˆ
�9ÑàÐr:   c                 ó¤   — |j                   j                  ry|j                   j                  r|j                  d«       y|j                  d«       y)z?
        Set the Sentry span status from the OTel span
        NÚokÚinternal_error)ÚstatusÚis_unsetÚis_okÚ
set_status)rG   r7   r5   s      r8   rd   z1SentrySpanProcessor._update_span_with_otel_statusð   sE   € ð
 ×Ñ×$Ò$Øà×Ñ×!Ò!Ø×"Ñ" 4Ô(Øà×ÑÐ/Õ0r:   c                 óü  — |j                   j                  «       D ]  \  }}|j                  ||«       Œ |j                  d|j                  «       |j                  }|j                  }|j                   j                  t        j                  d«      }|j                   j                  t        j                  d«      }|�r}d}|j                  t        j                  k(  r|dz  }n"|j                  t        j                  k(  r|dz  }|}|j                   j                  t        j                  d«      }	|	r|dj                  |	«      z  }|j                   j                  t        j                  d«      }
|
r|dj                  |
«      z  }|	st|
sr|j                   j                  t        j                  d«      }|rFt!        |«      }|j"                  › d|j$                  › |j&                  › �}|dj                  |«      z  }|j                   j                  t        j(                  d«      }|rD|j+                  |«       n2|r0d}|j                   j                  t        j,                  d«      }|r|}||_        ||_        y)	zš
        Convert OTel span data and update the Sentry span with it.
        This should eventually happen on the server when ingesting the spans.
        z	otel.kindNÚhttpú.serverú.clientz {}z://Údb)rp   ÚitemsÚset_dataÚkindrQ   r.   r   ÚHTTP_METHODÚ	DB_SYSTEMr   ÚSERVERÚCLIENTÚNET_PEER_NAMEÚformatÚHTTP_TARGETrq   ÚurlparseÚschemerr   ÚpathÚHTTP_STATUS_CODEÚset_http_statusÚDB_STATEMENTrc   rN   )rG   r7   r5   ÚkeyÚvalrc   rN   Úhttp_methodÚdb_queryÚ	peer_nameÚtargetÚurlÚ
parsed_urlÚstatus_codeÚ	statements                  r8   rj   z/SentrySpanProcessor._update_span_with_otel_dataþ   s  € ð "×,Ñ,×2Ñ2Ó4ò 	+‰HˆC�Ø× Ñ   cÕ*ð	+ð 	×Ñ˜[¨)¯.©.Ô9à�^‰^ˆØ—n‘nˆà×*Ñ*×.Ñ.¬~×/IÑ/IÈ4ÓPˆØ×'Ñ'×+Ñ+¬N×,DÑ,DÀdÓKˆâØˆBà�~‰~¤§¡Ò0Ø�i‘‘Ø—‘¤8§?¡?Ò2Ø�i‘�à%ˆKà!×,Ñ,×0Ñ0´×1MÑ1MÈtÓTˆIÙØ˜uŸ|™|¨IÓ6Ñ6�à×)Ñ)×-Ñ-¬n×.HÑ.HÈ$ÓOˆFÙØ˜uŸ|™|¨FÓ3Ñ3�á¡VØ×*Ñ*×.Ñ.¬~×/FÑ/FÈÓM�ÙÜ!)¨#£�JØ'×.Ñ.Ð/¨s°:×3DÑ3DÐ2EÀjÇoÁoÐEVÐW�CØ 5§<¡<°Ó#4Ñ4�Kà#×.Ñ.×2Ñ2Ü×/Ñ/°óˆKñ Ø×+Ñ+¨KÕ8áØˆBØ!×,Ñ,×0Ñ0´×1LÑ1LÈdÓSˆIÙØ'�àˆŒØ"-ˆÕr:   c                 óp  — |j                   j                  t        j                  «      }|r‹|j                   j                  t        j                  «      }|r|j                  |«       d}|j                  t        j                  k(  r|dz  }n"|j                  t        j                  k(  r|dz  }||_
        y y )Nr„   r…   r†   )rp   r.   r   r‹   r•   r–   rŠ   r   r�   rŽ   rc   )rG   r7   r5   rš   r    rc   s         r8   ri   z6SentrySpanProcessor._update_transaction_with_otel_data7  s‘   € à×*Ñ*×.Ñ.¬~×/IÑ/IÓJˆáØ#×.Ñ.×2Ñ2´>×3RÑ3RÓSˆKÙØ×+Ñ+¨KÔ8àˆBà�~‰~¤§¡Ò0Ø�i‘‘Ø—‘¤8§?¡?Ò2Ø�i‘�àˆK�Nð r:   rE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   r@   rI   r_   rn   rU   rh   rV   rd   rj   ri   Ú__classcell__)rB   s   @r8   r<   r<   H   sF   ø„ ñð
 €MôòPó1@òf"
òHòò ò:1ò7.ör r:   r<   N)/r   Úopentelemetry.contextr   Úopentelemetry.sdk.tracer   Úopentelemetry.semconv.tracer   Úopentelemetry.tracer   r   r	   r
   r   ÚOTelSpanr   Úopentelemetry.trace.spanr   r   Úsentry_sdk.constsr   Úsentry_sdk.hubr   Ú,sentry_sdk.integrations.opentelemetry.constsr   r   Úsentry_sdk.scoper   Úsentry_sdk.tracingr   Ú
SentrySpanÚsentry_sdk.utilsr   Úsentry_sdk._typesr   Úurllib3.utilr   r’   Útypingr   r   r   r   r   r   rg   r9   r<   © r:   r8   ú<module>r¹      sd   ðÝ å +Ý 1Ý 6÷÷ ÷õ +Ý ÷õ 8ß >Ý  Ý +å .áß1Ó1ç-àÐ òôB ˜-õ  r:   