o
    ai!                     @   s  d Z ddlZddlmZmZ ddl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 G d	d
 d
eZG dd deZdeddfddZd%ddZd&ddZd&ddZd&ddZdddefddZd'dd ZG d!d" d"ZG d#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Optional)Integration)should_send_default_pii)Span)SENSITIVE_DATA_SUBSTITUTEc                   @   s    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 r   r   b/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/sentry_sdk/integrations/rust_tracing.pyr   ,   s    r   c                   @   s$   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   4   s
    
r   levelreturnzsentry_sdk._types.LogLevelStrc                 C   sJ   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!   r   r   r   tracing_level_to_sentry_level;   s   


r'   eventDict[str, Any]c                 C   s   |  di }i }i }dD ]}||v r|| ||< qt|dkr#||d< i }| dg D ]	}|  |||< q+t|dkr?||d< |S )Nmetadata)module_pathfileliner   rust_tracing_locationfieldsrust_tracing_fields)getlen)r(   r*   contextslocationfieldr/   r   r   r   extract_contextsJ   s   r6   c                 C   sR   |  di }| d}t| d}|  d}t| }||||d}t| d S )Nr*   targetr!   message)loggerr!   r8   r3   )r1   r'   r6   
sentry_sdkcapture_event)r(   r*   r9   r!   r8   r3   sentry_eventr   r   r   process_event^   s   

r=   c                 C   s   t |  d S N)r=   )r(   r   r   r   process_exceptionp   s   r?   c                 C   s2   t | di d}| d}tj||d d S )Nr*   r!   r8   )r!   r8   )r'   r1   r:   add_breadcrumb)r(   r!   r8   r   r   r   process_breadcrumbt   s   
rA   r*   c                 C   s   t | dt jt jt jfv S Nr!   )r   r1   r   r   r   )r*   r   r   r   default_span_filter{   s
   rC   c                 C   sP   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 rB   )r   r1   r   r   r   r   r   r   r   r   r   )r*   r!   r   r   r   default_event_type_mapping   s   
rD   c                	   @   s   e Zd Zeedfdeddddddfd	d
ZdefddZdeddddfddZ	dededdfddZ
deddddfddZdededdddfd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                 C   s   || _ || _|| _|| _d S r>   )rF   rG   rI   rK   )selfrF   rG   rI   rK   r   r   r   __init__   s   	
zRustTracingLayer.__init__r"   c                 C   s   | j du r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.
        N)rK   r	   )rM   r   r   r   _include_tracing_fields   s
   
	z(RustTracingLayer._include_tracing_fieldsr(   sentry_span
SentrySpanc                 C   st   t |}|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r8t| d S d S )Nr*   )jsonloadsr1   rG   r   r   r   r?   r   rA   r    r=   )rM   r(   rP   deserialized_eventr*   
event_typer   r   r   on_event   s   





zRustTracingLayer.on_eventattrsspan_idzOptional[SentrySpan]c                 C   s   t |}|di }| |sd S |d}|d}|d}|d ur(|}n|d ur8|d ur8| d| }n	|d ur?|}nd}d|| jd}tjd
i |}	|d	g }
|
D ]}|  rh|	||| qX|	|t	 qX|	
  |	S )Nr*   r+   namer8   z::z	<unknown>function)oprY   rF   r/   r   )rR   rS   r1   rI   rF   r:   
start_spanrO   set_datar   	__enter__)rM   rW   rX   r*   r+   rY   r8   sentry_span_namekwargsrP   r/   r5   r   r   r   on_new_span   s4   




zRustTracingLayer.on_new_spanc                 C   s   |d u rd S | d d d  d S r>   )__exit__)rM   rX   rP   r   r   r   on_close   s   zRustTracingLayer.on_closevaluesc                 C   sN   |d u rd S t |}| D ]\}}|  r||| q||t qd S r>   )rR   rS   itemsrO   r]   r   )rM   rX   rd   rP   deserialized_valueskeyvaluer   r   r   	on_record   s   
zRustTracingLayer.on_record)r   r   r   rD   rC   strrN   boolrO   rV   ra   rc   ri   r   r   r   r   rE      s$    
%rE   c                   @   sD   e Zd ZdZeedfdedddddd	d
df
ddZed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]rG   rH   rI   rJ   rK   rL   c                 C   s.   || _ d| }t||||| _|| j d S )Nzauto.function.rust_tracing.)rm   rE   tracing_layer)rM   rm   rn   rG   rI   rK   rF   r   r   r   rN      s   

zRustTracingIntegration.__init__r"   c                   C   s   d S r>   r   r   r   r   r   
setup_once  s   z!RustTracingIntegration.setup_once)r"   N)
r   r   r   __doc__rD   rC   rj   rN   staticmethodrp   r   r   r   r   rl      s$    
rl   )r(   r)   r"   r)   )r(   r)   r"   N)r*   r)   r"   r   )!rq   rR   enumr   r   typingr   r   r   r   r:   sentry_sdk.integrationsr   sentry_sdk.scoper	   sentry_sdk.tracingr
   rQ   sentry_sdk.utilsr   r   r   rj   r'   r6   r=   r?   rA   rk   rC   rD   rE   rl   r   r   r   r   <module>   s(     




a