o
    iI                     @  s  U d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dl m!Z!m"Z#m$Z$m%Z&m'Z( d dl)m*Z* d dlm+Z+m,Z,m"Z"m-Z-m.Z.m%Z%m'Z' d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZA erd dlBmCZC d dlDmEZE ddl5mFZF ddlGmHZH zd dlImJZJ W n eKy   dZJY nw e ZLdeMd< e
G dd de'ZNe
G dd  d ZOe
d!d"G d#d$ d$ej"e!ZPdQd)d*ZQdRd.d/ZRe
G d0d1 d1e%ZSG d2d3 d3e%ZTe
G d4d5 d5e$ZUdSd:d;ZVdTd>d?ZWe@ddd!dd@dUdJdKZXdVdLdMZYdWdOdPZZdS )X    )annotationsN)defaultdict)MappingSequence)	dataclassfield)Lock)TYPE_CHECKINGAnyCallablecast)WeakKeyDictionaryWeakValueDictionary)context)Context)Resource)ReadableSpanSpanSpanProcessorTracerTracerProvider)IdGenerator)LinkNonRecordingSpanr   SpanContextSpanKindr   r   )get_current_span)Status
StatusCode)types   )$ATTRIBUTES_EXCEPTION_FINGERPRINT_KEYATTRIBUTES_MESSAGE_KEY'ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEYATTRIBUTES_SAMPLE_RATE_KEYATTRIBUTES_SPAN_TYPE_KEYATTRIBUTES_VALIDATION_ERROR_KEYlog_level_attributes)handle_internal_errorssha256_stringHTTPException)TypeIs   )ExceptionCallback)LogfireConfig)ValidationErrorz9WeakValueDictionary[tuple[int, int], _LogfireWrappedSpan]
OPEN_SPANSc                   @  s   e Zd ZU dZded< ded< eedZded< eedZ	d	ed
< ee
dZded< d/ddZd0ddZddd1dd Zd2d"d#Zd3d$d%Zed4d'd(Zd5d6d,d-Zd.S )7ProxyTracerProviderz\A tracer provider that wraps another internal tracer provider allowing it to be re-assigned.r   providerr/   configdefault_factoryz5WeakKeyDictionary[_ProxyTracer, Callable[[], Tracer]]tracersr   lockzset[str]suppressed_scopesSDKTracerProviderreturnNonec                 C  sR   | j  || _| j D ]
\}}||  qW d    d S 1 s"w   Y  d S N)r8   r3   r7   items
set_tracer)selfr3   tracerfactory rC   ^/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/logfire/_internal/tracer.pyset_providerB   s   "z ProxyTracerProvider.set_providerscopesstrc                 G  sb   | j $ | j| | j D ]\}}|j|v r||  qW d    d S 1 s*w   Y  d S r=   )r8   r9   updater7   r>   instrumenting_module_namer?   )r@   rF   rA   rB   rC   rC   rD   suppress_scopesH   s   
"z#ProxyTracerProvider.suppress_scopesT)is_span_tracerrI   argsr
   rK   boolkwargs_ProxyTracerc                  s\   j ! d fdd}t| |}|j|< |W  d    S 1 s'w   Y  d S )Nr;   r   c                     s*   j v rt S jjg R i S r=   )r9   SuppressedTracerr3   
get_tracerrC   rL   rI   rN   r@   rC   rD   makeX   s   
z,ProxyTracerProvider.get_tracer.<locals>.make)r;   r   )r8   rO   r7   )r@   rI   rK   rL   rN   rS   rA   rC   rR   rD   rQ   O   s   
$zProxyTracerProvider.get_tracerspan_processorc                 C  sT   | j  t| jtr| j| W d    d S W d    d S 1 s#w   Y  d S r=   )r8   
isinstancer3   r:   add_span_processor)r@   rT   rC   rC   rD   rV   b   s   "z&ProxyTracerProvider.add_span_processorc                 C  sR   | j  t| jtr| j  W d    d S W d    d S 1 s"w   Y  d S r=   )r8   rU   r3   r:   shutdownr@   rC   rC   rD   rW   g   s   "zProxyTracerProvider.shutdownr   c                 C  s^   | j " t| jtr| jjW  d    S td| jjiW  d    S 1 s(w   Y  d S )Nzservice.name)	r8   rU   r3   r:   resourcer   creater4   service_namerX   rC   rC   rD   rY   l   s   $zProxyTracerProvider.resource0u  timeout_millisintc                 C  sT   | j  t| jtr| j|W  d    S 	 W d    dS 1 s#w   Y  d S )NT)r8   rU   r3   r:   force_flush)r@   r]   rC   rC   rD   r_   s   s   
$zProxyTracerProvider.force_flushN)r3   r:   r;   r<   )rF   rG   r;   r<   )
rI   rG   rL   r
   rK   rM   rN   r
   r;   rO   )rT   r
   r;   r<   )r;   r<   )r;   r   )r\   )r]   r^   r;   rM   )__name__
