
    lhv#                        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                        e Zd ZdZdZdZdZdZy)RustTracingLevelTRACEDEBUGINFOWARNERRORN)__name__
__module____qualname__TraceDebugInfoWarnError     v/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/sentry_sdk/integrations/rust_tracing.pyr   r   .   s    EEDDEr   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    VF
&CJFEr   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-   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                     | j                  di       }|j                  d      }t        |j                  d            }| j                  d      }t        |       }||||d}t        j                  |       y )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   sp    yyR(H\\(#F)(,,w*?@Eii	"G&H 	L \*r   c                     t        |        y N)rD   )r-   s    r   process_exceptionrG   s   s
    %r   c                     t        | j                  di       j                  d            }| j                  d      }t        j                  ||       y )Nr0   r+   r?   )r+   r?   )r,   r7   rA   add_breadcrumb)r-   r+   r?   s      r   process_breadcrumbrJ   w   s@    )%))J*C*G*G*PQEii	"GE7;r   r0   c                     t        | j                  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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 rL   )r   r7   r   r!   r#   r   r   r$   r   r   r"   )r0   r+   s     r   default_event_type_mappingrO      s    X\\'23E &&&###	#((*:*?*?@	@***	#))+;+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 rF   )rR   rS   rT   rU   )selfrR   rS   rT   rU   s        r   __init__zRustTracingLayer.__init__   s#     "4&&<#r   r.   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.
        )rU   r   )rW   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 )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    !ZZ.%))*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 )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,)ll=1||F#))I&&$)9"-b7#* $kk
 ,,."ZZ8,88B6BK*%**4V4Kh+ 	GE++-$$UEIIe,<=$$U,EF		G !
"K00r   
span_statec                 f    |y |\  }}|j                          |t        j                         _        y rF   )finishrA   rh   ri   )rW   rc   rs   rp   rq   s        r   on_closezRustTracingLayer.on_close   s3    *4'K.@
$$&+r   valuesc                     |y |\  }}t        j                  |      }|j                         D ]>  \  }}| j                         r|j	                  ||       )|j	                  |t
               @ y rF   )r]   r^   itemsrZ   rl   r   )	rW   rc   rw   rs   _parent_sentry_spanrq   deserialized_valueskeyvalues	            r   	on_recordzRustTracingLayer.on_record   sp    +5(["jj0-335 	EJC++-$$S%0$$S*CD		Er   )r   r   r   rO   rM   strr   r   r   r!   boolr	   rX   rZ   
TraceStatera   rr   rv   r~   r   r   r   rQ   rQ      s     '8K15== %#s(^..
= tCH~.45= !)=
 
.c .
 .t .)1 )1s )1z )1VA A A A
E 
Ec 
Ez 
Ed 
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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initializerrS   rT   rU   c                 f    || _         d| }t        ||||      | _         || j                         y )Nzauto.function.rust_tracing.)r   rQ   tracing_layer)rW   r   r   rS   rT   rU   rR   s          r   rX   zRustTracingIntegration.__init__  s?     %.zl;-&5K
 	D&&'r   c                       y 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  / 4 1 6eHZ0*<=>
t t  DcN tCH~ (+c3h +D +$T#s(^  <d38n < <$sCx. T 	'c3h 	'<L 	'gE gET [  r   