
    fiv#                        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"dS )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                   "    e Zd ZdZdZdZdZdZdS )RustTracingLevelTRACEDEBUGINFOWARNERRORN)__name__
__module____qualname__TraceDebugInfoWarnError     t/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/sentry_sdk/integrations/rust_tracing.pyr   r   .   s'        EEDDEEEr   r   c                   ^    e Zd Z e            Z e            Z e            Z e            ZdS )EventTypeMappingN)r   r   r   r   IgnoreExc
BreadcrumbEventr   r   r   r!   r!   6   s:        TVVF
$&&CJDFFEEEr   r!   c                     t          |           } | t           j        t           j        fv rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )Ndebuginfowarningerror)r   r   r   r   r   r   )levels    r   tracing_level_to_sentry_levelr,   =   so    U##E!')9)?@@@w	"'	'	'v	"'	'	'y	"(	(	(w vr   eventreturnc                 (   |                      di           }i }i }dD ]}||v r||         ||<   t          |          dk    r||d<   i }|                     dg           D ]}|                      |          ||<   t          |          dk    r||d<   |S )Nmetadata)module_pathfileliner   rust_tracing_locationfieldsrust_tracing_fields)getlen)r-   r0   contextslocationfieldr5   s         r   extract_contextsr<   M   s    yyR((HHH0 . .H&uoHUO
8}}q,4()Fh++ ) )		%((u
6{{Q*0&'Or   c                    |                      di           }|                     d          }t          |                     d                    }|                      d          }t          |           }||||d}t          j        |           d S )Nr0   targetr+   message)loggerr+   r?   r9   )r7   r,   r<   
sentry_sdkcapture_event)r-   r0   r@   r+   r?   r9   sentry_events          r   process_eventrD   a   s    yyR((H\\(##F)(,,w*?*?@@Eii	""G&&H 	 L \*****r   c                 $    t          |            d S N)rD   )r-   s    r   process_exceptionrG   s   s    %r   c                     t          |                     di                               d                    }|                     d          }t          j        ||           d S )Nr0   r+   r?   )r+   r?   )r,   r7   rA   add_breadcrumb)r-   r+   r?   s      r   process_breadcrumbrJ   w   sX    )%))J*C*C*G*G*P*PQQEii	""GE7;;;;;;r   r0   c                     t          |                     d                    t           j        t           j        t           j        fv S Nr+   )r   r7   r   r   r   )r0   s    r   default_span_filterrM   ~   s:    HLL11227  r   c                 .   t          |                     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 rL   )r   r7   r   r!   r#   r   r   r$   r   r   r"   )r0   r+   s     r   default_event_type_mappingrO      s~    X\\'2233E &&&##	#(*:*?@	@	@**	#)+;+AB	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dS )RustTracingLayerNoriginevent_type_mappingspan_filterinclude_tracing_fieldsc                 >    || _         || _        || _        || _        d S rF   )rR   rS   rT   rU   )selfrR   rS   rT   rU   s        r   __init__zRustTracingLayer.__init__   s)     "4&&<###r   r.   c                 :    | j         t                      n| 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.
        )rU   r   )rW   s    r   _include_tracing_fieldsz(RustTracingLayer._include_tracing_fields   s&     *2 $%%%,	
r   r-   _span_statec                 n   t          j        |          }|                    di           }|                     |          }|t          j        k    rd S |t          j        k    rt          |           d S |t          j        k    rt          |           d S |t          j
        k    rt          |           d S d S )Nr0   )jsonloadsr7   rS   r!   r"   r#   rG   r$   rJ   r%   rD   )rW   r-   r[   deserialized_eventr0   
event_types         r   on_eventzRustTracingLayer.on_event   s    !Z..%))*b99,,X66
)000F+///011111+666122222+111,----- 21r   attrsspan_idc                    t          j        |          }|                    di           }|                     |          sd S |                    d          }|                    d          }|                    d          }||}n|
|| d| }n||}nd}d|| j        d}t          j                    }	|	j        }
|
r |
j        d
i |}n |	j	        d
i |}|                    d	g           }|D ][}| 
                                r*|                    ||                    |                     @|                    |t                     \||	_        |
|fS )Nr0   r1   namer?   z::z	<unknown>function)opre   rR   r5   r   )r]   r^   r7   rT   rR   rA   get_current_scopespanstart_child
start_spanrZ   set_datar   )rW   rb   rc   r0   r1   re   r?   sentry_span_namekwargsscopeparent_sentry_spansentry_spanr5   r;   s                 r   on_new_spanzRustTracingLayer.on_new_span   s   
5!!99Z,,)) 	4ll=11||F##))I&&&$)9"-7777#* $k
 
 ,.."Z 	58,8BB6BBKK*%*44V44Kh++ 	G 	GE++-- G$$UEIIe,<,<====$$U,EFFFF 
"K00r   
span_statec                 p    |d S |\  }}|                                  |t          j                    _        d S rF   )finishrA   rh   ri   )rW   rc   rs   rp   rq   s        r   on_closezRustTracingLayer.on_close   sA    F*4'K.@
$&&+++r   valuesc                     |d S |\  }}t          j        |          }|                                D ]K\  }}|                                 r|                    ||           0|                    |t
                     Ld S rF   )r]   r^   itemsrZ   rl   r   )	rW   rc   rw   rs   _parent_sentry_spanrq   deserialized_valueskeyvalues	            r   	on_recordzRustTracingLayer.on_record   s    F+5(["j00-3355 	E 	EJC++-- E$$S%0000$$S*CDDDD		E 	Er   )r   r   r   rO   rM   strr   r   r   r!   boolr	   rX   rZ   
TraceStatera   rr   rv   r~   r   r   r   rQ   rQ      sh        '8K15= == %#s(^..
= tCH~.45= !)= = = =
 
 
 
 
.c .
 .t . . . .)1 )1s )1z )1 )1 )1 )1VA A A A A A A
E 
Ec 
Ez 
Ed 
E 
E 
E 
E 
E 
Er   rQ   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dS )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initializerrS   rT   rU   c                 l    || _         d| }t          ||||          | _         || j                   d S )Nzauto.function.rust_tracing.)r   rQ   tracing_layer)rW   r   r   rS   rT   rU   rR   s          r   rX   zRustTracingIntegration.__init__  sP     %;z;;-&5K
 
 	D&'''''r   r.   c                      d S rF   r   r   r   r   
setup_oncez!RustTracingIntegration.setup_once  s    r   )r.   N)r   r   r   __doc__rO   rM   r   r   rQ   r   r   r!   r   r	   rX   staticmethodr   r   r   r   r   r      s        	 	" '8K15( (( /0$67( %#s(^..
	( tCH~.45( !)( ( ( ($    \  r   r   )#r   r]   enumr   r   typingr   r   r   r   r	   rA   sentry_sdk.integrationsr
   sentry_sdk.scoper   sentry_sdk.tracingr   
SentrySpansentry_sdk.utilsr   r   r   r!   r,   r   r<   rD   rG   rJ   r   rM   rO   rQ   r   r   r   r   <module>r      s   @          7 7 7 7 7 7 7 7 7 7 7 7 7 7     / / / / / / 4 4 4 4 4 4 1 1 1 1 1 1 6 6 6 6 6 6eHZ0*<=>
    t       t      DcN tCH~    (+c3h +D + + + +$T#s(^     <d38n < < < < <$sCx. T    	'c3h 	'<L 	' 	' 	' 	'gE gE gE gE gE gE gE gET         [          r   