o
    i#                     @   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	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
 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Tuple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   a/home/ubuntu/veenaModal/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   6   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fieldr0   r   r   r   extract_contextsL   s   r7   c                 C   sR   |  di }| d}t| d}|  d}t| }||||d}t| d S )Nr+   targetr"   message)loggerr"   r9   r4   )r2   r(   r7   
sentry_sdkcapture_event)r)   r+   r:   r"   r9   r4   sentry_eventr   r   r   process_event`   s   

r>   c                 C   s   t |  d S N)r>   )r)   r   r   r   process_exceptionr   s   r@   c                 C   s2   t | di d}| d}tj||d d S )Nr+   r"   r9   )r"   r9   )r(   r2   r;   add_breadcrumb)r)   r"   r9   r   r   r   process_breadcrumbv   s   
rB   r+   c                 C   s   t | dt jt jt jfv S Nr"   )r   r2   r   r   r   )r+   r   r   r   default_span_filter}   s
   rD   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 rC   )r   r2   r   r   r   r   r   r    r   r   r   )r+   r"   r   r   r   default_event_type_mapping   s   
rE   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?   )rG   rH   rJ   rL   )selfrG   rH   rJ   rL   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)rL   r
   )rN   r   r   r   _include_tracing_fields   s
   
	z(RustTracingLayer._include_tracing_fieldsr)   _span_state
TraceStatec                 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loadsr2   rH   r   r   r   r@   r    rB   r!   r>   )rN   r)   rQ   deserialized_eventr+   
event_typer   r   r   on_event   s   





zRustTracingLayer.on_eventattrsspan_idc                 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}
|
rZ|
jd
i |}n|	j	d
i |}|d	g }|D ]}| 
 rz|||| qj||t qj||	_|
|fS )Nr+   r,   namer9   z::z	<unknown>function)oprZ   rG   r0   r   )rS   rT   r2   rJ   rG   r;   get_current_scopespanstart_child
start_spanrP   set_datar   )rN   rX   rY   r+   r,   rZ   r9   sentry_span_namekwargsscopeparent_sentry_spansentry_spanr0   r6   r   r   r   on_new_span   s<   




zRustTracingLayer.on_new_span
span_statec                 C   s*   |d u rd S |\}}|   |t _d S r?   )finishr;   r]   r^   )rN   rY   rh   re   rf   r   r   r   on_close   s
   zRustTracingLayer.on_closevaluesc           	      C   sV   |d u rd S |\}}t |}| D ]\}}|  r"||| q||t qd S r?   )rS   rT   itemsrP   ra   r   )	rN   rY   rk   rh   _parent_sentry_spanrf   deserialized_valueskeyvaluer   r   r   	on_record   s   
zRustTracingLayer.on_record)r   r   r   rE   rD   strrO   boolrP   rW   rg   rj   rq   r   r   r   r   rF      s$    
+rF   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]rH   rI   rJ   rK   rL   rM   c                 C   s.   || _ d| }t||||| _|| j d S )Nzauto.function.rust_tracing.)ru   rF   tracing_layer)rN   ru   rv   rH   rJ   rL   rG   r   r   r   rO     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__rE   rD   rr   rO   staticmethodrx   r   r   r   r   rt      s$    
rt   )r)   r*   r#   r*   )r)   r*   r#   N)r+   r*   r#   r   )#ry   rS   enumr   r   typingr   r   r   r   r   r;   sentry_sdk.integrationsr	   sentry_sdk.scoper
   sentry_sdk.tracingr   
SentrySpansentry_sdk.utilsr   rR   r   r   rr   r(   r7   r>   r@   rB   rs   rD   rE   rF   rt   r   r   r   r   <module>   s*     




j