
    tni#                     X   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eddfdZddZddZddZddZdddefdZd 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     a/var/www/html/gpu-tools/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!   levelreturnzsentry_sdk._types.LogLevelStrc                     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   )r&   s    r   tracing_level_to_sentry_levelr-   =   so    U##E!')9)?@@@w	"'	'	'v	"'	'	'y	"(	(	(w vr   eventDict[str, Any]c                 (   |                      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.   r1   contextslocationfieldr6   s         r   extract_contextsr=   L   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 )Nr1   targetr&   message)loggerr&   r@   r:   )r8   r-   r=   
sentry_sdkcapture_event)r.   r1   rA   r&   r@   r:   sentry_events          r   process_eventrE   `   s    yyR((H\\(##F)(,,w*?*?@@E',yy';';G&&H 	/ /L \*****r   c                 $    t          |            d S N)rE   )r.   s    r   process_exceptionrH   r   s    %r   c                     t          |                     di                               d                    }|                     d          }t          j        ||           d S )Nr1   r&   r@   )r&   r@   )r-   r8   rB   add_breadcrumb)r.   r&   r@   s      r   process_breadcrumbrK   v   sX    )%))J*C*C*G*G*P*PQQEii	""GE7;;;;;;r   r1   c                     t          |                     d                    t           j        t           j        t           j        fv S Nr&   )r   r8   r   r   r   )r1   s    r   default_span_filterrN   }   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 rM   )r   r8   r   r!   r#   r   r   r$   r   r   r"   )r1   r&   s     r   default_event_type_mappingrP      s~    X\\'2233E &&&##	#(*:*?@	@	@**	#)+;+AB	B	B&&&&r   c            	           e Zd Zeedfdeddddddfd	Zd
efdZdeddd
dfdZ	deded
dfdZ
deddd
dfdZdededdd
dfdZdS )RustTracingLayerNoriginevent_type_mappingBCallable[
            [Dict[str, Any]], EventTypeMapping
        ]span_filter Callable[[Dict[str, Any]], bool]include_tracing_fieldsOptional[bool]c                 >    || _         || _        || _        || _        d S rG   )rS   rT   rV   rX   )selfrS   rT   rV   rX   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.
        )rX   r   )r[   s    r   _include_tracing_fieldsz(RustTracingLayer._include_tracing_fields   s&     *2 $%%%,	
r   r.   _span_state
TraceStatec                 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 )Nr1   )jsonloadsr8   rT   r!   r"   r#   rH   r$   rK   r%   rE   )r[   r.   r_   deserialized_eventr1   
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 )Nr1   r2   namer@   z::z	<unknown>function)oprj   rS   r6   r   )rb   rc   r8   rV   rS   rB   get_current_scopespanstart_child
start_spanr^   set_datar   )r[   rg   rh   r1   r2   rj   r@   sentry_span_namekwargsscopeparent_sentry_spansentry_spanr6   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 rG   )finishrB   rm   rn   )r[   rh   rx   ru   rv   s        r   on_closezRustTracingLayer.on_close   sA    F*4'K.@
$&&+++r   valuesc                     |d S |\  }}t          j        |          }|                                D ]K\  }}|                                 r|                    ||           0|                    |t
                     Ld S rG   )rb   rc   itemsr^   rq   r   )	r[   rh   r|   rx   _parent_sentry_spanrv   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   rP   rN   strr\   boolr^   rf   rw   r{   r   r   r   r   rR   rR      s7        *:M37= === 8= !1= = = =
 
 
 
 
.c . . . . . .)1 )1s )1| )1 )1 )1 )1VA A A$ A A A A
E 
Ec 
E| 
EPT 
E 
E 
E 
E 
E 
Er   rR   c                   N    e Zd ZdZeedfdedddddd	d
d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initializerz"Callable[[RustTracingLayer], None]rT   rU   rV   rW   rX   rY   c                 l    || _         d| }t          ||||          | _         || j                   d S )Nzauto.function.rust_tracing.)r   rR   tracing_layer)r[   r   r   rT   rV   rX   rS   s          r   r\   zRustTracingIntegration.__init__  sP     %;z;;-&5K
 
 	D&'''''r   r'   c                      d S rG   r   r   r   r   
setup_oncez!RustTracingIntegration.setup_once  s    r   )r'   N)
r   r   r   __doc__rP   rN   r   r\   staticmethodr   r   r   r   r   r      s        	 	" *:M37( (( :(	( 8( !1( ( ( ($    \  r   r   )r.   r/   r'   r/   )r.   r/   r'   N)r1   r/   r'   r!   )#r   rb   enumr   r   typingr   r   r   r   r	   rB   sentry_sdk.integrationsr
   sentry_sdk.scoper   sentry_sdk.tracingr   
SentrySpansentry_sdk.utilsr   r`   r   r!   r   r-   r=   rE   rH   rK   r   rN   rP   rR   r   r   r   r   <module>r      s5   @          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    1P       (+ + + +$   < < < <"2 t    	' 	' 	' 	'gE gE gE gE gE gE gE gET         [          r   