__module____qualname____doc____annotations__r   r   r7   r   r8   setr9   rE   rJ   rQ   rV   rW   propertyrY   r_   rC   rC   rC   rD   r2   8   s    
 



r2   c                   @  s6   e Zd ZU edd dZded< dd ZdddZdS )
SpanMetricc                   C     t tS r=   )r   r^   rC   rC   rC   rD   <lambda>}       zSpanMetric.<lambda>r5   z>dict[tuple[tuple[str, otel_types.AttributeValue], ...], float]detailsc                 C  s.   dd | j  D tdd | j  D dS )Nc                 S  s   g | ]\}}t ||d qS ))
attributestotal)dict).0rl   rm   rC   rC   rD   
<listcomp>   s    z#SpanMetric.dump.<locals>.<listcomp>c                 s  s    | ]}|V  qd S r=   rC   )ro   rm   rC   rC   rD   	<genexpr>   s    z"SpanMetric.dump.<locals>.<genexpr>)rk   rm   )rk   r>   sumvaluesrX   rC   rC   rD   dump   s   zSpanMetric.dumprl   'Mapping[str, otel_types.AttributeValue]valuefloatc                 C  s&   t t| }| j|  |7  < d S r=   )tuplesortedr>   rk   )r@   rl   rv   keyrC   rC   rD   	increment   s   zSpanMetric.incrementN)rl   ru   rv   rw   )r`   ra   rb   r   rk   rd   rt   r{   rC   rC   rC   rD   rg   z   s   
 rg   F)eqc                   @  s   e Zd ZU dZded< ded< ded< edd	 d
Zded< dZded< dd ZdLdMddZ	dd Z
dNddZdOdd ZdPd%d&ZdLdQd)d*Z		dRdSd-d.ZdTd/d0ZdUd1d2Z	dLdVd7d8Z			9dWdXd=d>ZdYd@dAZdZdHdIZes|d[dJdKZdS dS )\_LogfireWrappedSpanaf  A span that wraps another span and overrides some behaviors in a logfire-specific way.

    In particular:
    * Stores a reference to itself in `OPEN_SPANS`, used to close open spans when the program exits
    * Adds some logfire-specific tweaks to the exception recording behavior
    * Overrides end() to use a timestamp generator if one was provided
    r   spanzCallable[[], int]ns_timestamp_generatorrM   record_metricsc                   C  rh   r=   )r   rg   rC   rC   rC   rD   ri      rj   z_LogfireWrappedSpan.<lambda>r5   zdict[str, SpanMetric]metricsNExceptionCallback | Noneexception_callbackc                 C  s   | t |  < d S r=   )r1   _open_spans_keyrX   rC   rC   rD   __post_init__      z!_LogfireWrappedSpan.__post_init__end_time
int | Noner;   r<   c              	   C  sv   t % t|  d  | jr | jdtdd | j	 D  W d    n1 s*w   Y  | j
|p7|   d S )Nzlogfire.metricsc                 S  s   i | ]	\}}||  qS rC   )rt   )ro   namemetricrC   rC   rD   
<dictcomp>   s    z+_LogfireWrappedSpan.end.<locals>.<dictcomp>)r(   r1   popr   r   r~   set_attributejsondumpsr>   endr   )r@   r   rC   rC   rD   r      s   z_LogfireWrappedSpan.endc                 C  s   t | j S r=   )r   r~   get_span_contextrX   rC   rC   rD   r         z#_LogfireWrappedSpan._open_spans_keyr   c                 C  
   | j  S r=   )r~   r   rX   rC   rC   rD   r         
