Ë
    çÞËj�#  ã                   ó�  — d Z ddlZddlmZmZ ddlmZmZmZm	Z	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 e
e	e
e   ef      Z G d	„ d
e«      Z G d„ de«      Zd„ Zdeeef   deeef   fd„Zdeeef   ddfd„Zdeeef   ddfd„Zdeeef   ddfd„Zdeeef   defd„Zdeeef   defd„Z  G d„ d«      Z! G d„ de«      Z"y)ae  
This integration ingests tracing data from native extensions written in Rust.

Using it requires additional setup on the Rust side to accept a
`RustTracingLayer` Python object and register it with the `tracing-subscriber`
using an adapter from the `pyo3-python-tracing-subscriber` crate. For example:
```rust
#[pyfunction]
pub fn initialize_tracing(py_impl: Bound<'_, PyAny>) {
    tracing_subscriber::registry()
        .with(pyo3_python_tracing_subscriber::PythonCallbackLayerBridge::new(py_impl))
        .init();
}
```

Usage in Python would then look like:
```
sentry_sdk.init(
    dsn=sentry_dsn,
    integrations=[
        RustTracingIntegration(
            "demo_rust_extension",
            demo_rust_extension.initialize_tracing,
            event_type_mapping=event_type_mapping,
        )
    ],
)
```

Each native extension requires its own integration.
é    N)ÚEnumÚauto)ÚAnyÚCallableÚDictÚTupleÚOptional)ÚIntegration)Úshould_send_default_pii)ÚSpan)ÚSENSITIVE_DATA_SUBSTITUTEc                   óT   — e Zd ZU dZeed<   dZeed<   dZeed<   dZeed<   d	Z	eed
<   y)ÚRustTracingLevelÚTRACEÚTraceÚDEBUGÚDebugÚINFOÚInfoÚWARNÚWarnÚERRORÚErrorN)
Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__r   r   r   r   © ó    úa/var/www/photos/backend/venv/lib/python3.12/site-packages/sentry_sdk/integrations/rust_tracing.pyr   r   .   s4   … Ø€Eˆ3ÓØ€Eˆ3ÓØ€Dˆ#ÓØ€Dˆ#ÓØ€Eˆ3Ôr    r   c                   óD   — e Zd Z e«       Z e«       Z e«       Z e«       Zy)ÚEventTypeMappingN)r   r   r   r   ÚIgnoreÚExcÚ
BreadcrumbÚEventr   r    r!   r#   r#   6   s   „ Ù‹V€FÙ
‹&€CÙ“€JÙ‹F�Er    r#   c                 óØ   — t        | «      } | t         j                  t         j                  fv ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ryy)NÚdebugÚinfoÚwarningÚerror)r   r   r   r   r   r   )Úlevels    r!   Útracing_level_to_sentry_levelr.   =   se   € ä˜UÓ#€EØÔ!×'Ñ'Ô)9×)?Ñ)?Ð@Ñ@ØØ	Ô"×'Ñ'Ò	'ØØ	Ô"×'Ñ'Ò	'ØØ	Ô"×(Ñ(Ò	(Øð r    ÚeventÚreturnc                 ó   — | j                  di «      }i }i }dD ]  }||v sŒ||   ||<   Œ t        |«      dkD  r||d<   i }|j                  dg «      D ]  }| j                  |«      ||<   Œ t        |«      dkD  r||d<   |S )NÚmetadata)Úmodule_pathÚfileÚliner   Úrust_tracing_locationÚfieldsÚrust_tracing_fields)ÚgetÚlen)r/   r2   ÚcontextsÚlocationÚfieldr7   s         r!   Úextract_contextsr>   M   s¥   € Ø�y‰y˜ RÓ(€HØ€Hà€HØ0ò .ˆØ�HÒØ& u™oˆH�UŠOð.ô ˆ8ƒ}�qÒØ,4ˆÐ(Ñ)à€FØ—‘˜h¨Ó+ò )ˆØŸ	™	 %Ó(ˆˆuŠð)ä
ˆ6ƒ{�Q‚Ø*0ˆÐ&Ñ'à€Or    c                 óî   — | j                  di «      }|j                  d«      }t        |j                  d«      «      }| j                  d«      }t        | «      }||||dœ}t        j                  |«       y )Nr2   Útargetr-   Úmessage)Úloggerr-   rA   r;   )r9   r.   r>   Ú
sentry_sdkÚcapture_event)r/   r2   rB   r-   rA   r;   Úsentry_events          r!   Úprocess_eventrF   a   sp   € Ø�y‰y˜ RÓ(€Hà�\‰\˜(Ó#€FÜ)¨(¯,©,°wÓ*?Ó@€EØ�i‰i˜	Ó"€GÜ Ó&€Hð ØØØñ	€Lô ×Ñ˜\Õ*r    c                 ó   — t        | «       y ©N)rF   )r/   s    r!   Úprocess_exceptionrI   s   s
   € Ü�%Õr    c                 ó¨   — t        | j                  di «      j                  d«      «      }| j                  d«      }t        j                  ||¬«       y )Nr2   r-   rA   )r-   rA   )r.   r9   rC   Úadd_breadcrumb)r/   r-   rA   s      r!   Úprocess_breadcrumbrL   w   s@   € Ü)¨%¯)©)°JÀÓ*C×*GÑ*GÈÓ*PÓQ€EØ�i‰i˜	Ó"€Gä×Ñ E°7Ö;r    r2   c                 ó”   — t        | j                  d«      «      t         j                  t         j                  t         j                  fv S ©Nr-   )r   r9   r   r   r   )r2   s    r!   Údefault_span_filterrO   ~   s=   € Ü˜HŸL™L¨Ó1Ó2Ü×ÑÜ×ÑÜ×Ñð7ð ð r    c                 ód  — t        | j                  d«      «      }|t         j                  k(  rt        j                  S |t         j
                  t         j                  fv rt        j                  S |t         j                  t         j                  fv rt        j                  S t        j                  S rN   )r   r9   r   r#   r%   r   r   r&   r   r   r$   )r2   r-   s     r!   Údefault_event_type_mappingrQ   †   sŠ   € Ü˜XŸ\™\¨'Ó2Ó3€EØÔ ×&Ñ&Ò&Ü×#Ñ#Ð#Ø	Ô#×(Ñ(Ô*:×*?Ñ*?Ð@Ñ	@Ü×*Ñ*Ð*Ø	Ô#×)Ñ)Ô+;×+AÑ+AÐBÑ	BÜ×&Ñ&Ð&ä×&Ñ&Ð&r    c            
       ó¾   — e Zd Zeedfdedeeeef   ge	f   deeeef   ge
f   dee
   fd„Zde
fd„Zd	ed
eddfd„Zdededefd„Zdededdfd„Zdedededdfd„Zy)ÚRustTracingLayerNÚoriginÚevent_type_mappingÚspan_filterÚinclude_tracing_fieldsc                 ó<   — || _         || _        || _        || _        y rH   )rT   rU   rV   rW   )ÚselfrT   rU   rV   rW   s        r!   Ú__init__zRustTracingLayer.__init__“   s#   € ð ˆŒØ"4ˆÔØ&ˆÔØ&<ˆÕ#r    r0   c                 óF   — | j                   €
t        «       S | j                   S )a9  
        By default, the values of tracing fields are not included in case they
        contain PII. A user may override that by passing `True` for the
        `include_tracing_fields` keyword argument of this integration or by
        setting `send_default_pii` to `True` in their Sentry client options.
        )rW   r   )rY   s    r!   Ú_include_tracing_fieldsz(RustTracingLayer._include_tracing_fields¡   s-   € ð ×*Ñ*Ð2ô $Ó%ð	
ð ×,Ñ,ð	
r    r/   Ú_span_statec                 óV  — t        j                  |«      }|j                  di «      }| j                  |«      }|t        j
                  k(  ry |t        j                  k(  rt        |«       y |t        j                  k(  rt        |«       y |t        j                  k(  rt        |«       y y )Nr2   )ÚjsonÚloadsr9   rU   r#   r$   r%   rI   r&   rL   r'   rF   )rY   r/   r]   Údeserialized_eventr2   Ú
event_types         r!   Úon_eventzRustTracingLayer.on_event®   s’   € Ü!ŸZ™Z¨Ó.ÐØ%×)Ñ)¨*°bÓ9ˆà×,Ñ,¨XÓ6ˆ
ØÔ)×0Ñ0Ò0ØØÔ+×/Ñ/Ò/ÜÐ0Õ1ØÔ+×6Ñ6Ò6ÜÐ1Õ2ØÔ+×1Ñ1Ò1ÜÐ,Õ-ð 2r    ÚattrsÚspan_idc                 ó�  — t        j                  |«      }|j                  di «      }| j                  |«      sy |j                  d«      }|j                  d«      }|j                  d«      }|�|}n|�
|�|› d|› �}n|�|}nd}d|| j                  dœ}t        j                  «       }	|	j                  }
|
r |
j                  d
i |¤Ž}n |	j                  d
i |¤Ž}|j                  d	g «      }|D ]J  }| j                  «       r"|j                  ||j                  |«      «       Œ5|j                  |t        «       ŒL ||	_        |
|fS )Nr2   r3   ÚnamerA   z::z	<unknown>Úfunction)Úoprg   rT   r7   r   )r_   r`   r9   rV   rT   rC   Úget_current_scopeÚspanÚstart_childÚ
start_spanr\   Úset_datar   )rY   rd   re   r2   r3   rg   rA   Úsentry_span_nameÚkwargsÚscopeÚparent_sentry_spanÚsentry_spanr7   r=   s                 r!   Úon_new_spanzRustTracingLayer.on_new_span¼   s^  € Ü—
‘
˜5Ó!ˆØ—9‘9˜Z¨Ó,ˆà×Ñ Ô)Øà—l‘l =Ó1ˆØ�|‰|˜FÓ#ˆØ—)‘)˜IÓ&ˆàÐØ&ÑØÐ$¨Ð)9Ø"- ¨b°°Ð7ÑØÐØ#Ñà*Ðð Ø$Ø—k‘kñ
ˆô ×,Ñ,Ó.ˆØ"ŸZ™ZÐÙØ8Ð,×8Ñ8ÑB¸6ÑB‰Kà*˜%×*Ñ*Ñ4¨VÑ4ˆKà—‘˜h¨Ó+ˆØò 	GˆEØ×+Ñ+Ô-Ø×$Ñ$ U¨E¯I©I°eÓ,<Õ=à×$Ñ$ UÔ,EÕFð		Gð !ˆŒ
Ø" KÐ0Ð0r    Ú
span_statec                 óf   — |€y |\  }}|j                  «        |t        j                  «       _        y rH   )ÚfinishrC   rj   rk   )rY   re   ru   rr   rs   s        r!   Úon_closezRustTracingLayer.on_closeç   s3   € ØÐØà*4Ñ'Ð˜KØ×ÑÔØ.@Œ
×$Ñ$Ó&Õ+r    Úvaluesc                 óà   — |€y |\  }}t        j                  |«      }|j                  «       D ]>  \  }}| j                  «       r|j	                  ||«       Œ)|j	                  |t
        «       Œ@ y rH   )r_   r`   Úitemsr\   rn   r   )	rY   re   ry   ru   Ú_parent_sentry_spanrs   Údeserialized_valuesÚkeyÚvalues	            r!   Ú	on_recordzRustTracingLayer.on_recordï   sp   € ØÐØØ+5Ñ(Ð˜[ä"Ÿj™j¨Ó0ÐØ-×3Ñ3Ó5ò 	E‰JˆC�Ø×+Ñ+Ô-Ø×$Ñ$ S¨%Õ0à×$Ñ$ SÔ*CÕDñ		Er    )r   r   r   rQ   rO   r   r   r   r   r#   Úboolr	   rZ   r\   Ú
TraceStaterc   rt   rx   r€   r   r    r!   rS   rS   ’   sï   „ ð 'Ø8KØ15ñ=àð=ð %Ø�#�s�(‰^ÐÐ.Ð.ñ
ð=ð ˜t C¨ H™~Ð.°Ð4Ñ5ð=ð !)¨¡ó=ð
¨ó 
ð.˜cð .°
ð .¸tó .ð)1 ð )1¨sð )1°zó )1ðVA ð A°ð AÀó Að
E ð 
E¨cð 
E¸zð 
EÈdô 
Er    rS   c                   ó„   — e Zd ZdZeedfdedeegdf   dee	ee
f   gef   dee	ee
f   gef   dee   f
d„Zed
d	„«       Zy)ÚRustTracingIntegrationa¼  
    Ingests tracing data from a Rust native extension's `tracing` instrumentation.

    If a project uses more than one Rust native extension, each one will need
    its own instance of `RustTracingIntegration` with an initializer function
    specific to that extension.

    Since all of the setup for this integration requires instance-specific state
    which is not available in `setup_once()`, setup instead happens in `__init__()`.
    NÚ