z$_LogfireWrappedSpan.get_span_contextrl   ru   c                 C     | j | d S r=   )r~   set_attributes)r@   rl   rC   rC   rD   r      r   z"_LogfireWrappedSpan.set_attributesrz   rG   rv   otel_types.AttributeValuec                 C     | j || d S r=   )r~   r   )r@   rz   rv   rC   rC   rD   r      s   z!_LogfireWrappedSpan.set_attributer   otel_types.Attributesc                 C  s   | j ||S r=   )r~   add_link)r@   r   rl   rC   rC   rD   r      r   z_LogfireWrappedSpan.add_linkr   	timestampc                 C  s   | j |||p
|   d S r=   )r~   	add_eventr   )r@   r   rl   r   rC   rC   rD   r      s   z_LogfireWrappedSpan.add_eventc                 C  r   r=   )r~   update_namer@   r   rC   rC   rD   r      r   z_LogfireWrappedSpan.update_namec                 C  r   r=   )r~   is_recordingrX   rC   rC   rD   r      r   z _LogfireWrappedSpan.is_recordingstatusStatus | StatusCodedescription
str | Nonec                 C  r   r=   )r~   
set_status)r@   r   r   rC   rC   rD   r      s   z_LogfireWrappedSpan.set_statusF	exceptionBaseExceptionescapedc                 C  s(   |p|   }t| j||||| jd d S )Nrl   r   r   callback)r   record_exceptionr~   r   )r@   r   rl   r   r   rC   rC   rD   r      s   
z$_LogfireWrappedSpan.record_exceptionrw   c                 C  sN   |   r| js|dksd S | j| || t|  }r%|||| d S d S )Nzoperation.cost)r   r   r   r{   get_parent_spanincrement_metric)r@   r   rl   rv   parentrC   rC   rD   r      s   z$_LogfireWrappedSpan.increment_metricexc_typetype[BaseException] | None	exc_valueBaseException | None	tracebackr
   c                 C  s0   |   rt|tr| j|dd |   d S d S )NT)r   )r   rU   r   r   r   )r@   r   r   r   rC   rC   rD   __exit__   s
   
z_LogfireWrappedSpan.__exit__c                 C  s   t | j|S r=   )getattrr~   r   rC   rC   rD   __getattr__      z_LogfireWrappedSpan.__getattr__r=   )r   r   r;   r<   )r;   r   )rl   ru   r;   r<   )rz   rG   rv   r   r;   r<   )r   r   rl   r   r;   r<   )NN)r   rG   rl   r   r   r   r;   r<   )r   rG   r;   r<   )r;   rM   )r   r   r   r   r;   r<   )NNF)
r   r   rl   r   r   r   r   rM   r;   r<   )r   rG   rl   ru   rv   rw   r;   r<   )r   r   r   r   r   r
   r;   r<   )r   rG   r;   r
   )r`   ra   rb   rc   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   rC   rC   rC   rD   r}      s<   
 	







r}   r~   r   r;   _LogfireWrappedSpan | Nonec                 C  s   | j o
tt| j S r=   )r   r1   getr   )r~   rC   rC   rD   r      s   r   ctxr   tuple[int, int]c                 C  s   | j | jfS r=   )trace_idspan_id)r   rC   rC   rD   r      r   r   c                   @  sr   e Zd ZU dZded< ded< ded< ded	< d'ddZd(ddZd)ddZdej	dddddfd*d%d&Z
ejZdS )+rO   zJA tracer that wraps another internal tracer allowing it to be re-assigned.rG   rI   r   rA   r2   r3   rM   rK   r;   r^   c                 C  s   t | S r=   )idrX   rC   rC   rD   __hash__     z_ProxyTracer.__hash__otherobjectc                 C  s   || u S r=   rC   )r@   r   rC   rC   rD   __eq__  r   z_ProxyTracer.__eq__r<   c                 C  s
   || _ d S r=   )rA   )r@   rA   rC   rC   rD   r?     r   z_ProxyTracer.set_tracerNTr   r   Context | Nonekindr   rl   r   linksSequence[Link] | None
start_timer   r   set_status_on_exceptionr}   c	              
   C  s   | j j}	|	jj}
t|	jttd f o|	jj}|	jj	}|p|
 }i |p$i }| j
r-d|t< |t| | j||||||||}t| |sctt| j| jdt| jtjj @ d}t||
||dS )Nr~   Fr   r   	is_remotetrace_flags)r   r   r   )r3   r4   advancedr   rU   r   rM   typecollect_in_spansr   rK   r%   
setdefaultr"   rA   
start_spanshould_sampler   	trace_apir   r   r   r   
TraceFlagsr   SAMPLEDr}   )r@   r   r   r   rl   r   r   r   r   r4   r   r   r   r~   rC   rC   rD   r   
  s:   

z_ProxyTracer.start_span)r;   r^   )r   r   r;   rM   )rA   r   r;   r<   )r   rG   r   r   r   r   rl   r   r   r   r   r   r   rM   r   rM   r;   r}   )r`   ra   rb   rc   rd   r   r   r?   r   INTERNALr   	SDKTracerstart_as_current_spanrC   rC   rC   rD   rO      s$   
 



0rO   c                   @  s   e Zd ZddddZejZdS )rP   Nr   rG   r   r   rL   r
   rN   r;   r   c                 O  s   t t| S r=   )r   r   r   )r@   r   r   rL   rN   rC   rC   rD   r   >  s   zSuppressedTracer.start_spanr=   )
r   rG   r   r   rL   r
   rN   r
   r;   r   )r`   ra   rb   r   r   r   rC   rC   rC   rD   rP   =  s    
rP   c                   @  s0   e Zd ZU dZded< ded< 	ddddZdS )PendingSpanProcessora  Span processor that emits an extra pending span for each span as it starts.

    The pending span is emitted by calling `on_end` on the inner `processor`.
    This is intentionally not a `WrapperSpanProcessor` to avoid the default implementations of `on_end`
    and `shutdown`. This processor is expected to contain processors which are already included
    elsewhere in the pipeline where `on_end` and `shutdown` are called normally.
    r   id_generatorr   	processorNr~   r   parent_contextcontext_api.Context | Noner;   r<   c                 C  s   t |tr
t |tsJ | sd S |j}|r|tdvr d S | }t||s+d S t	|j
| j d|jd}i |tdtt|jrG|jjndi}|j}t|j|||j||j|j|j|j|||jd}| j| d S )N)Nr~   Fr   pending_spanr   )r   r   r   rY   rl   eventsr   r   r   r   r   instrumentation_scope)rU   r   r   r   rl   r   r%   r   r   r   r   r   generate_span_idr   r#   r   format_span_idr   r   r   r   rY   r   r   r   r   r   r   on_end)r@   r~   r   rl   real_span_contextspan_contextstart_and_end_timer   rC   rC   rD   on_startV  sN   
	zPendingSpanProcessor.on_startr=   )r~   r   r   r   r;   r<   )r`   ra   rb   rc   rd   r   rC   rC   rC   rD   r   I  s   
 r   r   rl   ru   rM   c                 C  s"   t |}|du p| jt|d kS )zwDetermine if a span should be sampled.

    This is used to sample spans that are not sampled by the OTEL sampler.
    Nl            )get_sample_rate_from_attributesr   round)r   rl   sample_raterC   rC   rD   r     s   r   r   float | Nonec                 C  s   | sd S t d| tS )Nr   )r   r   r$   )rl   rC   rC   rD   r     s   r   r   trace_api.Spanr   r   r   r   r   r   r   r<   c          	      C  sj  ddl m} |  sdS t|r7d|j  krdk r%n n| td n |jdkr6t| | | td n|rEt| | | td |tt	| |i |pOi d}|durmt
 || W d   n1 shw   Y  |jsrdS |j}tdurt|trz|jd	d
}W n ty   | }Y nw | t| ||t< |jr| tt|j | j||||d dS )zMSimilar to the OTEL SDK Span.record_exception method, with our own additions.r-   )ExceptionCallbackHelperNi  i  warnerror)r~   r   event_attributesF)include_url)rl   r   r   )r   r   r   is_starlette_http_exceptionstatus_coder   r'   set_exception_statusr   SDKSpanr(   _record_exceptionr   r0   rU   r   	TypeErrorr   r&   create_issuer!   r)   issue_fingerprint_sourcer   )	r~   r   rl   r   r   r   r   helpererr_jsonrC   rC   rD   r     sH   




r   c                 C  s(   |  tjtj|jj d| d d S )Nz: )r   r   )r   r   r   r   ERROR	__class__r`   )r~   r   rC   rC   rD   r     s   r   TypeIs[HTTPException]c                 C  s$   dt jvrdS ddlm} t| |S )Nzstarlette.exceptionsFr   r*   )sysmodulesstarlette.exceptionsr+   rU   )r   r+   rC   rC   rD   r     s   

r   )r~   r   r;   r   )r   r   r;   r   )r   r   rl   ru   r;   rM   )rl   r   r;   r   )r~   r   r   r   rl   r   r   r   r   rM   r   r   r;   r<   )r~   r   r   r   )r   r   r;   r   )[
__future__r   r   r   collectionsr   collections.abcr   r   dataclassesr   r   	threadingr   typingr	   r
   r   r   weakrefr   r   opentelemetry.tracetracer   opentelemetryr   context_apiopentelemetry.contextr   opentelemetry.sdk.resourcesr   opentelemetry.sdk.tracer   r   r   r   r   r   r   r:   $opentelemetry.sdk.trace.id_generatorr   r   r   r   r   opentelemetry.trace.propagationr   opentelemetry.trace.statusr   r   opentelemetry.utilr   
otel_types	constantsr!   r"   r#   r$   r%   r&   r'   utilsr(   r)   r   r+   typing_extensionsr,   r.   r4   r/   pydanticr0   ImportErrorr1   rd   r2   rg   r}   r   r   rO   rP   r   r   r   r   r   r   rC   rC   rC   rD   <module>   sn    $$	A
d
D
C
	
B	