identifierÚinitializerrU   rV   rW   c                 óf   — || _         d|› �}t        ||||«      | _         || j                  «       y )Nzauto.function.rust_tracing.)r…   rS   Útracing_layer)rY   r…   r†   rU   rV   rW   rT   s          r!   rZ   zRustTracingIntegration.__init__  s?   € ð %ˆŒØ.¨z¨lÐ;ˆÜ-ØÐ&¨Ð5Kó
ˆÔñ 	�D×&Ñ&Õ'r    c                   ó   — y rH   r   r   r    r!   Ú
setup_oncez!RustTracingIntegration.setup_once  s   € àr    )r0   N)r   r   r   Ú__doc__rQ   rO   r   r   rS   r   r   r#   r�   r	   rZ   ÚstaticmethodrŠ   r   r    r!   r„   r„   ü   s›   „ ñ	ð" 'Ø8KØ15ñ(àð(ð Ð/Ð0°$Ð6Ñ7ð(ð %Ø�#�s�(‰^ÐÐ.Ð.ñ
ð	(ð ˜t C¨ H™~Ð.°Ð4Ñ5ð(ð !)¨¡ó(ð$ òó ñr    r„   )#r‹   r_   Úenumr   r   Útypingr   r   r   r   r	   rC   Úsentry_sdk.integrationsr
   Úsentry_sdk.scoper   Úsentry_sdk.tracingr   Ú
SentrySpanÚsentry_sdk.utilsr   r‚   r   r#   r.   r   r>   rF   rI   rL   r�   rO   rQ   rS   r„   r   r    r!   ú<module>r”      s$  ðñó@ ß ß 7Õ 7ã Ý /Ý 4Ý 1Ý 6à�e˜H ZÑ0°*Ð<Ñ=Ñ>€
ô�tô ô�tô òð ˜D  c ™Nð ¨t°C¸°H©~ó ð(+˜˜c 3˜h™ð +¨Dó +ð$˜T # s (™^ð °ó ð<˜d 3¨ 8™nð <°ó <ð $ s¨C x¡.ð °Tó ð	'¨¨c°3¨h©ð 	'Ð<Ló 	'÷gEñ gEôT ˜[õ  r    